def test_hexary_trie_avoid_over_pruning(): db = {} trie = HexaryTrie(db, prune=True) def _insert(trie, index, val): index_key = rlp.encode(index, sedes=rlp.sedes.big_endian_int) trie[index_key] = val return index_key inserted_keys = [] for index, val in enumerate([b'\0' * 32] * 129): new_key = _insert(trie, index, val) inserted_keys.append(new_key) # poke the trie to make sure all nodes are still present for key in inserted_keys: # If there's a problem, this will raise a MissingTrieNode trie.get(key) verify_ref_count(trie)
def test_hexary_trie_missing_node(): db = {} trie = HexaryTrie(db, prune=True) key1 = to_bytes(0x0123) trie.set( key1, b'use a value long enough that it must be hashed according to trie spec' ) key2 = to_bytes(0x1234) trie.set(key2, b'val2') trie_root_hash = trie.root_hash # delete first child of the root root_node = trie.root_node.raw first_child_hash = root_node[0] del db[first_child_hash] # Get exception with relevant info about key with pytest.raises(MissingTrieNode) as exc_info: trie.get(key1) message = str(exc_info.value) assert encode_hex(key1) in message assert encode_hex(trie_root_hash) in message assert encode_hex(first_child_hash) in message # Get exception when trying to write into key with shared prefix key1_shared_prefix = to_bytes(0x0234) with pytest.raises(MissingTrieNode) as set_exc_info: trie.set(key1_shared_prefix, b'val2') set_exc_message = str(set_exc_info.value) assert encode_hex(key1_shared_prefix) in set_exc_message assert encode_hex(trie_root_hash) in set_exc_message assert encode_hex(first_child_hash) in set_exc_message # Get exception when trying to delete key with missing data with pytest.raises(MissingTrieNode) as delete_exc_info: trie.delete(key1) delete_exc_message = str(delete_exc_info.value) assert encode_hex(key1) in delete_exc_message assert encode_hex(trie_root_hash) in delete_exc_message assert encode_hex(first_child_hash) in delete_exc_message # Get exception when checking if key exists with missing data key1_shared_prefix2 = to_bytes(0x0345) with pytest.raises(MissingTrieNode) as existance_exc_info: key1_shared_prefix2 in trie existance_exc_message = str(existance_exc_info.value) assert encode_hex(key1_shared_prefix2) in existance_exc_message assert encode_hex(trie_root_hash) in existance_exc_message assert encode_hex(first_child_hash) in existance_exc_message # Other keys are still accessible assert trie.get(key2) == b'val2'