Python theorytheory 0/50 · 0%
Web3 integration · hard

48. Merkle trees in pure Python

Building a simple Merkle root from leaf hashes.

A Merkle tree lets you prove membership of an item in a large set with a small proof, by repeatedly hashing pairs of nodes up to a single root.

python
import hashlib

def h(data: bytes) -> bytes:
    return hashlib.sha256(data).digest()

def merkle_root(leaves: list[bytes]) -> bytes:
    if not leaves:
        return b""
    level = [h(leaf) for leaf in leaves]
    while len(level) > 1:
        if len(level) % 2 == 1:
            level.append(level[-1])   # duplicate last if odd count
        level = [h(level[i] + level[i + 1]) for i in range(0, len(level), 2)]
    return level[0]

Duplicating the last node when the level has an odd count is one common convention (others exist, e.g. promoting it unchanged); the important part is that both the prover and verifier agree on the same rule.

Check your understanding

  1. 1. What is the general idea of a Merkle tree?

  2. 2. In the code above, what happens when a level has an odd number of nodes?

  3. 3. Why must both hashing sides agree on the same odd-node convention?