Skip to content

security(contracts): support verifier sets and quorum-based proof acceptance - #257

Open
emmyokolo2525-cyber wants to merge 1 commit into
harpocrates-stellar:mainfrom
emmyokolo2525-cyber:security/verifier-sets-quorum-126
Open

security(contracts): support verifier sets and quorum-based proof acceptance#257
emmyokolo2525-cyber wants to merge 1 commit into
harpocrates-stellar:mainfrom
emmyokolo2525-cyber:security/verifier-sets-quorum-126

Conversation

@emmyokolo2525-cyber

Copy link
Copy Markdown
Contributor

Summary

Implements bounded, versioned verifier sets with configurable m-of-n quorum acceptance for the Harpocrates Soroban registry.

Closes #126


Contract changes

New types

  • VerifierSetRecord — scalar contracttype (Soroban no-generics constraint); members stored at VerifierSetMember(version, index)
  • QuorumResultApproved | Rejected | Unavailable | VersionMismatch | Pending

New entry points

Method Description
propose_verifier_set_1/2/3 Admin-only; stores pending set with VERIFIER_SET_TIMELOCK_SECS (300 s) unlock
activate_verifier_set Promotes pending set after timelock; atomically retires previous active set
disable_verifier_set Emergency disable — blocks future use, does not roll back past proofs
register_anon_verified_quorum Calls all members via try_invoke_contract, tallies inline, only writes state on Approved
get_active_verifier_set / get_verifier_set Read-only queries

Quorum logic

Bounds

  • Proof ≤ 64 KB, public_inputs ≤ 4 KB
  • Members per set ≤ 16
  • Active set versions ≤ 8

New error codes

VerifierSetNotFound(14), QuorumNotReached(15), DuplicateVote(16), VerifierSetDisabled(17), VerifierSetNotActive(18), VersionMismatch(19), ProofTooLarge(20), VerifierSetFull(21), TooManyVerifierSets(22), TimelockNotExpired(23), NoPendingVerifierSet(24), InvalidThreshold(25)

New contract events

VerifierSetProposed, VerifierSetActivated, VerifierSetDisabledEvent, QuorumFinalized

Backward compatibility

All existing methods (set_verifier, register_anonymous_verified, register_source, register_seal, etc.) are fully preserved.


Tests — test_verifier_sets.rs (26 new tests)

Covers every acceptance criterion from the issue:

  • ✅ Propose / activate / disable lifecycle
  • ✅ Timelock enforcement (panics before expiry, passes after)
  • ✅ Quorum approval: 1-of-1, 2-of-3
  • ✅ Split decision / majority reject
  • ✅ Unavailable verifiers (failures exceed allowance)
  • ✅ Version mismatch (all failures + circuit_version)
  • ✅ Rotation overlap (v1 retired atomically when v2 activates)
  • ✅ Emergency disable blocks new proofs
  • ✅ Duplicate nullifier replay rejected
  • ✅ Duplicate proof_id rejected
  • ✅ Oversized proof rejected
  • ✅ No active set → VerifierSetNotFound
  • ✅ Backward compat with legacy register_anonymous_verified
  • ✅ Non-admin rejected on all privileged calls

Result: 103 passed; 0 failed


Frontend changes

  • stellarTypes.ts: useQuorum?: boolean on input types; all new RegistryMethod entries
  • harpocratesRegistry.ts: methodForTier routes to register_anon_verified_quorum when useQuorum=true; admin helpers proposeVerifierSet, activateVerifierSet, disableVerifierSet, getActiveVerifierSet

What was tested

  • cargo test: 103 passed, 0 failed
  • tsc --noEmit: clean

…eptance

Implements bounded, versioned verifier sets with configurable m-of-n
quorum acceptance for the Harpocrates registry (harpocrates-stellar#126).

## Contract changes (lib.rs)

- VerifierSetRecord: versioned scalar contracttype (members stored at
  indexed keys VerifierSetMember(version, index) to comply with
  Soroban's no-generics-in-contracttype constraint)
- QuorumResult enum: Approved / Rejected / Unavailable / VersionMismatch / Pending
- propose_verifier_set_1/2/3: admin-only proposal with
  VERIFIER_SET_TIMELOCK_SECS (300 s) staged rotation guard
- activate_verifier_set: promotes pending set after timelock, atomically
  retires the previously active set
- disable_verifier_set: emergency disable; blocks future use without
  touching already-accepted proofs
- register_anon_verified_quorum: calls every member via
  try_invoke_contract, tallies inline, commits nullifier + record only
  on Approved; emits QuorumFinalized event regardless of outcome
- Bounds: proof ≤ 64 KB, public_inputs ≤ 4 KB, members ≤ 16,
  versions ≤ 8
- All existing entry points preserved for backward compatibility

## New error codes
VerifierSetNotFound(14), QuorumNotReached(15), DuplicateVote(16),
VerifierSetDisabled(17), VerifierSetNotActive(18), VersionMismatch(19),
ProofTooLarge(20), VerifierSetFull(21), TooManyVerifierSets(22),
TimelockNotExpired(23), NoPendingVerifierSet(24), InvalidThreshold(25)

## New events
VerifierSetProposed, VerifierSetActivated, VerifierSetDisabledEvent,
QuorumFinalized

## Tests (test_verifier_sets.rs — 26 new tests)
Covers: propose/activate/disable lifecycle, timelock enforcement,
quorum approval (1-of-1, 2-of-3), split decisions, unavailable
verifiers, version mismatch boundary, rotation overlap, emergency
disable, duplicate nullifier replay, duplicate proof_id, oversized
proof bounds, backward compat with legacy register_anonymous_verified

Result: 103 passed; 0 failed

## Frontend changes
- stellarTypes.ts: useQuorum field on RegisterProofInput /
  NormalizedRegisterProofInput; new RegistryMethod entries for all
  verifier-set and quorum contract functions
- harpocratesRegistry.ts: methodForTier routes to
  register_anon_verified_quorum when useQuorum=true; new admin helpers
  proposeVerifierSet, activateVerifierSet, disableVerifierSet,
  getActiveVerifierSet

Closes harpocrates-stellar#126
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.

security(contracts): support verifier sets and quorum-based proof acceptance

1 participant