Skip to main content

Merkle Proofs

When you resolve a name, the API returns a Merkle membership proof - 128 sibling hashes from the Sparse Merkle Tree. This lets you verify the resolution without trusting the server.

How Verification Works

leaf = SHA-256(address)
key = SHA-256("richard.zcash")

current_root
|
/ \
/ \
... ...
/ \
sibling[127] leaf(richard.zcash)

Hash the leaf up through the 128 levels using the sibling hashes. If you arrive at the advertised smt_root, the resolution is correct.

The Sparse Merkle Tree

ZCashNames uses a depth-128 SHA-256 Sparse Merkle Tree (SMT):

  • Depth 128 - 2^128 possible slots, no collisions
  • SHA-256 at every level for deterministic hashing
  • Non-membership proofs - verify a name is not taken (needed during registration)
  • Membership proofs - verify a name is registered (returned on resolution)

Deterministic State

Two independent indexers processing the same blocks must produce the same SMT root. A mismatch means one is wrong.

Check the current root: GET /v1.0/info