V0.5 Testnet · Once per chain
Registration
Registration gives your Open-mode wallet a Noid identity: one transaction per chain, from your real address, storing your userCommitment and your encryption public key. In the wallet you switch to Noid, pick the funded chains, and tap Register.
Sent by
Your wallet
Proof
None
Gas
Paid by you
Stores
userCommitment + encPub
Your wallet
signs menoid_Wallet
no gas
Wallet generator
sk · spendPk
encPriv · encPub
Your address
sends register()
one transaction
NoidPool
stores it
once, for good
In the wallet
on your device
- 1Signs menoid_Wallet — a signature, not a transaction.
- 2Derives the two key pairs and your userCommitment.
- 3Sends
register(userCommitment, encryptionPublicKey)from your real address.
Inside NoidPool
- 4Requires a non-zero userCommitment, and an encryption key of 65 bytes starting with 0x04 (on EVM).
- 5Requires the address isn’t registered yet — registering is one-time and permanent; nobody, you included, can re-point an address later.
- 6Stores
registered[you] = userCommitmentandencryptionKeys[you] = encPub, and emitsWalletRegistered.
The relayer registers too, when the pool is deployed: its commitment is stored as the immutable relayerCommitment, and every circuit is bound to it.
Why the encryption key goes on-chain too
A sender needs two things: your userCommitment, to lock the note to you, and your encryption key, to seal it so only you can read it. The commitment is a hash — the key can’t be recovered from it. When only the commitment was on-chain, the key lived in a server’s database, and a missed lookup made a registered wallet look unregistered, so the sender fell back to a public withdraw. A privacy wallet must never send in the clear by accident — so both now come from one on-chain read:
| Chain | Read |
|---|---|
| EVM | registrationOf(address) → (bytes32, bytes) |
| Aptos | pool::registration_of(pool, addr) → (bool, u256, vector<u8>) |
| Sui | pool::registration_of(state, addr) → (bool, u256, vector<u8>) |
| Solana | the Registration PDA, which holds both |
An address that never registered answers (false, 0, empty) instead of reverting, so “not registered” is never confused with “the node didn’t answer”.
On-chain, anyone can see
- That this address enabled Noid mode
- Its userCommitment and encryption public key
Stays private
- Your spending and encryption private keys
- Your balance and activity
