-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmerkleTreeExample.py
More file actions
64 lines (51 loc) · 2.05 KB
/
Copy pathmerkleTreeExample.py
File metadata and controls
64 lines (51 loc) · 2.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import hashlib
def hash(data):
return hashlib.sha256(data.encode('utf-8')).hexdigest()
class MerkleTree:
def __init__(self, leaves):
self.leaves = [hash(leaf) for leaf in leaves]
self.tree = self.build_tree(self.leaves)
def build_tree(self, leaves):
tree = [leaves]
while len(leaves) > 1:
leaves = [hash(leaves[i] + leaves[i + 1]) for i in range(0, len(leaves) - 1, 2)]
tree.append(leaves)
return tree
def get_root(self):
return self.tree[-1][0] if self.tree else None
def get_proof(self, index):
proof = []
for layer in self.tree[:-1]:
is_right_node = index % 2
sibling_index = index - 1 if is_right_node else index + 1
if sibling_index < len(layer):
proof.append((layer[sibling_index], is_right_node))
index //= 2
return proof
def verify_proof(self, leaf, proof, root):
leaf_hash = hash(leaf)
for sibling_hash, is_right_node in proof:
if is_right_node:
leaf_hash = hash(sibling_hash + leaf_hash)
else:
leaf_hash = hash(leaf_hash + sibling_hash)
return leaf_hash == root
def print_tree(self):
for level, nodes in enumerate(reversed(self.tree)):
indent = " " * (len(self.tree) - level - 1) # Indentation for hierarchical structure
print(f"{indent}Level {len(self.tree) - level - 1}: ", end="")
for node in nodes:
truncated_node = node[:6] + "..." # Truncate hash for readability
print(f"[{truncated_node}]", end=" ")
print() # Newline for the next level
# Example usage
leaves = ['data1', 'data2', 'data3', 'data4']
merkle_tree = MerkleTree(leaves)
merkle_tree.print_tree()
root = merkle_tree.get_root()
print(root) # 9d5f1d8b
index = 2 # For 'data3', 0-based index
proof = merkle_tree.get_proof(index)
print(proof)
is_valid = merkle_tree.verify_proof('data3', proof, root)
print(f"Proof Valid: {is_valid}")