def test_get_proof(): hash_0 = 'a' * 32 hash_1 = 'b' * 32 merkle_tree = [hash_0, hash_1] merkle_proof = get_proof(merkle_tree, hash_0) merkle_root = merkleroot(merkle_tree) assert check_proof(merkle_proof, merkle_root, hash_0) second_merkle_proof = get_proof(merkle_tree, hash_0, merkle_root) assert check_proof(second_merkle_proof, merkle_root, hash_0) assert merkle_proof == second_merkle_proof
def test_many(tree_up_to=10): for number_of_leaves in range(tree_up_to): merkle_tree = [keccak(str(value)) for value in range(number_of_leaves)] for value in merkle_tree: merkle_proof = get_proof(merkle_tree, value) merkle_root = merkleroot(merkle_tree) second_proof = get_proof(merkle_tree, value, merkle_root) assert check_proof(merkle_proof, merkle_root, value) is True assert check_proof(second_proof, merkle_root, value) is True assert merkleroot(merkle_tree) == merkleroot(reversed(merkle_tree))
def do_test_many(values): for i, v in enumerate(values): proof = [v] r = merkleroot(values, proof) assert check_proof(proof, r, v) proof = get_proof(values, v, r) assert check_proof(proof, r, v)
def test_many(tree_up_to=10): for number_of_leaves in range(tree_up_to): merkle_tree = [ keccak(str(value)) for value in range(number_of_leaves) ] for value in merkle_tree: merkle_proof = get_proof(merkle_tree, value) merkle_root = merkleroot(merkle_tree) second_proof = get_proof(merkle_tree, value, merkle_root) assert check_proof(merkle_proof, merkle_root, value) is True assert check_proof(second_proof, merkle_root, value) is True assert merkleroot(merkle_tree) == merkleroot(reversed(merkle_tree))
def get_proof(self, transfer): """ Return the merkle proof that transfer is one of the locked transfers in the container. """ hashlock = transfer.lock.hashlock transfer = self.locked[hashlock] proof_for = sha3(transfer.lock.as_bytes) proof = get_proof(self._cached_lock_hashes, proof_for) return proof
def test_two(): hash_0 = 'a' * 32 hash_1 = 'b' * 32 merkle_tree = [hash_0, hash_1] merkle_proof = get_proof(merkle_tree, hash_0) merkle_root = merkleroot(merkle_tree) assert merkle_proof == [hash_1] assert merkle_root == keccak(hash_0 + hash_1) assert check_proof(merkle_proof, merkle_root, hash_0) merkle_proof = get_proof(merkle_tree, hash_1) merkle_root = merkleroot(merkle_tree) assert merkle_proof == [hash_0] assert merkle_root == keccak(hash_0 + hash_1) assert check_proof(merkle_proof, merkle_root, hash_1)
def test_one(): hash_0 = 'a' * 32 merkle_tree = [hash_0] merkle_proof = get_proof(merkle_tree, hash_0) merkle_root = merkleroot(merkle_tree) assert merkle_proof == [] assert merkle_root == hash_0 assert check_proof(merkle_proof, merkle_root, hash_0) is True
def test_get_proof(): values = [x * 32 for x in 'ab'] proof_for = values[-1] proof = [proof_for] r = merkleroot(values, proof) # print pex(r) # print 'proof', proof assert check_proof(proof, r, proof_for) proof_for = values[-1] proof = get_proof(values, proof_for, r) assert check_proof(proof, r, proof_for)
def test_three(): def sort_join(first, second): return ''.join(sorted([first, second])) hash_0 = 'a' * 32 hash_1 = 'b' * 32 hash_2 = 'c' * 32 merkle_tree = [hash_0, hash_1, hash_2] hash_01 = ( b'me\xef\x9c\xa9=5\x16\xa4\xd3\x8a\xb7\xd9\x89\xc2\xb5\x00' b'\xe2\xfc\x89\xcc\xdc\xf8x\xf9\xc4m\xaa\xf6\xad\r[' ) assert keccak(hash_0 + hash_1) == hash_01 calculated_root = keccak(hash_2 + hash_01) merkle_proof = get_proof(merkle_tree, hash_0) merkle_root = merkleroot(merkle_tree) assert merkle_proof == [hash_1, hash_2] assert merkle_root == calculated_root assert check_proof(merkle_proof, merkle_root, hash_0) merkle_proof = get_proof(merkle_tree, hash_1) merkle_root = merkleroot(merkle_tree) assert merkle_proof == [hash_0, hash_2] assert merkle_root == calculated_root assert check_proof(merkle_proof, merkle_root, hash_1) merkle_proof = get_proof(merkle_tree, hash_2) merkle_root = merkleroot(merkle_tree) # with an odd number of values, the last value wont appear by itself in the # proof since it isn't hashed with another value assert merkle_proof == [keccak(hash_0 + hash_1)] assert merkle_root == calculated_root assert check_proof(merkle_proof, merkle_root, hash_2)
def compute_proof_for_lock(self, secret, lock): alllocks = chain(self.hashlock_pendinglocks.values(), self.hashlock_unclaimedlocks.values(), self.hashlock_unlockedlocks.values()) merkletree = [l.lockhashed for l in alllocks] # forcing bytes because ethereum.abi doesnt work with bytearray lock_encoded = bytes(lock.as_bytes) lock_hash = sha3(lock_encoded) merkle_proof = get_proof(merkletree, lock_hash) return UnlockProof( merkle_proof, lock_encoded, secret, )
def compute_proof_for_lock(self, secret, lock): alllocks = chain( self.hashlock_pendinglocks.values(), self.hashlock_unclaimedlocks.values(), self.hashlock_unlockedlocks.values() ) merkletree = [l.lockhashed for l in alllocks] # forcing bytes because ethereum.abi doesnt work with bytearray lock_encoded = bytes(lock.as_bytes) lock_hash = sha3(lock_encoded) merkle_proof = get_proof(merkletree, lock_hash) return UnlockProof( merkle_proof, lock_encoded, secret, )