Owners: @Thomas Lavaur @David Rusu
Reviewers: 🟢@Giacomo Pasini 🟢@Mehmet 🟢@Álvaro Castro-Castilla
Unlike a typical blockchain, where a single ledger would track all notes, Nomos partitions the ledger across zones. The partitioned ledgers will be maintained locally by Native zones, but enforced globally as a common format to enable certain properties and functionalities otherwise not possible (such as PACTs, see Private Atomic Cross-zone Transactions (PACTs) ). Each Native zone manages its own ledger partition and defines its own application. Despite this separation, global ledger rules ensure zones can confidently process notes originating from other ledger partitions. The common ledger is also directly used by the Mantle through the Mantle ledger. The Mantle ledger enforces additional constraints and restrains interactions on its partition of the ledger, favoring efficiency while keeping the model described in this document.
The following documents provide the necessary background for related topics:
What a note is.
How the update requests of the ledger are built.
How we chose the representation of the ledger.
Preliminary Research: Ledger Representation
Preliminary Research: Mutator Sets and their Application to Scalable Privacy
How Ledger updates are verified and coordinated by Nomos Bedrock.
Preliminary Research: Bedrock Mantle Specification (Native Zones)
The Zone Ledger is composed of two sets, the commitment set and the nullifier set. The commitment set holds every note that has been created in a zone, and the nullifier set maintains a record of every note that has been spent in a zone. Bundles are used to update the Zone Ledger and the rules governing these updates are enforced in The Ledger proof.
The Commitment Set is represented as an MMR (see Merkle Mountain Ranges (MMR)). This representation is used to achieve state compression.
The Nullifier Set is represented as an Indexed Merkle Tree (IMT, see Preliminary Research: Sparse Merkle Tree vs Indexed Merkle Tree).
The Ledger proof governs the evolution of these two sets by applying bundles to the ledger state. The newly created commitments from each bundle are added to the commitment set and the spent nullifiers are inserted into the nullifier set after verifying their non-membership.