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
| Proof | Verified by | What it proves |
|---|---|---|
| Owned and conserved | Solana Privacy Program | The notes exist, are unspent, belong to a hidden signer, and value is conserved. |
| Clean | The Ring program | Sender 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:
- The Ring program verifies the Clean proof against the current block list root.
- On a withdrawal, it checks that the exit fee leg to the fee vault is present at the rate the Ring account holds.
- It signs the Solana Privacy Program’s
ring_transactinstruction. The Solana Privacy Program moves a note of the Ring only on an instruction the Ring program signs. - 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
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:
| Kind | On the record | Off the record |
|---|---|---|
| Go off the record | The funding wallet, the asset and the amount. | Whose note it became. |
| Send | The relayer, the Ring program, two proofs and the relay cost. | Sender, recipient, asset and amount. |
| Go back on the record | The 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.