Skip to main content

Key Hierarchy

zkTelos uses a hierarchy of cryptographic keys derived from a single root spending key. Each key serves a specific purpose in the protocol.

Key Derivation Chain​

Spending Key (σ)
│
▼ σ × G (JubJub elliptic curve)
Transaction Verifier Key (A)
│
▼ Poseidon(A.x)
Intermediate Key (η)
├──► Nullifier calculation
├──► Incoming note decryption (via Receiving Key)
├──► Outgoing viewing key (κ) derivation
└──► Private payment address (d, Pd) derivation

Key Types​

Spending Key (σ)​

A 256-bit secret key — the root of the entire key hierarchy. Used to sign transactions and derive all other keys.

In the zkTelos Wallet, the spending key is derived deterministically from a signature produced by the user's Web3 wallet (MetaMask, etc.), so no separate backup is needed.

Transaction Verifier Key (A)​

Derived from the spending key via scalar multiplication on the JubJub elliptic curve:

A = σ × G

Used to verify transaction signatures.

Intermediate Key (η)​

Derived from the transaction verifier key via the Poseidon hash function:

η = Poseidon(A.x)

Used for:

  • Computing account nullifiers (prevents double-spending)
  • Deriving the receiving key (to decrypt incoming notes)
  • Deriving the outgoing viewing key
  • Constructing private payment addresses

Receiving Key​

A combination of the intermediate key (η) and an ephemeral key generated per note. Used to decrypt incoming notes from the memo block.

Outgoing Viewing Key (κ)​

Derived from the intermediate key:

κ = keccak256(η, "this is the suffix for the symmetric encryption key")

Decrypts the memo block for transactions you initiated (outgoing). Not currently exposed as a user-facing feature in zkTelos.

Private Payment Address (d, Pd)​

A pair of values derived from η:

Pd = η × ToSubGroupHash(d)

Where d is a random diversifier. Multiple private addresses can be generated from the same account — they all resolve to the same recipient but are unlinkable on-chain.

Security Properties​

  • All keys (except the private payment address) must be kept secret
  • The spending key is never transmitted — only used locally in the wallet
  • Compromising the intermediate key (η) reveals incoming note amounts but cannot be used to spend funds
  • Only the spending key (σ) can authorize transfers and withdrawals