def test_push_subtree_1(self): for i in range(len(TreeHasherTest.test_vector_leaves)): test_vector = TreeHasherTest.test_vector_leaves[:i + 1] self.tree = compact_merkle_tree.CompactMerkleTree() self.tree.extend(test_vector) self.tree._push_subtree([b"test leaf"]) self.assertEqual(len(self.tree), len(test_vector) + 1)
def test_extend_from_empty(self): for i in range(len(TreeHasherTest.test_vector_leaves)): test_vector = TreeHasherTest.test_vector_leaves[:i + 1] expected_hash = TreeHasherTest.test_vector_hashes[i] self.tree = compact_merkle_tree.CompactMerkleTree() self.tree.extend(test_vector) root = hexlify(self.tree.root_hash) self.assertEqual(root, expected_hash)
def test_extend_from_partial(self): z = len(TreeHasherTest.test_vector_leaves) for i in range(z): self.tree = compact_merkle_tree.CompactMerkleTree() # add up to i test_vector = TreeHasherTest.test_vector_leaves[:i + 1] expected_hash = TreeHasherTest.test_vector_hashes[i] self.tree.extend(test_vector) self.assertEqual(self.tree.root_hash_hex, expected_hash) # add up to z test_vector = TreeHasherTest.test_vector_leaves[i + 1:] expected_hash = TreeHasherTest.test_vector_hashes[z - 1] self.tree.extend(test_vector) self.assertEqual(self.tree.root_hash_hex, expected_hash)
def test_verify_leaf_inclusion_all_nodes_all_tree_sizes_up_to_4(self): leaves = ["aa", "bb", "cc", "dd"] hh = HexTreeHasher() leaf_hashes = [hh.hash_leaf(l) for l in leaves] hc = hh.hash_children proofs_per_tree_size = { 1: [[]], 2: [[leaf_hashes[1]], [leaf_hashes[0]]], 3: [ [leaf_hashes[1], leaf_hashes[2]], # leaf 0 [leaf_hashes[0], leaf_hashes[2]], # leaf 1 [hc(leaf_hashes[0], leaf_hashes[1])] ], # leaf 2 4: [ [leaf_hashes[1], hc(leaf_hashes[2], leaf_hashes[3])], # leaf 0 [leaf_hashes[0], hc(leaf_hashes[2], leaf_hashes[3])], # leaf 1 [leaf_hashes[3], hc(leaf_hashes[0], leaf_hashes[1])], # leaf 2 [leaf_hashes[2], hc(leaf_hashes[0], leaf_hashes[1])], # leaf 3 ] } tree = compact_merkle_tree.CompactMerkleTree(hasher=HexTreeHasher()) verifier = ledger.merkle_verifier.MerkleVerifier(HexTreeHasher()) # Increase the tree by one leaf each time for i in range(4): tree.append(leaves[i]) tree_size = i + 1 # ... and check inclusion proof validates for each node # of the tree for j in range(tree_size): proof = proofs_per_tree_size[tree_size][j] sth = self.STH(tree.root_hash, tree_size) self.assertTrue( verifier.verify_leaf_inclusion(leaves[j], j, proof, sth))
def setUp(self): self.tree = compact_merkle_tree.CompactMerkleTree(HexTreeHasher())