Umbra Privacy LogoUmbra Privacy
Core Concepts

Unified Mixer Pool

The unified privacy infrastructure that enables anonymous transactions through an append-only Merkle tree of UTXOs.

The Unified Mixer Pool is Umbra's core anonymity infrastructure-a shared on-chain pool where all shielded transactions are recorded within an append-only Merkle tree structure. The mixer enables users to break the on-chain link between their public identity and their assets.

The unified nature of this pool means that every transaction contributes to the collective privacy of all users. When you deposit into the mixer, your funds become indistinguishable from all other funds in the pool. When you burn (spend) a UTXO, no observer can determine which specific deposit you're spending.


Architecture Overview

The mixer pool consists of three primary components:

  1. UTXO Commitments - Hashed representations of unspent transaction outputs stored as leaves in the Merkle tree
  2. Merkle Tree - An append-only tree structure that provides efficient membership proofs
  3. Nullifier Set - An on-chain record of all spent UTXOs to prevent double-spending

The Merkle Tree Structure

All UTXO commitments are appended to an Incremental Merkle Tree. This structure allows the protocol to efficiently verify that a UTXO exists without revealing which specific UTXO is being referenced.

PropertyValue
Tree Depth20 levels
Leaves per TreeUp to 2202^{20} (approximately 1 million)
Number of TreesUp to 21282^{128} trees
StructureAppend-only (leaves are never modified or removed)
Root StorageOn-chain
Leaf StorageOff-chain (maintained by indexers)

The Merkle root is stored on-chain, providing cryptographic proof of the tree's state. The complete state of all leaves and intermediate nodes is maintained off-chain by indexers. This hybrid approach balances on-chain security with off-chain scalability.


UTXO Concept

A UTXO (Unspent Transaction Output) represents a discrete unit of value locked in the mixer pool. Each UTXO contains:

  • Amount - The value locked in the UTXO
  • Random Secret - Entropy that makes each UTXO commitment unique
  • Nullifier Data - Information used to derive the nullifier when spending
  • Public Metadata - Additional data required by the protocol

The exact structure of a UTXO is detailed in a separate page. What's important to understand here is that each UTXO has two critical address fields:

Unlocking Address (User Commitment)

The Unlocking Address is a User Commitment-a cryptographic hash that binds together the owner's L1 Key, Shielded Spending Key, and Master Viewing Key.

Only someone who knows all the preimages of this User Commitment can burn the UTXO. This is proven inside a zero-knowledge proof without revealing any of the actual keys.

Destination Address

The Destination Address is an L1 public key (Ed25519) that specifies where the funds go when the UTXO is burned.

When a UTXO is burned, the funds are released to this destination address. The destination address is fixed at deposit time and cannot be changed afterward.

Relationship Between Addresses

ScenarioUnlocking AddressDestination Address
Self-depositYour User CommitmentYour L1 Address
Send to another userRecipient's User CommitmentRecipient's L1 Address
Mixed scenarioYour User CommitmentDifferent L1 Address

The unlocking address and destination address are independent-they can be the same or different depending on the use case. However, the destination address is always determined at the time of deposit and cannot be modified.


Deposit Flow

When depositing funds into the mixer pool:

  1. Sender creates a UTXO with:

    • The recipient's User Commitment as the unlocking address
    • The recipient's L1 address as the destination address
    • The amount, random secret, and other required fields
  2. UTXO commitment is computed - A hash of all UTXO fields

  3. Commitment is appended to the Merkle tree

  4. Merkle root is updated on-chain

The deposit can come from either:


Burning (Spending) a UTXO

To spend a UTXO, the owner must generate a zero-knowledge proof demonstrating:

  1. Membership - The UTXO commitment exists in the Merkle tree (without revealing which one)
  2. Ownership - Knowledge of all preimages of the unlocking address (User Commitment)
  3. Nullifier correctness - The nullifier was correctly derived from the UTXO and Shielded Spending Key

Nullifier Prevention

When a UTXO is burned, its nullifier is published on-chain and added to the nullifier set. The nullifier is derived deterministically from the UTXO data and the owner's Shielded Spending Key using Poseidon PRF.

If someone attempts to burn the same UTXO twice:

  • They must produce the same nullifier (it's deterministic)
  • The protocol checks the nullifier set
  • The duplicate nullifier is rejected

This prevents double-spending while preserving privacy-the nullifier reveals nothing about which UTXO was spent.


Privacy Guarantees

The mixer pool provides the following privacy guarantees:

PropertyGuarantee
Sender AnonymityCannot determine who deposited a specific UTXO
Recipient AnonymityCannot determine who can spend a UTXO
Amount PrivacyHidden when depositing from ETA
Transaction UnlinkabilityCannot link deposits to burns
Forward PrivacyPast transactions remain private even if keys are later compromised

The anonymity set is the entire pool-every UTXO in the Merkle tree is a potential candidate for any burn transaction. As more users participate, the anonymity set grows, strengthening privacy for everyone.


Comparison: Mixer Pool vs. Encrypted Token Accounts

Umbra provides two complementary privacy layers:

FeatureMixer PoolETAs
Privacy TypeAnonymity (hidden identity)Confidentiality (hidden amounts)
OwnershipHidden via User CommitmentVisible on-chain
Control KeyShielded Spending Key + MVKL1 Key
Visibility KeyX25519 (to find UTXOs)X25519 (to decrypt balances)
Use CaseBreaking transaction linksPrivate balances

Users can move funds between these layers depending on their privacy needs.


Summary

AspectDetails
StructureAppend-only Merkle tree of UTXO commitments
Tree Depth20 levels per tree
Max Trees21282^{128}
Unlocking AddressUser Commitment (determines who can burn)
Destination AddressL1 public key (determines where funds go)
Double-Spend PreventionNullifier set stored on-chain
Anonymity SetAll UTXOs in the pool
Root StorageOn-chain
Leaf StorageOff-chain (indexers)