def test_ibd_integration(caplog): # just testing the basics: if we set up 2 threads, one with a coinstate, and one without, will the chain propagate? caplog.set_level(logging.INFO) coinstate = _read_chain_from_disk(5) thread_a = NetworkingThread(coinstate, 12412, FakeDiskInterface()) thread_a.start() _try_to_connect('127.0.0.1', 12412) thread_b = NetworkingThread(CoinState.zero(), 12413, FakeDiskInterface()) thread_b.local_peer.network_manager.disconnected_peers = load_peers_from_list( [('127.0.0.1', 12412, "OUTGOING")]) thread_b.start() try: start_time = time() while True: if thread_b.local_peer.chain_manager.coinstate.head().height == 5: break if time() > start_time + 5: print("\n".join(str(r) for r in caplog.records)) raise Exception("IBD failed") sleep(0.01) finally: thread_a.stop() thread_a.join() thread_b.stop() thread_b.join()
def _read_chain_from_disk(max_height): coinstate = CoinState.zero() for file_path in sorted(CHAIN_TESTDATA_PATH.iterdir()): height = int(file_path.name.split("-")[0]) if height > max_height: return coinstate block = Block.stream_deserialize(open(file_path, 'rb')) coinstate = coinstate.add_block_no_validation(block) return coinstate
def read_chain_from_disk(): print("Reading chain from disk") coinstate = CoinState.zero() for filename in sorted(os.listdir('chain')): height = int(filename.split("-")[0]) if height % 1000 == 0: print(filename) block = Block.stream_deserialize(open(Path('chain') / filename, 'rb')) coinstate = coinstate.add_block_no_validation(block) return coinstate
def _read_chain_from_disk(max_height): # the requirement to run these tests from an environment that has access to the real blockchain is hard-coded (for # now) coinstate = CoinState.zero() for filename in sorted(os.listdir('chain')): height = int(filename.split("-")[0]) if height > max_height: return coinstate block = Block.stream_deserialize(open(Path('chain') / filename, 'rb')) coinstate = coinstate.add_block_no_validation(block) return coinstate
def read_chain_from_disk(): print("Reading chain from disk") coinstate = CoinState.zero() for filename in sorted(os.listdir('chain')): height = int(filename.split("-")[0]) if height % 1000 == 0: print(filename) try: block = Block.stream_deserialize(open(Path('chain') / filename, 'rb')) except Exception as e: raise Exception("Corrupted block on disk: %s" % filename) from e coinstate = coinstate.add_block_no_validation(block) return coinstate
def read_chain_from_disk() -> CoinState: if os.path.isfile('chain.cache'): print("Reading cached chain") with open('chain.cache', 'rb') as file: coinstate = CoinState.load(lambda: pickle.load(file)) else: coinstate = CoinState.zero() rewrite = False if os.path.isdir('chain'): # the code below is no longer needed by normal users, but some old testcases still rely on it: for filename in sorted(os.listdir('chain')): (height_str, hash_str) = filename.split("-") (height, hash) = (int(height_str), computer(hash_str)) if hash not in coinstate.block_by_hash: if height % 1000 == 0: print(filename) if os.path.getsize(f"chain/{filename}") == 0: print("Stopping at empty block file: %s" % filename) break with open(Path("chain") / filename, 'rb') as f: try: block = Block.stream_deserialize(f) except Exception as e: raise Exception("Corrupted block on disk: %s" % filename) from e try: coinstate = coinstate.add_block_no_validation(block) except Exception: print("Failed to add block at height=%d, previous_hash=%s" % (block.height, human(block.header.summary.previous_block_hash))) break rewrite = True if rewrite: DiskInterface().write_chain_cache_to_disk(coinstate) return coinstate
def read_chain_from_disk() -> CoinState: if os.path.isfile('chain.cache'): print("Reading cached chain") with open('chain.cache', 'rb') as file: coinstate = CoinState.load(lambda: pickle.load(file)) else: try: print("Pre-download blockchain from trusted source to 'chain.zip'") with urllib.request.urlopen(TRUSTED_BLOCKCHAIN_ZIP) as resp: with open('chain.zip', 'wb') as outfile: outfile.write(resp.read()) print("Reading initial chain from zipfile") coinstate = CoinState.zero() with zipfile.ZipFile('chain.zip') as zip: for entry in zip.infolist(): if not entry.is_dir(): filename = entry.filename.split('/')[1] height = int(filename.split("-")[0]) if height % 1000 == 0: print(filename) data = zip.read(entry) block = Block.stream_deserialize(BytesIO(data)) coinstate = coinstate.add_block_no_validation(block) except Exception: print( "Error reading zip file. We'll start with an empty blockchain instead." + traceback.format_exc()) coinstate = CoinState.zero() rewrite = False if os.path.isdir('chain'): # the code below is no longer needed by normal users, but some old testcases still rely on it: for filename in sorted(os.listdir('chain')): (height_str, hash_str) = filename.split("-") (height, hash) = (int(height_str), computer(hash_str)) if hash not in coinstate.block_by_hash: if height % 1000 == 0: print(filename) if os.path.getsize(f"chain/{filename}") == 0: print("Stopping at empty block file: %s" % filename) break with open(Path("chain") / filename, 'rb') as f: try: block = Block.stream_deserialize(f) except Exception as e: raise Exception("Corrupted block on disk: %s" % filename) from e try: coinstate = coinstate.add_block_no_validation(block) except Exception: print( "Failed to add block at height=%d, previous_hash=%s" % (block.height, human(block.header.summary.previous_block_hash))) break rewrite = True if rewrite: DiskInterface().write_chain_cache_to_disk(coinstate) return coinstate