こちらの記事を参考に動かしてみる
https://alis.to/gaxiiiiiiiiiiii/articles/3dy7vLZn0g89
トランザクションのハッシュ値作成の箇所は、Node(left.hash + right.hash)として、hash値を単純に横に繋げてそれをsha256でハッシュ化してるところが面白い。
from hashlib import sha256
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.parent = None
self.sibling = None
self.position = None
self.data = data
self.hash = sha256(data.encode()).hexdigest()
class Tree:
def __init__(self, leaves):
self.leaves = [Node(leaf) for leaf in leaves]
self.layer = self.leaves[::]
self.root = None
self.build_tree()
def build_layer(self):
new_layer = []
if len(self.layer) % 2 == 1:
self.layer.append(self.layer[-1])
for i in range(0, len(self.layer), 2):
left = self.layer[i]
right = self.layer[i+1]
parent = Node(left.hash + right.hash)
left.parent = parent
left.sibling = right
left.position = "left"
right.parent = parent
right.sibling = left
right.position = "right"
parent.left = left
parent.right = right
new_layer.append(parent)
self.layer = new_layer
def build_tree(self):
while len(self.layer) > 1:
self.build_layer()
self.root = self.layer[0].hash
def search(self, data):
target = None
hash_value = sha256(data.encode()).hexdigest()
for node in self.leaves:
if node.hash == hash_value:
target = node
return target
def get_pass(self, data):
target = self.search(data)
markle_pass = []
if not(target):
return
markle_pass.append(target.hash)
while target.parent:
sibling = target.sibling
markle_pass.append((sibling.hash, sibling.position))
target = target.parent
return markle_pass
def caluculator(markle_pass):
value = markle_pass[0]
for node in markle_pass[1:]:
sib = node[0]
position = node[1]
if position == "right":
value = sha256(value.encode() + sib.encode()).hexdigest()
else:
value = sha256(sib.encode() + value.encode()).hexdigest()
return value