def test_add_headers_fork(tmp_path): index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) chain = generate_random_header_chain(2000, RegTest().genesis.hash) fork = generate_random_header_chain(200, chain[-10 - 1].hash) index.add_headers(chain) index.add_headers(fork) assert len(index.header_index) == 2190 + 1
def test_add_invalid_header(tmp_path): block_index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) chain = generate_random_header_chain(2000, RegTest().genesis.hash) block_index.add_headers(chain) invalid_chain = generate_random_header_chain(2000, Main().genesis.hash) assert not block_index.add_headers(invalid_chain) assert len(block_index.header_dict) == 2000 + 1 assert len(block_index.header_index) == 2000 + 1 assert len(block_index.block_candidates) == 2000
def test_init_with_fork(tmp_path): index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) chain = generate_random_header_chain(2000, RegTest().genesis.hash) fork = generate_random_header_chain(5, chain[-10].hash) index.add_headers(chain) index.add_headers(fork) index.db.close() new_index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) assert index.header_dict == new_index.header_dict assert index.header_index == new_index.header_index assert index.active_chain == new_index.active_chain assert sorted(index.block_candidates) == sorted(new_index.block_candidates)
def test_generate_block_candidates_2(tmp_path): index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) chain = generate_random_header_chain(2000, RegTest().genesis.hash) fork = generate_random_header_chain(200, chain[-10 - 1].hash) index.add_headers(chain) index.add_headers(fork) for x in fork: block_info = index.get_block_info(x.hash) block_info.status = BlockStatus.invalid index.insert_block_info(block_info) index.db.close() new_index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) assert len(new_index.block_candidates) == 2000
def test_block_candidates_3(tmp_path): index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) chain = generate_random_header_chain(2000, RegTest().genesis.hash) fork = generate_random_header_chain(200, chain[-10 - 1].hash) index.add_headers(chain) index.add_headers(fork) for x in chain: block_info = index.get_block_info(x.hash) block_info.status = BlockStatus.in_active_chain index.insert_block_info(block_info) index.db.close() new_index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) assert new_index.get_download_candidates() == [x.hash for x in fork]
def test_block_header_last(tmp_path): node = Node(config=Config( chain="regtest", data_dir=tmp_path, allow_p2p=False, rpc_port=get_random_port(), )) node.start() wait_until(lambda: node.rpc_manager.is_alive()) chain = generate_random_header_chain(2000, RegTest().genesis.hash) node.index.add_headers(chain) response = json.loads( requests.post( url=f"http://127.0.0.1:{node.rpc_port}", data=json.dumps({ "jsonrpc": "1.0", "id": "pytest", "method": "getblockheader", "params": [chain[-1].hash], }).encode(), headers={ "Content-Type": "text/plain" }, ).text) assert response["result"]["hash"] == chain[-1].hash assert response["result"]["height"] == 2000 assert response["result"]["previousblockhash"] == chain[-2].hash assert "nextblockhash" not in response["result"] node.stop()
def test_block_locators_4(tmp_path): index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) chain = generate_random_header_chain(2000, RegTest().genesis.hash) index.add_headers(chain[:1000]) headers = index.get_headers_from_locators( [chain[-1].hash, RegTest().genesis.hash], "00" * 32 ) assert headers == chain[:1000]
def test_simple_init(tmp_path): index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) index.add_headers(generate_random_header_chain(2000, RegTest().genesis.hash)) index.db.close() new_index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) assert index.header_dict == new_index.header_dict assert index.header_index == new_index.header_index assert index.active_chain == new_index.active_chain assert index.block_candidates == new_index.block_candidates
def test_add_headers_long(tmp_path): block_index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) length = 50 # 2000 chain = generate_random_header_chain(2000 * length, RegTest().genesis.hash) for x in range(length): block_index.add_headers(chain[x * 2000 : (x + 1) * 2000]) assert len(block_index.header_dict) == 2000 * length + 1 assert len(block_index.header_index) == 2000 * length + 1 assert len(block_index.block_candidates) == 2000 * length
def test_long_init(tmp_path): index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) length = 10 # 2000 chain = generate_random_header_chain(2000 * length, RegTest().genesis.hash) for x in range(length): index.add_headers(chain[x * 2000 : (x + 1) * 2000]) index.db.close() new_index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) assert index.header_dict == new_index.header_dict assert index.header_index == new_index.header_index assert index.active_chain == new_index.active_chain assert index.block_candidates == new_index.block_candidates
def test_block_locators(tmp_path): index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) chain = generate_random_header_chain(24, RegTest().genesis.hash) index.add_headers(chain) locators = index.get_block_locator_hashes() assert len(locators) == 14
def test_block_candidates_2(tmp_path): index = BlockIndex(tmp_path, RegTest(), Logger(debug=True)) chain = generate_random_header_chain(1024, RegTest().genesis.hash) index.add_headers(chain) assert index.get_download_candidates() == [x.hash for x in chain]