async def make_p2pd_pair_unix(
    daemon_executable: str,
    enable_control: bool,
    enable_connmgr: bool,
    enable_dht: bool,
    enable_pubsub: bool,
) -> AsyncIterator[DaemonTuple]:
    name = str(uuid.uuid4())[:8]
    control_maddr = Multiaddr(f"/unix/tmp/test_p2pd_control_{name}.sock")
    listen_maddr = Multiaddr(f"/unix/tmp/test_p2pd_listen_{name}.sock")
    # Remove the existing unix socket files if they are existing
    try:
        os.unlink(control_maddr.value_for_protocol(protocols.P_UNIX))
    except FileNotFoundError:
        pass
    try:
        os.unlink(listen_maddr.value_for_protocol(protocols.P_UNIX))
    except FileNotFoundError:
        pass
    async with make_p2pd_pair(
            daemon_executable=daemon_executable,
            control_maddr=control_maddr,
            listen_maddr=listen_maddr,
            enable_control=enable_control,
            enable_connmgr=enable_connmgr,
            enable_dht=enable_dht,
            enable_pubsub=enable_pubsub,
    ) as pair:
        yield pair
示例#2
0
async def make_p2pd_pair_ip4(
        id_generator, enable_control, enable_connmgr, enable_dht, enable_pubsub):
    control_maddr = Multiaddr(f"/ip4/127.0.0.1/tcp/{id_generator()}")
    listen_maddr = Multiaddr(f"/ip4/127.0.0.1/tcp/{id_generator()}")
    return await _make_p2pd_pair(
        control_maddr=control_maddr,
        listen_maddr=listen_maddr,
        enable_control=enable_control,
        enable_connmgr=enable_connmgr,
        enable_dht=enable_dht,
        enable_pubsub=enable_pubsub,
    )
示例#3
0
async def make_p2pd_pair_ip4(enable_control, enable_connmgr, enable_dht, enable_pubsub):
    control_maddr = Multiaddr(f"/ip4/127.0.0.1/tcp/{find_open_port()}")
    listen_maddr = Multiaddr(f"/ip4/127.0.0.1/tcp/{find_open_port()}")
    async with _make_p2pd_pair(
            control_maddr=control_maddr,
            listen_maddr=listen_maddr,
            enable_control=enable_control,
            enable_connmgr=enable_connmgr,
            enable_dht=enable_dht,
            enable_pubsub=enable_pubsub,
    ) as pair:
        yield pair
示例#4
0
 def _initialize(self, proc_args: List[str]) -> None:
     proc_args = deepcopy(proc_args)
     proc_args.extend(self._make_process_args(
         hostAddrs=f'/ip4/0.0.0.0/tcp/{self._host_port},/ip4/0.0.0.0/udp/{self._host_port}/quic',
         listen=f'/ip4/127.0.0.1/tcp/{self._daemon_listen_port}'
     ))
     self._child = Popen(args=proc_args, encoding="utf8")
     self._alive = True
     self._client_listen_port = find_open_port()
     self._client = p2pclient.Client(
         Multiaddr(f'/ip4/127.0.0.1/tcp/{self._daemon_listen_port}'),
         Multiaddr(f'/ip4/127.0.0.1/tcp/{self._client_listen_port}'))
示例#5
0
async def test_swarm_multiaddr(is_host_secure):
    swarms = await SwarmFactory.create_batch_and_listen(is_host_secure, 3)

    def clear():
        swarms[0].peerstore.clear_addrs(swarms[1].get_peer_id())

    clear()
    # No addresses
    with pytest.raises(SwarmException):
        await swarms[0].dial_peer(swarms[1].get_peer_id())

    clear()
    # Wrong addresses
    swarms[0].peerstore.add_addrs(swarms[1].get_peer_id(),
                                  [Multiaddr("/ip4/0.0.0.0/tcp/9999")], 10000)

    with pytest.raises(SwarmException):
        await swarms[0].dial_peer(swarms[1].get_peer_id())

    clear()
    # Multiple wrong addresses
    swarms[0].peerstore.add_addrs(
        swarms[1].get_peer_id(),
        [
            Multiaddr("/ip4/0.0.0.0/tcp/9999"),
            Multiaddr("/ip4/0.0.0.0/tcp/9998")
        ],
        10000,
    )

    with pytest.raises(SwarmException):
        await swarms[0].dial_peer(swarms[1].get_peer_id())

    # Test one address
    addrs = tuple(addr for transport in swarms[1].listeners.values()
                  for addr in transport.get_addrs())

    swarms[0].peerstore.add_addrs(swarms[1].get_peer_id(), addrs[:1], 10000)
    await swarms[0].dial_peer(swarms[1].get_peer_id())

    # Test multiple addresses
    addrs = tuple(addr for transport in swarms[1].listeners.values()
                  for addr in transport.get_addrs())

    swarms[0].peerstore.add_addrs(swarms[1].get_peer_id(), addrs + addrs,
                                  10000)
    await swarms[0].dial_peer(swarms[1].get_peer_id())

    for swarm in swarms:
        await swarm.close()
示例#6
0
 def from_parser_args(cls, args: argparse.Namespace,
                      trinity_config: TrinityConfig) -> 'BaseAppConfig':
     """
     Initialize from the namespace object produced by
     an ``argparse.ArgumentParser`` and the :class:`~trinity.config.TrinityConfig`
     """
     if args is not None:
         # This is quick and dirty way to get bootstrap_nodes
         trinity_config.bootstrap_nodes = tuple(
             Multiaddr(maddr) for maddr in args.bootstrap_nodes.split(
                 ',')) if args.bootstrap_nodes is not None else tuple()
         trinity_config.preferred_nodes = tuple(
             Multiaddr(maddr) for maddr in args.preferred_nodes.split(
                 ',')) if args.preferred_nodes is not None else tuple()
     return cls(trinity_config)
示例#7
0
async def test_tcp_dial(nursery):
    transport = TCP()
    raw_conn_other_side = None
    event = trio.Event()

    async def handler(tcp_stream):
        nonlocal raw_conn_other_side
        raw_conn_other_side = RawConnection(tcp_stream, False)
        event.set()
        await trio.sleep_forever()

    # Test: `OpenConnectionError` is raised when trying to dial to a port which
    #   no one is not listening to.
    with pytest.raises(OpenConnectionError):
        await transport.dial(Multiaddr("/ip4/127.0.0.1/tcp/1"))

    listener = transport.create_listener(handler)
    await listener.listen(LISTEN_MADDR, nursery)
    addrs = listener.get_addrs()
    assert len(addrs) == 1
    listen_addr = addrs[0]
    raw_conn = await transport.dial(listen_addr)
    await event.wait()

    data = b"123"
    await raw_conn_other_side.write(data)
    assert (await raw_conn.read(len(data))) == data
示例#8
0
    def _factory(seed, block_pool):
        key_pair = node_key_pair(seed)
        peer_id = node_peer_id(key_pair)
        listen_maddr = Multiaddr(
            f"/ip4/127.0.0.1/tcp/13{ord(seed[:1]) % 1000}/p2p/{peer_id}"
        )

        def _block_by_slot(slot):
            for block in block_pool:
                if block.slot == slot:
                    return block
            return None

        def _block_by_root(root):
            for block in block_pool:
                if block.message.hash_tree_root == root:
                    return block
            return None

        host = Host(
            key_pair,
            peer_id,
            _null_peer_updates,
            lambda: Status.create(),
            lambda _epoch: genesis_block.hash_tree_root,
            _block_by_slot,
            _block_by_root,
            lambda: MetaData.create(seq_number=SeqNumber(ord(seed[:1]))),
            lambda: ForkDigest(b"\x00\x00\x00\x00"),
            eth2_config,
        )

        return host, listen_maddr
示例#9
0
def main():
    (opts, args) = parse_opts()

    maddr = Multiaddr('/ip4/{}/tcp/{}/http'.format(opts.host, opts.port))
    ip = IpfsPinner(maddr)

    # by default use STDIN
    hashes_input = sys.stdin
    if opts.input:
        with open(opts.input) as f:
            hashes_input = f.readlines()

    hashes = [rhash.rstrip() for rhash in hashes_input]

    states_counter = []

    for chash in hashes:
        state, statuses = ip.is_pinned(chash)
        print('{} - STATUS: {}'.format(chash, statuses))

        if opts.action == 'pin' and state != 'pinned':
            ip.pin(chash)
            state = 'pinning'
            print('{} - PINNING'.format(chash))
        elif opts.action == 'unpin' and state in [
                'pinned', 'pinning', 'pin_queue'
        ]:
            ip.unpin(chash)
            state = 'unpinning'
            print('{} - UNPINNING'.format(chash))

        states_counter.append(state)

    print('States: {}'.format(dict(Counter(states_counter))))
示例#10
0
 def from_pb(cls, pb_msg: p2pd_pb2.StreamInfo) -> 'StreamInfo':
     stream_info = cls(
         peer_id=PeerID(pb_msg.peer),
         addr=Multiaddr(binascii.hexlify(pb_msg.addr)),
         proto=pb_msg.proto,
     )
     return stream_info
示例#11
0
 def __init__(self,
              daemon_connector: DaemonConnector,
              listen_maddr: Multiaddr = None) -> None:
     if listen_maddr is None:
         listen_maddr = Multiaddr(config.listen_maddr_str)
     self.listen_maddr = listen_maddr
     self.daemon_connector = daemon_connector
     self.handlers = {}
示例#12
0
 def connect(self, peer):
     req = Request()
     req.type = Request.CONNECT
     req.connect.peer = bitcoin.base58.decode(peer['id'])
     req.connect.addrs.extend(
         [Multiaddr(addr).to_bytes() for addr in peer['addrs']])
     req.connect.timeout = 100
     return self.__send_request(req, Response)
示例#13
0
 def identify(self):
     req = Request()
     req.type = Request.IDENTIFY
     resp = self.__send_request(req, Response)
     return {
         'id': bitcoin.base58.encode(resp.identify.id),
         'addrs':
         [str(Multiaddr(addr)) for addr in resp.identify.addrs[1:]]
     }
示例#14
0
async def make_p2pd_pair_ip4(
    daemon_executable: str,
    enable_control: bool,
    enable_connmgr: bool,
    enable_dht: bool,
    enable_pubsub: bool,
) -> AsyncIterator[DaemonTuple]:
    control_maddr = Multiaddr(f"/ip4/127.0.0.1/tcp/{get_unused_tcp_port()}")
    listen_maddr = Multiaddr(f"/ip4/127.0.0.1/tcp/{get_unused_tcp_port()}")
    async with make_p2pd_pair(
            daemon_executable=daemon_executable,
            control_maddr=control_maddr,
            listen_maddr=listen_maddr,
            enable_control=enable_control,
            enable_connmgr=enable_connmgr,
            enable_dht=enable_dht,
            enable_pubsub=enable_pubsub,
    ) as pair:
        yield pair
示例#15
0
    async def replicate(cls, daemon_listen_port: int, host_port: int):
        """
        Connect to existing p2p daemon
        :param daemon_listen_port: port for connection daemon and client binding
        :param host_port: port for p2p network
        :return: new wrapper for existing p2p daemon
        """

        self = cls()
        # There is no child under control
        # Use external already running p2pd
        self._child = None
        self._alive = True
        self._assign_daemon_ports(host_port, daemon_listen_port)
        self._client_listen_port = find_open_port()
        self._client = p2pclient.Client(
            Multiaddr(f'/ip4/127.0.0.1/tcp/{self._daemon_listen_port}'),
            Multiaddr(f'/ip4/127.0.0.1/tcp/{self._client_listen_port}'))
        await self._wait_for_client()
        return self
示例#16
0
def create_kad_peerinfo(raw_node_id=None, sender_ip=None, sender_port=None):
    node_id = ID(raw_node_id) if raw_node_id else ID(
        digest(random.getrandbits(255)))
    peer_data = None
    if sender_ip and sender_port:
        peer_data = PeerData()  #pylint: disable=no-value-for-parameter
        addr = [Multiaddr("/"+ P_IP +"/" + str(sender_ip) + "/"\
                + P_UDP + "/" + str(sender_port))]
        peer_data.add_addrs(addr)

    return KadPeerInfo(node_id, peer_data)
async def test_client_connect_failure(p2pcs):
    peer_id_1, maddrs_1 = await p2pcs[1].identify()
    await p2pcs[0].identify()
    # test case: `peer_id` mismatches
    with pytest.raises(ControlFailure):
        await p2pcs[0].connect(PEER_ID_RANDOM, maddrs_1)
    # test case: empty maddrs
    with pytest.raises(ControlFailure):
        await p2pcs[0].connect(peer_id_1, [])
    # test case: wrong maddrs
    with pytest.raises(ControlFailure):
        await p2pcs[0].connect(peer_id_1, [Multiaddr("/ip4/127.0.0.1/udp/0")])
示例#18
0
def _get_peer_info(node: TDaemonOrHost) -> PeerInfo:
    peer_info: PeerInfo
    if isinstance(node, Daemon):
        peer_info = node.peer_info
    else:  # isinstance(node, IHost)
        peer_id = node.get_id()
        maddrs = [
            node.get_addrs()[0].decapsulate(
                Multiaddr(f"/p2p/{peer_id.to_string()}"))
        ]
        peer_info = PeerInfo(peer_id, maddrs)
    return peer_info
示例#19
0
async def make_p2pd(
    daemon_control_port: int,
    client_callback_port: int,
    security_protocol: TProtocol,
    is_pubsub_enabled: bool = True,
    is_gossipsub: bool = True,
    is_pubsub_signing: bool = False,
    is_pubsub_signing_strict: bool = False,
) -> AsyncIterator[Daemon]:
    control_maddr = Multiaddr(f"/ip4/{LOCALHOST_IP}/tcp/{daemon_control_port}")
    p2pd_proc = P2PDProcess(
        control_maddr,
        security_protocol,
        is_pubsub_enabled,
        is_gossipsub,
        is_pubsub_signing,
        is_pubsub_signing_strict,
    )
    await p2pd_proc.start()
    client_callback_maddr = Multiaddr(
        f"/ip4/{LOCALHOST_IP}/tcp/{client_callback_port}")
    p2pc = Client(control_maddr, client_callback_maddr)

    async with p2pc.listen():
        peer_id, maddrs = await p2pc.identify()
        listen_maddr: Multiaddr = None
        for maddr in maddrs:
            try:
                ip = maddr.value_for_protocol(multiaddr.protocols.P_IP4)
                # NOTE: Check if this `maddr` uses `tcp`.
                maddr.value_for_protocol(multiaddr.protocols.P_TCP)
            except multiaddr.exceptions.ProtocolLookupError:
                continue
            if ip == LOCALHOST_IP:
                listen_maddr = maddr
                break
        assert listen_maddr is not None, "no loopback maddr is found"
        peer_info = info_from_p2p_addr(
            listen_maddr.encapsulate(Multiaddr(f"/p2p/{peer_id.to_string()}")))
        yield Daemon(p2pd_proc, p2pc, peer_info)
示例#20
0
def create_kad_peerinfo(node_id_bytes=None, sender_ip=None, sender_port=None):
    node_id = (ID(node_id_bytes) if node_id_bytes else ID(
        digest(random.getrandbits(255))))
    addrs: List[Multiaddr]
    if sender_ip and sender_port:
        addrs = [
            Multiaddr("/" + P_IP + "/" + str(sender_ip) + "/" + P_UDP + "/" +
                      str(sender_port))
        ]
    else:
        addrs = []

    return KadPeerInfo(node_id, addrs)
示例#21
0
async def make_p2pd_pair_unix(
        id_generator, enable_control, enable_connmgr, enable_dht, enable_pubsub):
    socket_id = id_generator()
    control_maddr = Multiaddr(f"/unix/tmp/test_p2pd_control_{socket_id}.sock")
    listen_maddr = Multiaddr(f"/unix/tmp/test_p2pd_listen_{socket_id}.sock")
    # remove the existing unix socket files if they are existing
    try:
        os.unlink(control_maddr.value_for_protocol(protocols.P_UNIX))
    except FileNotFoundError:
        pass
    try:
        os.unlink(listen_maddr.value_for_protocol(protocols.P_UNIX))
    except FileNotFoundError:
        pass
    return await _make_p2pd_pair(
        control_maddr=control_maddr,
        listen_maddr=listen_maddr,
        enable_control=enable_control,
        enable_connmgr=enable_connmgr,
        enable_dht=enable_dht,
        enable_pubsub=enable_pubsub,
    )
示例#22
0
async def test_control_client_connect_failure(peer_id_random, p2pds):
    c0, c1 = p2pds[0].control, p2pds[1].control
    peer_id_1, maddrs_1 = await c1.identify()
    await c0.identify()
    # test case: `peer_id` mismatches
    with pytest.raises(ControlFailure):
        await c0.connect(peer_id_random, maddrs_1)
    # test case: empty maddrs
    with pytest.raises(ControlFailure):
        await c0.connect(peer_id_1, [])
    # test case: wrong maddrs
    with pytest.raises(ControlFailure):
        await c0.connect(peer_id_1, [Multiaddr("/ip4/127.0.0.1/udp/0")])
示例#23
0
def test_transform_cbor_to_dict_with_multiaddr():
    addr1 = Multiaddr('/ip4/127.0.0.1/udp/1234')
    addr2 = Multiaddr('/ipfs/Qmafmh1Cw3H1bwdYpaaj5AbCW4LkYyUWaM7Nykpn5NZoYL')

    src = dumps({
        'data': 'hello world',
        'size': 11,
        'l1': Tag(LINK_TAG, addr1.to_bytes()),
        'l2': Tag(LINK_TAG, addr2.to_bytes()),
    }, sort_keys=True)

    expected = {
        'data': 'hello world',
        'size': 11,
        'l1': {
            '/': str(addr1),
        },
        'l2': {
            '/': str(addr2),
        }
    }

    assert unmarshal(src) == expected
示例#24
0
 def peer_info(self) -> None:
     if self._peer_info is not None:
         return self._peer_info
     if not self.event_ready.is_set():
         raise Exception("process is not ready yet. failed to parse the peer info")
     # Example:
     # b"I am /ip4/127.0.0.1/tcp/56171/ipfs/QmU41TRPs34WWqa1brJEojBLYZKrrBcJq9nyNfVvSrbZUJ\n"
     m = re.search(br"I am ([\w\./]+)", self.bytes_read)
     if m is None:
         raise Exception("failed to find the pattern for the listening multiaddr")
     maddr_bytes_str_ipfs = m.group(1)
     maddr_str = maddr_bytes_str_ipfs.decode().replace("ipfs", "p2p")
     maddr = Multiaddr(maddr_str)
     self._peer_info = info_from_p2p_addr(maddr)
     return self._peer_info
示例#25
0
def multiAddrTcp4(maddr):
    ipaddr, port = None, 0

    try:
        multi = Multiaddr(maddr)
    except BaseException:
        return ipaddr, port

    for proto in multi.protocols():
        if proto.name == 'ip4':
            ipaddr = multi.value_for_protocol(proto.code)
        if proto.name == 'tcp':
            port = int(multi.value_for_protocol(proto.code))

    return ipaddr, port
示例#26
0
def multiAddrTcp4(maddr):
    ipaddr, port = None, 0

    try:
        multi = Multiaddr(maddr)
    except BaseException as err:
        log.debug(f'Invalid multiaddr {maddr}, error: {err}')
        return ipaddr, port

    for proto in multi.protocols():
        if proto.name == 'ip4':
            ipaddr = multi.value_for_protocol(proto.code)
        if proto.name == 'tcp':
            port = int(multi.value_for_protocol(proto.code))

    return ipaddr, port
示例#27
0
    async def identify(self) -> Tuple[ID, Tuple[Multiaddr, ...]]:
        stream = await self.daemon_connector.open_connection()
        req = p2pd_pb.Request(type=p2pd_pb.Request.IDENTIFY)
        await write_pbmsg(stream, req)

        resp = p2pd_pb.Response()
        await read_pbmsg_safe(stream, resp)
        await stream.close()
        raise_if_failed(resp)
        peer_id_bytes = resp.identify.id
        maddrs_bytes = resp.identify.addrs

        maddrs = tuple(Multiaddr(maddr_bytes) for maddr_bytes in maddrs_bytes)
        peer_id = ID(peer_id_bytes)

        return peer_id, maddrs
示例#28
0
async def make_echo_proc(
    proc_factory, port: int, is_secure: bool, destination: Multiaddr = None
):
    args = [f"-l={port}"]
    if not is_secure:
        args.append("-insecure")
    if destination is not None:
        args.append(f"-d={str(destination)}")
    echo_proc = proc_factory(str(ECHO_PATH), args)
    await echo_proc.expect(r"I am ([\w\./]+)" + PEXPECT_NEW_LINE, async_=True)
    maddr_str_ipfs = echo_proc.match.group(1)
    maddr_str = maddr_str_ipfs.replace("ipfs", "p2p")
    maddr = Multiaddr(maddr_str)
    go_pinfo = info_from_p2p_addr(maddr)
    if destination is None:
        await echo_proc.expect("listening for connections", async_=True)
    return echo_proc, go_pinfo
示例#29
0
    def transform(di):
        for k, v in di.items():
            if isinstance(v, dict):
                di[k] = transform(v)

        if LINK_SYMBOL in di:
            link = di.pop(LINK_SYMBOL)

            try:
                link = Multiaddr(link).to_bytes()
            except ValueError:
                pass

            if di:
                raise KeyError('Links must not have siblings')
            return Tag(LINK_TAG, link)
        return di
示例#30
0
    def __init__(self, url: str = "http://localhost", port: int = 5001):
        http_protocol, host = url.split('://')

        if http_protocol not in ('http', 'https'):
            raise ValueError(f"Invalid protocol: {http_protocol}")
        if not isinstance(host, str):
            ValueError(f"Invalid url: {url}")

        try:
            # method returns either IPv4Address or IPv6Address (or raises ValueError)
            addr = ipaddress.ip_address(host)
            ip_protocol = 'ip4' if isinstance(addr,
                                              ipaddress.IPv4Address) else 'ip6'
        except ValueError:
            ip_protocol = 'dns'

        addr = Multiaddr(f"/{ip_protocol}/{host}/tcp/{port}/{http_protocol}")
        self._client = ipfshttpclient.connect(addr)