def test_verify_tree_from_hex_str_invalid(self): raw_leaves = [secrets.token_bytes(16) for _ in range(16)] random_hash = MerkleTree.hash(secrets.token_bytes(16)) m = MerkleTree(raw_leaves) self.assertFalse(MerkleTree.verify_tree_from_hex_str(m.leaves_as_concat_hex_str, random_hash))
def test_leaves_as_hex_str(self): leaves = [1, 2, 3, 4] hashed_leaves = [MerkleTree.hash(leaf).hex() for leaf in leaves] hex_leaves = ''.join(hashed_leaves) m = MerkleTree(leaves) self.assertEqual(hex_leaves, m.leaves_as_concat_hex_str)
def test_leaves_as_hex(self): leaves = [1, 2, 3, 4] hashed_leaves = [MerkleTree.hash(leaf).hex() for leaf in leaves] m = MerkleTree(leaves) for actual, expected in zip(m.leaves_as_hex, hashed_leaves): self.assertEqual(actual, expected)
def test_creation(self): """ Tests that a created block data reply has the expected properties """ tx_binary = b'some random binary' bdr = BlockDataReply.create(tx_binary) self.assertEqual(tx_binary, bdr.raw_tx) self.assertEqual(bdr.tx_hash, MerkleTree.hash(tx_binary))
def test_make_merkle_works(self): leaves = [1, 2, 3, 4] test_merkle = [ None, None, None, MerkleTree.hash(1), MerkleTree.hash(2), MerkleTree.hash(3), MerkleTree.hash(4) ] test_merkle[2] = MerkleTree.hash(test_merkle[-2] + test_merkle[-1]) test_merkle[1] = MerkleTree.hash(test_merkle[3] + test_merkle[4]) test_merkle[0] = MerkleTree.hash(test_merkle[1] + test_merkle[2]) m = MerkleTree(leaves) self.assertEqual(test_merkle, m.nodes)
def test_root_as_hex(self): leaves = [1, 2, 3, 4] test_merkle = [ None, None, None, MerkleTree.hash(1), MerkleTree.hash(2), MerkleTree.hash(3), MerkleTree.hash(4) ] test_merkle[2] = MerkleTree.hash(test_merkle[-2] + test_merkle[-1]) test_merkle[1] = MerkleTree.hash(test_merkle[3] + test_merkle[4]) test_merkle[0] = MerkleTree.hash(test_merkle[1] + test_merkle[2]) m = MerkleTree(leaves) self.assertEqual(m.root, test_merkle[0]) self.assertEqual(m.root_as_hex, test_merkle[0].hex())
def test_make_merkle_works(self): # create a merkle tree that should be leaves = [1, 2, 3, 4] test_merkle = [None, None, None, MerkleTree.hash(bytes(1)), MerkleTree.hash(bytes(2)), MerkleTree.hash(bytes(3)), MerkleTree.hash(bytes(4))] test_merkle[2] = MerkleTree.hash(test_merkle[-2] + test_merkle[-1]) test_merkle[1] = MerkleTree.hash(test_merkle[3] + test_merkle[4]) test_merkle[0] = MerkleTree.hash(test_merkle[1] + test_merkle[2]) m = MerkleTree(leaves) self.assertEqual(test_merkle, m.nodes)
def test_find_children(self): leaves = [1, 2, 3, 4] test_merkle = [ None, None, None, MerkleTree.hash(1), MerkleTree.hash(2), MerkleTree.hash(3), MerkleTree.hash(4) ] test_merkle[2] = MerkleTree.hash(test_merkle[-2] + test_merkle[-1]) test_merkle[1] = MerkleTree.hash(test_merkle[3] + test_merkle[4]) test_merkle[0] = MerkleTree.hash(test_merkle[1] + test_merkle[2]) m = MerkleTree(leaves) self.assertEqual(m.children(0), [test_merkle[1], test_merkle[2]]) self.assertEqual(m.children(1), [test_merkle[3], test_merkle[4]]) self.assertEqual(m.children(2), [test_merkle[5], test_merkle[6]])
def test_find_root(self): leaves = [1, 2, 3, 4] test_merkle = [None, None, None, MerkleTree.hash(bytes(1)), MerkleTree.hash(bytes(2)), MerkleTree.hash(bytes(3)), MerkleTree.hash(bytes(4))] test_merkle[2] = MerkleTree.hash(test_merkle[-2] + test_merkle[-1]) test_merkle[1] = MerkleTree.hash(test_merkle[3] + test_merkle[4]) test_merkle[0] = MerkleTree.hash(test_merkle[1] + test_merkle[2]) m = MerkleTree(leaves) self.assertEqual(m.root(2), test_merkle[0]) self.assertEqual(m.root(4), test_merkle[1]) self.assertEqual(m.root(), test_merkle[0])
def tx_hash(self): return MerkleTree.hash(self._data)
def tx_hash(self) -> str: """ The hash of the requested transaction (64 characters, valid hex) """ return MerkleTree.hash(self._data)