04

V1 Mainnet · Once per chain

Registration

Before your first private action, your address registers once on each chain: one transaction that publishes your userCommitment and your viewing public key. From then on, anyone can pay you privately at your normal address.

Sent by

Your wallet

Proof

None

Gas

Paid by you

Stores

userCommitment + ivkPub

Your wallet

signs the key message

no gas

signature

Menoid app

derives your keys

checks registrationOf

uc + ivkPub

Your wallet

sends register()

one transaction

transaction

NoidPool

stores your identity

once per address

In your browser

nothing leaves this tab

  1. 1The app asks your wallet to sign the key message — a signature, not a transaction.
  2. 2It derives your keys from the signature: sk, nk, ivk, ovk and your userCommitment.
  3. 3It calls registrationOf(address). Already registered with this userCommitment? Then you’re signed in — nothing else to do.

Your wallet

  1. 4Sends register(userCommitment, ivkPub) — ivkPub of epoch 0, 65 bytes.

Inside NoidPool

  1. 5Refuses an address that is already registered.
  2. 6Checks the userCommitment is non-zero, inside the field, and not already claimed by another address. An honest commitment contains its own address, so copying someone else’s is the only way to collide.
  3. 7Checks the viewing key is 65 bytes starting with 0x04 — an uncompressed secp256k1 key.
  4. 8Stores your registration (userCommitment, viewing key, key index 0, epoch 0) and emits Registered(wallet, userCommitment, viewingPublicKey).

How a sender finds you

registrationOf(address) returns (userCommitment, viewingPublicKey, keyIndex, viewingEpoch). A sender needs the first two: the userCommitment to lock the note to you, the viewing key to encrypt it so only you can read it. Both come from one call to the chain — no server sits between a sender and the answer.

Paying someone who never registered

The app finds an empty registration and offers the public way instead: an unmask straight into their wallet. It tells you before you confirm.

Changing keys later

FunctionWhat changesWhen
updateViewingKey(ivkPub)Viewing epoch + 1: new ivk and ovk for new notes. Same identity, same balance.Fresh viewing keys — e.g. after sharing an epoch key.
rotateKeys(uc, ivkPub)Key index + 1: a whole new identity (new sk, nk, ivk, ovk).If your signature ever leaked. Notes locked to the old identity still need the old keys.

On-chain, anyone can see

  • That this address uses Menoid
  • Its userCommitment and viewing public key

Stays private

  • Your keys
  • Your balance and activity — there is nothing to see yet