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:
- B submits a slash proposal on-chain with A's signed payload and posts a proposer bond
- A is immediately expelled from the committee, E3 continues with N-1 nodes if still above threshold
- The contract stores the hash of the public signals from A's signed payload
- A has a defense window (e.g. 1 hour) to regenerate the same proof with keccak and submit it on-chain
- If the keccak proof passes with the same public signals → A is innocent, B loses the bond
- 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:
- B broadcasts a
ProofFailureAccusation to all committee nodes
- All other nodes independently verify A's proof and attest whether it fails
- If a quorum of nodes confirms the proof is bad → B submits the attestations on-chain with
proposeSlash
- A is immediately expelled from the committee — E3 continues
- A can then generate a keccak proof and submit it on-chain to prove innocence
- 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
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:
Pros:
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:
ProofFailureAccusationto all committee nodesproposeSlashPros:
Cons:
cc @auryn-macmillan @ctrlc03 @ryardley @cedoor @0xjei