Draft the proposal
The organizer commits to the proposal terms, the voting window (start/end block heights) and the snapshot height in a tamper-evident descriptor. Publish the descriptor before the voting window opens — that is what makes the poll provably fair. Voting weight is the voter's PRL balance, read from Blockbook.
The voting rules (published with the descriptor)
- One address, one ballot. A second ballot from the same address is flagged — first valid ballot wins.
- Ballots are signed inside the voting window only (chain tip between start and end height).
- Weight = the voter's current confirmed PRL balance from Blockbook, recorded in the signed ballot. The snapshot height is the organizer's enforcement reference (see Honest limits).
- Every ballot signature is re-verified at tally time against the voter's address key. Wrong-key or tampered ballots are loudly refused.
- Exact ties are reported as a TIE — the page refuses to pick a winner out of thin air.
Proposal drafted
Carry this descriptor to Publish (or copy it now) and publish it publicly before block .
Publish the proposal
This is the tamper-evident commitment. Post the descriptor and the proposal JSON publicly (X, Discord, the DAO forum) before the voting window opens. Anyone can later re-hash the proposal and prove it was never altered.
No drafted proposal in this session yet — draft one on step 1, or paste a published descriptor below to review its commitment.
The commitment
- descriptorHash
- proposalHash
- optionsHash
- window
- snapshot height
Publish checklist
- Post the descriptor + proposal JSON where voters can find them (X, Discord, forum) before block .
- A descriptor that appears only after the window opens proves nothing — voters check this.
- After the window closes, anyone re-hashes the proposal JSON and compares it to the descriptor. Any edit changes
proposalHash/optionsHash.
Cast a signed ballot
Your ballot is signed locally, in this page — your key never leaves your browser. Publish the signed ballot JSON publicly; the organizer collects ballots into the Tally step.
Proposal verified
- proposalHash
- —
- voting window
- —
Ballot signed
✓ Signature verifies against your address key (checked locally before display).
Post this JSON where the organizer collects ballots (forum thread, Discord, X). The organizer imports it in the Tally step.
Tally the ballots
Import the published ballots. The page re-verifies every signature against the descriptor and each voter's address key, then derives the result step-by-step. Invalid ballots are refused loudly.
0 ballots imported.
The tally
Accepted ballots (signature re-verified)
| # | Voter | Choice | Weight | ballotHash |
|---|
⚠ Duplicate ballots rejected (first valid wins)
⚠ Rejected ballots
Result record
Verify a poll (standalone)
No trust in this page required. Paste the published proposal JSON and the ballots — the page re-derives the descriptor from the proposal, re-verifies every signature, and re-tallies. Any tampering gets a loud ✗ NOT PROVEN.
Proven
- descriptor
- descriptorHash
- valid ballots
- rejected
- result record
Honest limits
- No PRL ever moves through this page. It drafts proposals, signs ballots locally, tallies signed ballots, and verifies polls — governance results are social consensus, not on-chain execution. Pearl has no smart contracts; nothing on-chain enforces the outcome.
- Fairness is a signed-ballot protocol, not code: the guarantee is that the descriptor must be published before the voting window opens — anyone can then re-hash the proposal and re-verify every ballot signature. A descriptor that appears only after the window opened proves nothing.
- Voting weight is the CURRENT confirmed balance from Blockbook, not a read at the
snapshot height — Blockbook does not expose historical address balances. Snapshot-height enforcement is
the organizer's job; the claimed snapshot height is recorded inside every signed ballot so anyone can
cross-check it against their own
pearldnode. - Ballot relay is manual: voters publish signed ballots publicly (forum, Discord, X) and the organizer imports them. The page cannot prove when a pasted ballot was created — in-page signing refuses out-of-window votes, but pasted ballots rely on the organizer's honest collection.
- One address, one ballot — but nothing stops one person from voting under two different addresses. Know your voters.
- Keys entered on the Vote step live in page memory only and are never stored or sent anywhere; use the Wipe button when done.
- Blockbook is a third-party read source; for polls that decide real money, confirm heights and balances with your own
pearldnode — the manual-tip paths exist for exactly this. Block countdowns assume the 194-second target block time. - No real vote has been conducted through this page. All signatures and tallies were exercised in tests and headless-browser QA with synthetic keys.