def test_verify_proof(): node_trie = Trie(PersistentDB(KeyValueStorageInMemory())) client_trie = Trie(PersistentDB(KeyValueStorageInMemory())) node_trie.update('k1'.encode(), rlp_encode(['v1'])) node_trie.update('k2'.encode(), rlp_encode(['v2'])) root_hash_0 = node_trie.root_hash p0 = node_trie.produce_spv_proof('k2'.encode()) p0.append(deepcopy(node_trie.root_node)) p00 = deepcopy(p0) assert client_trie.verify_spv_proof(root_hash_0, 'k2'.encode(), rlp_encode(['v2']), p0) assert p00 == p0 node_trie.update('k3'.encode(), rlp_encode(['v3'])) node_trie.update('k4'.encode(), rlp_encode(['v4'])) node_trie.update('x1'.encode(), rlp_encode(['y1'])) node_trie.update('x2'.encode(), rlp_encode(['y2'])) root_hash_1 = node_trie.root_hash # Generate 1 proof and then verify that proof p1 = node_trie.produce_spv_proof('k1'.encode()) p1.append(node_trie.root_node) assert client_trie.verify_spv_proof(root_hash_1, 'k1'.encode(), rlp_encode(['v1']), p1) p2 = node_trie.produce_spv_proof('x2'.encode()) p2.append(node_trie.root_node) assert client_trie.verify_spv_proof(root_hash_1, 'x2'.encode(), rlp_encode(['y2']), p2) # Generate more than 1 proof and then verify all proofs p3 = node_trie.produce_spv_proof('k3'.encode()) p3.append(node_trie.root_node) p4 = node_trie.produce_spv_proof('x1'.encode()) p4.append(node_trie.root_node) assert client_trie.verify_spv_proof(root_hash_1, 'k3'.encode(), rlp_encode(['v3']), p3) assert client_trie.verify_spv_proof(root_hash_1, 'x1'.encode(), rlp_encode(['y1']), p4) # Proof is correct but value is different assert not client_trie.verify_spv_proof(root_hash_1, 'x1'.encode(), rlp_encode(['y99']), p4) # Verify same proof again assert client_trie.verify_spv_proof(root_hash_1, 'k3'.encode(), rlp_encode(['v3']), p3) assert p00 == p0 assert client_trie.verify_spv_proof(root_hash_0, 'k2'.encode(), rlp_encode(['v2']), p0)
def test_get_proof_and_value(): # Non prefix nodes num_keys = 100 test_data = gen_test_data(num_keys) node_trie = Trie(PersistentDB(KeyValueStorageInMemory())) client_trie = Trie(PersistentDB(KeyValueStorageInMemory())) for k, v in test_data.items(): node_trie.update(k, v) for k in test_data: proof, v = node_trie.produce_spv_proof(k, get_value=True) proof.append(deepcopy(node_trie.root_node)) assert v == test_data[k] assert client_trie.verify_spv_proof(node_trie.root_hash, k, v, proof)
def test_get_proof_and_value_no_key(): node_trie = Trie(PersistentDB(KeyValueStorageInMemory())) assert ([], None) == node_trie.produce_spv_proof(b"unknown_key", get_value=True)