Skip to content

← Back to blog

Field note

UTXOs, Notes, and Resources: Value as Something You Consume Once

Vault Architecture

In an account model, a ledger says Alice has 10 and Bob has 4, then mutates those numbers. In a UTXO model, the ledger holds discrete outputs. A transaction consumes existing outputs and creates new ones. An output is either unspent or already consumed; there is no partial mutation of the same object.

Private note systems retain that consume-and-create shape while hiding the objects. The public ledger stores commitments instead of plaintext outputs. Spending reveals a nullifier: a unique, unlinkable marker that lets everyone reject a second spend without learning which public commitment was consumed.

From fixed coins to programmable resources

A resource vault generalizes the output. Each resource commits to a kind, opaque value reference, owner policy, and fresh identity material. The universal proof layer enforces shape, membership, non-membership, consume-once behavior, and completeness. The kind supplies the meaning.

For a FungibleV1 resource, the kind checks that signed quantities balance. For a non-fungible resource, it checks token identifiers and explicit mint or burn branches. For FiatOfferV1, it checks the sealed offer lifecycle and payment predicate. The same structural machinery carries different value semantics.

Why nullifiers and commitments are separate

The commitment says “some valid resource exists in the set.” The nullifier says “the secret that authorizes one member of that set has been used.” If the two identifiers were publicly linkable, spending would reveal the note's history. If no nullifier existed, the same private witness could be reused.

This separation gives post-deposit transaction privacy, not an invisible on-ramp. Depositing USDC on Ethereum is public. The privacy goal is to break the graph between that deposit and later private actions, then expose the withdrawal as another public edge.

Offers as resources

PayMoney does not deploy a conventional escrow contract with a mutable record. Posting creates an Open offer resource and points the selected fungible asset's owner policy at that offer instance. Claim consumes Open and creates Claimed. Solve, Cancel, and Expire consume the relevant live offer and produce no terminal offer object.

This inherits the strongest property of UTXOs: a transition accounts for concrete inputs exactly once. It adds a programmable answer to two questions the original model leaves fixed—who may consume the object, and what outputs that consumption is allowed to create.

Read logic-as-owner → · Inspect the offer lifecycle →