import hashlib
class Node:
def __init__(self, data=None, children=None):
self.data = data
self.children = children or []
self.hash = self.compute_hash()
def compute_hash(self):
m = hashlib.sha256()
if self.data:
m.update(self.data.encode('utf-8'))
for child in self.children:
m.update(child.hash.encode('utf-8'))
return m.hexdigest()
def __repr__(self):
return f"Node(hash={self.hash[:10]}, data={self.data})"
# ノードを作成
leaf1 = Node(data="block A")
leaf2 = Node(data="block B")
leaf3 = Node(data="block C")
# 同じ子を共有するノード
intermediate1 = Node(children=[leaf1, leaf2])
intermediate2 = Node(children=[leaf2, leaf3])
# DAGのルート
root = Node(children=[intermediate1, intermediate2])
# 表示
print("Merkle DAG:")
print("Root:", root)
$ python3 merkledag.py
Merkle DAG:
Root: Node(hash=b7026ffa9b, data=None)
同じハッシュを持つノードを共有
leaf2 は2つの親ノードに共有されており、DAGならでは構造となっている。IPFSやGitで使われる構造