Delegator Vote Descriptions
Each delegator vote contains an DelegatorVoteBody and a zk-SNARK delegator vote proof.
Delegator Vote zk-SNARK Statements
The delegator vote proof demonstrates the properties enumerated below for the following private witnesses known by the prover:
- Note amount (interpreted as an ) and asset
ID
- Note blinding factor used to blind the note commitment
- Address associated with the note being spent, consisting of diversified basepoint , transmission key , and clue key
- Note commitment
- Spend authorization randomizer used for generating the randomized spend authorization key
- Spend authorization key
- Nullifier deriving key
- Merkle proof of inclusion for the note commitment, consisting of a position
pos
and an authentication path consisting of 72 elements (3 siblings each per 24 levels)
And the corresponding public inputs:
- Merkle anchor of the state commitment tree
- Balance commitment to the value balance
- Nullifier of the note to be spent
- Randomized verification key
- The start position
start_pos
of the proposal being voted on
Start Position Verification
The zk-SNARK certifies that the position of the staked note pos
is less than the position of the proposal being voted on:
pos < start_pos
This demonstrates that the staked note used in voting existed prior to the proposal.
The zk-SNARK also certifies that the commitment index of the start position is zero.
Note Commitment Integrity
The zk-SNARK certifies that the note commitment was derived as:
.
using the above witnessed values and where ds
is a constant domain separator:
ds = from_le_bytes(BLAKE2b-512(b"penumbra.notecommit")) mod q
Balance Commitment Integrity
The zk-SNARK certifies that the public input balance commitment was derived from the witnessed values as:
where is a constant generator and is an asset-specific generator point derived as described in Value Commitments. For delegator votes, .
Nullifier Integrity
The zk-SNARK certifies that the revealed nullifier was derived as:
using the witnessed values above and where ds
is a constant domain separator:
ds = from_le_bytes(BLAKE2b-512(b"penumbra.nullifier")) mod q
as described in Nullifiers.
Diversified Address Integrity
The zk-SNARK certifies that the diversified address associated with the note was derived as:
where is the witnessed diversified basepoint and is the incoming viewing key computed using a rate-2 Poseidon hash from the witnessed and as:
ivk = hash_2(from_le_bytes(b"penumbra.derive.ivk"), nk, decaf377_s(ak)) mod r
as described in Viewing Keys.
Spend Authority
The zk-SNARK certifies that for the randomized verification key was derived using the witnessed and spend auth randomizer as:
where is the conventional decaf377
basepoint as described in The Decaf377 Group.
Merkle Verification
The zk-SNARK certifies that the witnessed Merkle authentication path is a valid Merkle path to the provided public anchor.
Diversified Base is not Identity
The zk-SNARK certifies that the diversified basepoint associated with the address on the note is not identity.
Spend Authorization Key is not Identity
The zk-SNARK certifies that the spend authorization key is not identity.