Merkle Proof
Generate a Merkle inclusion proof for a specific leaf in a Merkle tree.
Verifying a Proof
Hash the target leaf with each sibling in order and compare the final result to the tree’s current root hash (fetch the root via Tree Metadata).Usage in the SDK
The Umbra SDK does not use this single-proof endpoint when burning. Burner factories use the batch endpoint so all proofs in a burn batch share the same root. The single-proof endpoint exists for analytics, debugging, and custom integrations.Performance
Proof generation traverses all 20 tree levels. Under normal conditions, proofs are generated in under 100 ms. Operations exceeding 500 ms emit a slow-operation warning server-side but still return a valid proof.Path Parameters
Zero-based index of the Merkle tree to query.
x >= 0Zero-based leaf position for which to generate the proof. Must be
strictly less than the tree's current num_leaves.
x >= 0Response
Merkle proof generated successfully.
Protobuf ProofResponse message returned by
GET /v1/trees/{tree_index}/proof/{insertion_index}.
All hash string fields are little-endian hex representations of 32-byte Poseidon hashes (matching Solana's on-chain byte order and Circom ZK circuit input conventions). Each hash is a 64-character hex string (32 bytes).
Usage: Together with leaf, root, and the 20-element proof array,
a caller can verify membership and construct a Groth16 zero-knowledge proof
verifiable against the on-chain Umbra Merkle root.
Depth: The Umbra mixer uses a depth-20 Indexed Merkle Tree, so proof
always contains exactly 20 sibling hashes.
Little-endian hex-encoded Poseidon root hash at query time. 64 hex characters (32 bytes).
"1a2b3c4d5e6f7890abcdef1234567890abcdef1234567890abcdef1234567890ab"
Echo of the requested tree_index path parameter.
0
Echo of the requested insertion_index path parameter.
42
Ordered sibling hashes forming the authentication path from the leaf up to the root. Always exactly 20 elements (depth-20 tree), ordered from leaf level (index 0) to root level (index 19). Each element is a 64-character little-endian hex-encoded Poseidon hash.
20 elements[
"0000000000000000000000000000000000000000000000000000000000000000",
"2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864"
]Little-endian hex-encoded final_commitment = Poseidon(h1_hash, h2_hash)
at insertion_index. 64 hex characters (32 bytes).
"deadbeefcafebabe1234567890abcdef1234567890abcdef1234567890abcdef12"