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で使われる構造