Skip to content

Slashing: keccak vs poseidon proof constraint, need a fault attribution approach that doesn't halt E3s #1371

Description

@hmzakhalid

Context

Our current slashing design uses signed proofs with on-chain re-verification, if a node's signed proof fails verification on-chain, we slash them. On-chain verification requires proofs generated with oracle_hash: keccak.

However, keccak proofs cannot be verified inside recursive circuits. The recursive aggregation wrappers require proofs generated with oracle_hash: poseidon. @ctrlc03 reached out to Aztec and they confirmed, if we need both on-chain verification and recursive aggregation, we must generate two separate proofs per circuit (one keccak, one poseidon).

This would roughly increase total proof count per party by 33%. That's a significant performance hit on every E3, just to support a slashing path that fires <0.1% of the time.

Issue

If we only generate poseidon proofs (to keep recursive aggregation working), we lose the ability to directly re-verify proofs on-chain for slashing. So when a node sends a bad signed proof, we need an alternative way to handle it.

Approach A: Proposer Bond

When Node B detects a bad proof from Node A:

  1. B submits a slash proposal on-chain with A's signed payload and posts a proposer bond
  2. A is immediately expelled from the committee, E3 continues with N-1 nodes if still above threshold
  3. The contract stores the hash of the public signals from A's signed payload
  4. A has a defense window (e.g. 1 hour) to regenerate the same proof with keccak and submit it on-chain
  5. If the keccak proof passes with the same public signals → A is innocent, B loses the bond
  6. If it fails or A doesn't respond → A is slashed, B gets the bond back + a reporter reward

Pros:

  • E3 doesn't halt, accused node is expelled immediately

Concern: rational apathy, why would B risk a bond to report A, when B could just let the E3 timeout and still get refunded for work done? To address this, B needs to be meaningfully rewarded for successful reports (e.g. a % of A's slashed stake), and slashed nodes should be excluded from the refund pool so honest nodes get a larger share.

Approach B: Committee Attestation

When Node B detects a bad proof from Node A:

  1. B broadcasts a ProofFailureAccusation to all committee nodes
  2. All other nodes independently verify A's proof and attest whether it fails
  3. If a quorum of nodes confirms the proof is bad → B submits the attestations on-chain with proposeSlash
  4. A is immediately expelled from the committee — E3 continues
  5. A can then generate a keccak proof and submit it on-chain to prove innocence
  6. If it passes → no slash. If it fails → A is slashed.

Pros:

  • No bond required from the reporter (quorum replaces bond as anti-griefing)
  • E3 doesn't halt

Cons:

  • Requires gossip protocol for accusation voting
  • Need to handle: what if A sent different proofs to different nodes (equivocation)?
  • More complex implementation (vote collection, timeout logic, threshold counting)

cc @auryn-macmillan @ctrlc03 @ryardley @cedoor @0xjei

Metadata

Metadata

Assignees

Labels

ciphernodeRelated to the ciphernode packagenoirTask related to the noir fork or noir focussed code

Type

No type
No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions