How a transfer works

One send, from the owner’s signature to the settled transaction, and what the chain holds afterwards.

Notes in, notes out

An off-record balance is a set of notes. Each note holds one asset and one amount, and only its owner’s keys can read or spend it.

A send spends notes the sender holds and creates new ones in the same transaction: a note for the recipient, and a note that returns the remainder to the sender. The amounts spent equal the amounts created plus what leaves in public, so no value appears or disappears.

The recipient is a normal Solana address. The Ring’s enrollment registry maps that address to the shielded keys its account registered, and the new note is made out to those keys.

The signature

The owner signs the transfer’s message with their wallet. That signature does not travel in the transaction. It goes into the proof, which shows that the owner of the spent notes signed this exact transfer and does not say who that owner is.

The two proofs

ProofVerified byWhat it proves
Owned and conservedSolana Privacy ProgramThe notes exist, are unspent, belong to a hidden signer, and value is conserved.
CleanThe Ring programSender and every recipient are absent from the block list, and the transfer is sealed as the Ring requires.

Both are zero-knowledge proofs: the chain checks that each statement is true and learns nothing else about the transfer. The prover that makes them is the one the SDK is pointed at, set by proverUrl in the client options.

The clean-funds proof and the block list covers the second proof.

Settlement

The finished transfer goes to the relayer, which submits it as one Solana transaction. Inside that transaction:

  1. The Ring program verifies the Clean proof against the current block list root.
  2. On a withdrawal, it checks that the exit fee leg to the fee vault is present at the rate the Ring account holds.
  3. It signs the Solana Privacy Program’s ring_transact instruction. The Solana Privacy Program moves a note of the Ring only on an instruction the Ring program signs.
  4. The Solana Privacy Program verifies the Owned and conserved proof, marks the spent notes with their nullifiers, adds the commitments of the new notes, and moves any public leg.

Proof verification, the note updates and the asset movement land together or not at all.

What the chain shows

Inside the Ring

Sender
Recipient
Asset
Amount
Notes spent
Notes created
Auditor

What the chain shows

Fee payer
The relayer
Program
The Ring
First proof
Owned and conserved
Second proof
Clean
Spent
Two nullifiers
Created
Two commitments
Relay cost
Paid to the relayer
One send. Left: what stays inside the Ring. Right: what the settled transaction shows to anyone.

A nullifier marks a note as spent without pointing to it, and a commitment fixes a new note without showing its owner, asset or amount. Each kind of transfer leaves this much in public:

KindOn the recordOff the record
Go off the recordThe funding wallet, the asset and the amount.Whose note it became.
SendThe relayer, the Ring program, two proofs and the relay cost.Sender, recipient, asset and amount.
Go back on the recordThe destination, the asset, the amount and the exit fee.Which account it left.

A send to an address with no Offrecord account settles as a withdrawal to that address: the recipient holds the asset on the record, and the sender is not named on chain.

The recipient finds it

Nothing is delivered to the recipient. Their account scans the Ring’s history with its viewing key, recognises its own notes by their tags, and opens them. The payment then shows in their activity with its sender and amount, visible only to them.

In the SDK this is account.sync(), and account.subscribe() fires when a scan finds new notes.