"""Synthetic Merkle-branch exercise. Not a Core proof parser or block validator.""" import hashlib,json,struct def double(data):return hashlib.sha256(hashlib.sha256(data).digest()).digest() def root(leaves): if not leaves or any(len(x)!=32 for x in leaves):raise ValueError("32-byte leaves required") level=list(leaves);mutated=False while len(level)>1: if any(level[i]==level[i+1] for i in range(0,len(level)-1,2)):mutated=True if len(level)%2:level.append(level[-1]) level=[double(level[i]+level[i+1]) for i in range(0,len(level),2)] return level[0],mutated def branch(leaves,index): if index<0 or index>=len(leaves):raise ValueError("index outside leaves") root(leaves);result=[];level=list(leaves) while len(level)>1: if len(level)%2:level.append(level[-1]) result.append(dict(side="left" if index%2 else "right",sibling_internal_hex=level[index^1].hex())) level=[double(level[i]+level[i+1]) for i in range(0,len(level),2)] index//=2 return result def fold(leaf,path): if len(leaf)!=32:raise ValueError("bad leaf") value=leaf for step in path: sibling=bytes.fromhex(step["sibling_internal_hex"]) if len(sibling)!=32 or step["side"] not in ["left","right"]:raise ValueError("invalid branch") value=double(sibling+value) if step["side"]=="left" else double(value+sibling) return value def calculate(): leaves=[double(("tutorial-"+c).encode("ascii")) for c in "ABC"] merkle,mutated=root(leaves);path=branch(leaves,1) assert fold(leaves[1],path)==merkle and not mutated # Synthetic header has no established proof of work, accepted block or valid transactions. header=struct.pack("