Skip to content

[ZIP TBD] Shielded Voting Protocol: Submission Server#1218

Draft
p0mvn wants to merge 37 commits intozcash:mainfrom
valargroup:roman/submission-server
Draft

[ZIP TBD] Shielded Voting Protocol: Submission Server#1218
p0mvn wants to merge 37 commits intozcash:mainfrom
valargroup:roman/submission-server

Conversation

@p0mvn
Copy link
Copy Markdown

@p0mvn p0mvn commented Mar 18, 2026

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.

p0mvn and others added 30 commits March 4, 2026 19:17
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>
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>
p0mvn and others added 2 commits March 5, 2026 19:49
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
@p0mvn p0mvn changed the title Submission Server [ZIP TBD] Submission Server Mar 18, 2026
Comment on lines +423 to +441
- **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
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: We are currently working through these

Co-authored-by: Claude <noreply@anthropic.com>
@p0mvn p0mvn changed the title [ZIP TBD] Submission Server [ZIP TBD] Shielded Voting Protocol: Submission Server Mar 18, 2026
Co-authored-by: Claude <noreply@anthropic.com>
Comment on lines +220 to +229
$$\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.
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

p0mvn and others added 3 commits March 19, 2026 22:48
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants