pub trait AccountabilityScope:
AccountableSafety
+ DoubleValidationCompleteness
+ CertifiedBlockWasExecuted
+ IncomingBundlesMatchTheLocalInbox
+ CommitRestsOnValidation { }Expand description
Remark (What accountability does not cover). Four exclusions, the third being the substantive one.
-
There is no adjudicator.
EquivocationProofis constructed and verified nowhere outside this module and its tests: no slashing operation consumes one, and no chain records one.AccountableSafetyestablishes convictability — that the evidence exists, is self-contained and verifies — not any protocol consequence. Wiring an adjudicator in would need a place to submit proofs and a stake to forfeit, neither of which exists today. -
Only equivocation is attributable, not silence. A validator that simply stops voting, or answers some clients and not others, produces no contradictory signature and is unconvictable. Liveness faults are outside the scheme by construction, which is why
linera_core::proof::assumptions::CorrectValidatorAvailabilityis an assumption rather than something enforced. -
Incorrect execution is not attributable, and its effects are not confined to one chain. Nothing in
EquivocationProofrelates a block’sProposedBlockto itsBlockExecutionOutcome. A validator that votes for exactly one block per round, with a sound chain, but whose block carries a fabricated outcome, yields no proof at all.This is worse than it first looks, because the outcome is eight separately committed components (
CertifiedBlockWasExecuted) and they differ sharply in reach. A wrongstate_hashstays on the chain. A wrongmessagesoreventsfield leaves it: the bundles are delivered into other chains’ inboxes and consumed by their blocks, and the events are read across chains throughOracleResponse::Event. Those downstream blocks are then themselves properly certified and are evidence of nobody’s fault. So even a hypothetical fraud proof would convict one block’s executors while leaving a transitively corrupted subgraph standing — and since Linera finalizes on confirmation rather than after a challenge window, none of it can be reverted. Of the eight, onlyblobsare self-verifying, being content-addressed.What the implementation has instead is local detection:
ChainWorkerState::execute_contiguous_blockre-executes the block and rejects a mismatch withChainError::CorruptedChainState. That is unilateral — the detecting node holds nothing transferable, and any peer must redo the work — and it is incomplete in three ways: the certificate’soracle_responsesare replayed into the re-execution rather than re-derived, so a fabricated oracle answer reproduces the same state hash and is never caught;preprocess_certified_blockdoes not execute at all, takingmessagesandeventsfrom the certificate; and theexecution_state_cachehit path skips re-execution.The properties that do protect against a bad outcome are
CertifiedBlockWasExecutedand, for the cross-chain component,IncomingBundlesMatchTheLocalInbox. Unlike everything else in this module both needMaxByzantineWeight: validity degrades above the fault bound with no forensic residue, whereas agreement degrades with one. -
The blame set is a threshold, not a census.
ConflictCompletenessnames a quorum intersection; other validators may have equivocated without appearing in it, and runningextract_equivocationson further certificate pairs may name more.