Skip to content

Accord juror draw — Merkle Snapshot, off-chain sortition, distinct Jurors, VRF

Jurors are drawn for a Dispute from a Merkle-rooted Snapshot of the Subaccord's Juror set and cumulative stakes, committed optimistically at Dispute creation and protected by a 1-day fraud-proof window (poster bonds 1× the Dispute's max appeal fee). The draw consumes VRF to select N distinct Jurors via a cumulative-stake lookup, proving each membership on-chain. This is the only option that scales to an unbounded Juror pool within Solana's account/compute limits without an O(n) write on every stake.

Considered Options

  • Capped on-chain roster + weighted draw (Kleros-style): simplest and fully on-chain, but caps each Subaccord (~256 Jurors) and lets one Juror hold multiple slots (weight). Rejected for v1 — the cap is a real ceiling and the project chose to build for scale from day one.
  • On-chain paginated Juror ledger: no cap, but a heavy write on every stake/unstake and high complexity.
  • Per-dispute draw via remaining_accounts: blows the 128-account / compute limit past ~64 Jurors.

Consequences

  • An off-chain indexer is required to produce the Snapshot root; the fraud-proof is the trust anchor.
  • Distinct Jurors (weight always 1) flatten the coherence slash to a per-Juror α · min_stake, so a whale drawn once risks the same absolute slash as a minimum staker — a weaker per-draw whale signal than Kleros's weighted model. Accepted for v1; revisit if dispute data shows whale misbehaviour.
  • Unstake is gated by a per-Juror active_draws counter: stake is frozen (Kleros §4.2.2) until every Dispute a Juror was drawn into reaches a final Ruling.