[ZIP TBD] Shielded Voting Protocol: Submission Server#1218
[ZIP TBD] Shielded Voting Protocol: Submission Server#1218p0mvn wants to merge 37 commits intozcash:mainfrom
Conversation
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
The VAN commitment formula was written as a single 7-input Poseidon hash, but the implementation uses two separate invocations: ConstantLength<6> for the structural fields, then ConstantLength<2> to fold in the commitment randomness. These produce different outputs because each layer finalizes with its own padding before the next begins. Split the formula into two steps in all four places it appears: the VAN data structure definition, VAN integrity in the Delegation Proof, and old/new VAN integrity in the Vote Proof.
The Share Reveal circuit has 7 public inputs with no anchor_height — only the Vote Proof (ZKP #2) includes it. The tree root alone is sufficient to anchor to a specific tree state. Removed from three places: the Vote Reveal Proof public inputs list, the out-of-circuit verification step, and the Share Reveal Message table.
The circuit constrains only the x-coordinates of the El Gamal ciphertext (two field elements), not full curve points. The full points are carried in the share reveal message for homomorphic accumulation during tally, but the ZKP only needs x-coordinates for the Poseidon-based share commitment binding. Using full points as public inputs would double the instance cells for no security gain, and an implementer following the old spec literally would produce an incompatible circuit.
Shielded voting ZIP: fix spec-vs-implementation discrepancies Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
| - **Share decomposition strategy.** The Voting Protocol | ||
| ZIP [^voting-protocol] specifies $N_s = 16$ shares per vote but | ||
| leaves the decomposition strategy (how the ballot count is split | ||
| across shares) as an open design decision. A powers-of-two | ||
| decomposition (where each share carries a standard denomination like | ||
| $2^0, 2^1, \ldots, 2^{15}$ ballots) would make shares from | ||
| different voters indistinguishable by amount, strengthening the | ||
| mixing guarantee. However, this requires additional circuit work to | ||
| prove that the decomposition is valid. The choice of decomposition | ||
| strategy directly affects the submission server's mixing | ||
| effectiveness. | ||
| - **Client confirmation via PIR.** Voters currently have no | ||
| privacy-preserving way to confirm that their shares were submitted. | ||
| A PIR-based confirmation mechanism (querying the vote chain for | ||
| share nullifiers without revealing which nullifiers are being | ||
| checked) would close this gap. The Nullifier PIR | ||
| ZIP [^pir-governance] provides a foundation, but adapting it for | ||
| share nullifier queries requires additional specification. | ||
| - **Balance amendment.** A voter who is the sole participant on an |
There was a problem hiding this comment.
Note: We are currently working through these
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
| $$\mathsf{delay} \leftarrow \mathsf{Uniform}(0, \; \mathsf{vote\_end\_time} - \mathsf{now})$$ | ||
|
|
||
| This ensures that shares from a single voter are spread across the | ||
| entire remaining window and interleaved with shares from other voters. | ||
| The server MUST NOT batch shares from the same session or submit them | ||
| in receipt order. | ||
|
|
||
| A server that receives a share with less than a configurable minimum | ||
| remaining window (e.g., 10 minutes) SHOULD submit it promptly rather | ||
| than risk missing the deadline. |
There was a problem hiding this comment.
Note: We are further revisiting the handling of this.
Considering sampling randomization from a mean of 1 weak, so that for those who submit early in the voting process, there is sufficient time to check the confirmation of share submission and retry, if necessary.
We are also specifying in more detail how to handle submissions near the end of the voting round. For example, in the last hour. The current plan is to set the maximum possible choice of the randomly sampled submission time to be vote_end_time - 0.1 (vote_end_time - now).
If someone starts voting in the last 5 seconds, and the vote is not submitted in time, it is discarded.
Once the above discussions are settled, the ZIP will be updated.
Co-authored-by: Claude <noreply@anthropic.com>
…ment voting - Replace server-side uniform random delay with client-specified submit_at timestamps - Add Last-Moment Voting section: single-share mode when voting near deadline - Define last-moment buffer formula (10% of round duration, capped at 1 hour) - Update privacy implications for client-controlled timing and last-moment trade-offs - Rewrite rationale sections to reflect new design
…delay Submission server ZIP: client-controlled timing and last-moment voting
91f9224 to
8c280af
Compare
Introduces a new draft ZIP specifying the submission server for the Shielded Voting Protocol #1200.
The submission server is responsible for temporal mixing in the Zcash shielded voting system. The server receives encrypted vote shares from voters and submits them to the vote chain at randomized intervals, destroying timing correlations that would otherwise leak voter balance information.