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 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, 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
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
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 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 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_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]
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]]