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

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions