Skip to content

Instantly share code, notes, and snippets.

@gubatron
Created March 23, 2022 20:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gubatron/09c335d96b7bc971d32285c34635c8d5 to your computer and use it in GitHub Desktop.
Save gubatron/09c335d96b7bc971d32285c34635c8d5 to your computer and use it in GitHub Desktop.
Crates a Merkle Tree using the given data, per light Clients for Lazy Blockchains paper by Ertem Nusret Tas et. al
import hashlib
import binascii
def H(data):
if type(data) == str:
data = str.encode(data)
if type(data) == int:
data = data.to_bytes(4, 'big')
return hashlib.sha256(data).digest()
class Tree:
def __init__(self, root, data, left, right):
self.root = root
self.data = data
self.left = left
self.right = right
def makeMerkleTree(dataList):
if len(dataList) == 1:
return Tree(H(dataList[0]), dataList[0], None, None)
mid = len(dataList)//2
tree = Tree(None, None, makeMerkleTree(dataList[:mid]), makeMerkleTree(dataList[mid:]))
tree.root = H(tree.left.root + tree.right.root)
return tree
def printInOrder(tree):
if tree.root:
if tree.left:
printInOrder(tree.left)
print("hash:", binascii.hexlify(bytearray(tree.root)))
print("data:", tree.data)
if tree.right:
printInOrder(tree.right)
data = [0,1,2,3,4]
merkleTree = makeMerkleTree(data)
print("data:", data)
print("\ntree root:", binascii.hexlify(bytearray(merkleTree.root)))
print("\ntree:")
printInOrder(merkleTree)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment