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
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]]
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]]
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
def items_for_client(initial_blocks=[]): block_store = {} block_chain = BlockChain() blockfetcher = Blockfetcher() inv_collector = InvCollector() block_handler = BlockHandler(inv_collector, block_chain, block_store) fast_forward_add_peer = fast_forwarder_add_peer_f(block_chain) for block in initial_blocks: inv_collector.advertise_item(InvItem(ITEM_TYPE_BLOCK, block.hash())) block_store[block.hash()] = block block_chain.add_headers(initial_blocks) inv_q = inv_collector.new_inv_item_queue() ap = make_add_peer(fast_forward_add_peer, blockfetcher, block_handler, inv_collector, block_chain, block_store) ap.block_getter_task = asyncio.Task(block_getter(inv_q, inv_collector, block_handler, block_chain, block_store)) return block_handler, block_chain, block_store, ap
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
def items_for_client(initial_blocks=[]): block_store = {} block_chain = BlockChain() blockfetcher = Blockfetcher() inv_collector = InvCollector() block_handler = BlockHandler(inv_collector, block_chain, block_store) fast_forward_add_peer = fast_forwarder_add_peer_f(block_chain) for block in initial_blocks: inv_collector.advertise_item(InvItem(ITEM_TYPE_BLOCK, block.hash())) block_store[block.hash()] = block block_chain.add_headers(initial_blocks) inv_q = inv_collector.new_inv_item_queue() ap = make_add_peer(fast_forward_add_peer, blockfetcher, block_handler, inv_collector, block_chain, block_store) ap.block_getter_task = asyncio.Task( block_getter(inv_q, inv_collector, block_handler, block_chain, block_store)) return block_handler, block_chain, block_store, ap