Ejemplo n.º 1
0
 def run_local_peer(peer_list):
     inv_collector = InvCollector()
     for peer in peer_list:
         inv_collector.add_peer(peer)
     r = []
     inv_item_q = inv_collector.new_inv_item_queue()
     while len(r) < 10:
         inv_item = yield from inv_item_q.get()
         v = yield from inv_collector.fetch(inv_item)
         r.append(v)
     return r
Ejemplo n.º 2
0
 def run_client(peer_list, tx_list):
     tx_store = {}
     inv_collector = InvCollector()
     tx_handler = TxHandler(inv_collector, tx_store)
     for tx in tx_list:
         tx_handler.add_tx(tx)
     for peer in peer_list:
         inv_collector.add_peer(peer)
         tx_handler.add_peer(peer)
     while len(tx_store) < 20:
         yield from asyncio.sleep(0.1)
     return tx_store
Ejemplo n.º 3
0
 def run_client(peer_list, tx_list):
     tx_store = {}
     inv_collector = InvCollector()
     tx_handler = TxHandler(inv_collector, tx_store)
     for tx in tx_list:
         tx_handler.add_tx(tx)
     for peer in peer_list:
         inv_collector.add_peer(peer)
         tx_handler.add_peer(peer)
     while len(tx_store) < 20:
         yield from asyncio.sleep(0.1)
     return tx_store
 def run_client(peer_list, block_list):
     block_chain = BlockChain()
     block_store = {}
     inv_collector = InvCollector()
     block_handler = BlockHandler(inv_collector, block_chain, block_store)
     for peer in peer_list:
         inv_collector.add_peer(peer)
         block_handler.add_peer(peer)
     for block in block_list:
         inv_collector.advertise_item(InvItem(ITEM_TYPE_BLOCK, block.hash()))
         block_store[block.hash()] = block
     while len(block_store) < 2:
         yield from asyncio.sleep(0.1)
     return block_store
Ejemplo n.º 5
0
 def run_client(peer_list, block_list):
     block_chain = BlockChain()
     block_store = {}
     inv_collector = InvCollector()
     block_handler = BlockHandler(inv_collector, block_chain, block_store)
     for peer in peer_list:
         inv_collector.add_peer(peer)
         block_handler.add_peer(peer)
     for block in block_list:
         inv_collector.advertise_item(InvItem(ITEM_TYPE_BLOCK,
                                              block.hash()))
         block_store[block.hash()] = block
     while len(block_store) < 2:
         yield from asyncio.sleep(0.1)
     return block_store
Ejemplo n.º 6
0
 def run_local_peer(peer_list):
     inv_collector = InvCollector()
     for peer in peer_list:
         inv_collector.add_peer(peer)
     r = []
     inv_item_q = inv_collector.new_inv_item_queue()
     while len(r) < 5:
         yield from asyncio.sleep(0.1)
         inv_item = yield from inv_item_q.get()
         try:
             v = yield from asyncio.wait_for(inv_collector.fetch(inv_item), timeout=0.5)
             if v:
                 r.append(v)
         except asyncio.TimeoutError:
             pass
     return r
Ejemplo n.º 7
0
    def run_local_peer(peer_list, r):
        inv_collector = InvCollector()
        for peer in peer_list:
            inv_collector.add_peer(peer)
        inv_item_q = inv_collector.new_inv_item_queue()
        
        @asyncio.coroutine
        def _do_fetch(inv_collector, inv_item, r):
            v = yield from inv_collector.fetch(inv_item, peer_timeout=3.0)
            if v:
                r.append(v)

        # keep a strong reference to these tasks
        tasks = []
        for i in range(10):
            inv_item = yield from inv_item_q.get()
            tasks.append(asyncio.Task(_do_fetch(inv_collector, inv_item, r)))
        while len(r) < 10:
            yield from asyncio.sleep(0.1)
        return r
Ejemplo n.º 8
0
def test_InvCollector():
    # create some peers
    peer1_2, peer2 = create_handshaked_peers()
    peer1_3, peer3 = create_handshaked_peers(ip1="127.0.0.1", ip2="127.0.0.3")
    peer1_4, peer4 = create_handshaked_peers(ip1="127.0.0.1", ip2="127.0.0.4")

    # peer1_* represents the local peer

    TX_LIST = [make_tx(i) for i in range(100)]

    @asyncio.coroutine
    def run_local_peer(inv_collector, inv_item_q):
        r = []
        while len(r) < 90:
            inv_item = yield from inv_item_q.get()
            v = yield from inv_collector.fetch(inv_item)
            r.append(v)
        return r

    @asyncio.coroutine
    def run_remote_peer(next_message, peer, txs):
        tx_db = dict((tx.hash(), tx) for tx in txs)
        r = []

        inv_items = [InvItem(ITEM_TYPE_TX, tx.hash()) for tx in txs]
        peer.send_msg("inv", items=inv_items)

        while True:
            t = yield from next_message()
            r.append(t)
            if t[0] == 'getdata':
                for inv_item in t[1]["items"]:
                    peer.send_msg("tx", tx=tx_db[inv_item.data])
        return r

    futures = []
    for peer, txs in [(peer2, TX_LIST[:30]), (peer3, TX_LIST[30:60]),
                      (peer4, TX_LIST[60:90])]:
        f = asyncio.Task(
            run_remote_peer(peer.new_get_next_message_f(), peer, txs))
        futures.append(f)

    inv_collector = InvCollector()
    [inv_collector.add_peer(peer) for peer in [peer1_2, peer1_3, peer1_4]]

    f = asyncio.Task(
        run_local_peer(inv_collector, inv_collector.new_inv_item_queue()))
    done, pending = asyncio.get_event_loop().run_until_complete(
        asyncio.wait([f], timeout=5.0))
    r = done.pop().result()
    assert len(r) == 90
    assert [tx.hash() for tx in r] == [tx.hash() for tx in TX_LIST[:90]]
Ejemplo n.º 9
0
def test_simple_getheader():
    BLOCKS = make_blocks(20)
    blockchain1 = BlockChain()
    blockchain1.add_headers(BLOCKS)

    block_store = dict((b.hash(), b) for b in BLOCKS)

    peer1, peer2 = create_handshaked_peers()

    block_store = {}
    block_chain = BlockChain()
    inv_collector = InvCollector()
    block_handler = BlockHandler(inv_collector, block_chain, block_store)

    for block in BLOCKS:
        inv_collector.advertise_item(InvItem(ITEM_TYPE_BLOCK, block.hash()))
        block_store[block.hash()] = block
    block_chain.add_headers(BLOCKS)

    inv_collector.add_peer(peer1)
    block_handler.add_peer(peer1)

    @asyncio.coroutine
    def run_peer2():
        r = []
        headers = yield from standards.get_headers_hashes(
            peer2, after_block_hash=b'\0' * 32)
        r.append(headers)
        return r

    f2 = asyncio.Task(run_peer2())

    asyncio.get_event_loop().run_until_complete(asyncio.wait([f2]))

    r = f2.result()
    assert len(r) == 1
    assert [b.hash() for b in r[0]] == [b.hash() for b in BLOCKS]
def test_simple_getheader():
    BLOCKS = make_blocks(20)
    blockchain1 = BlockChain()
    blockchain1.add_headers(BLOCKS)

    block_store = dict((b.hash(), b) for b in BLOCKS)

    peer1, peer2 = create_handshaked_peers()

    block_store = {}
    block_chain = BlockChain()
    inv_collector = InvCollector()
    block_handler = BlockHandler(inv_collector, block_chain, block_store)

    for block in BLOCKS:
        inv_collector.advertise_item(InvItem(ITEM_TYPE_BLOCK, block.hash()))
        block_store[block.hash()] = block
    block_chain.add_headers(BLOCKS)

    inv_collector.add_peer(peer1)
    block_handler.add_peer(peer1)

    @asyncio.coroutine
    def run_peer2():
        r = []
        headers = yield from standards.get_headers_hashes(peer2, after_block_hash=b"\0" * 32)
        r.append(headers)
        return r

    f2 = asyncio.Task(run_peer2())

    asyncio.get_event_loop().run_until_complete(asyncio.wait([f2]))

    r = f2.result()
    assert len(r) == 1
    assert [b.hash() for b in r[0]] == [b.hash() for b in BLOCKS]
Ejemplo n.º 11
0
def test_InvCollector():
    # create some peers
    peer1_2, peer2 = create_handshaked_peers()
    peer1_3, peer3 = create_handshaked_peers(ip1="127.0.0.1", ip2="127.0.0.3")
    peer1_4, peer4 = create_handshaked_peers(ip1="127.0.0.1", ip2="127.0.0.4")

    # peer1_* represents the local peer

    TX_LIST = [make_tx(i) for i in range(100)]

    @asyncio.coroutine
    def run_local_peer(inv_collector, inv_item_q):
        r = []
        while len(r) < 90:
            inv_item = yield from inv_item_q.get()
            v = yield from inv_collector.fetch(inv_item)
            r.append(v)
        return r

    @asyncio.coroutine
    def run_remote_peer(next_message, peer, txs):
        tx_db = dict((tx.hash(), tx) for tx in txs)
        r = []

        inv_items = [InvItem(ITEM_TYPE_TX, tx.hash()) for tx in txs]
        peer.send_msg("inv", items=inv_items)

        while True:
            t = yield from next_message()
            r.append(t)
            if t[0] == 'getdata':
                for inv_item in t[1]["items"]:
                    peer.send_msg("tx", tx=tx_db[inv_item.data])
        return r

    futures = []
    for peer, txs in [(peer2, TX_LIST[:30]), (peer3, TX_LIST[30:60]), (peer4, TX_LIST[60:90])]:
        f = asyncio.Task(run_remote_peer(peer.new_get_next_message_f(), peer, txs))
        futures.append(f)

    inv_collector = InvCollector()
    [inv_collector.add_peer(peer) for peer in [peer1_2, peer1_3, peer1_4]]

    f = asyncio.Task(run_local_peer(inv_collector, inv_collector.new_inv_item_queue()))
    done, pending = asyncio.get_event_loop().run_until_complete(asyncio.wait([f], timeout=5.0))
    r = done.pop().result()
    assert len(r) == 90
    assert [tx.hash() for tx in r] == [tx.hash() for tx in TX_LIST[:90]]