mirror of
https://github.com/luxfi/consensus.git
synced 2026-09-24 00:26:58 +00:00
The cert accept byte decoded with `ab != 0` and re-encoded as 1, so 254 byte values that the encoder can never produce still decoded — two byte strings naming one cert. Anything treating cert bytes as identity (the per-block serving cache, a dedup, a digest) can then be split by flipping a bit no field reads. A canonical codec refuses what it cannot reproduce: the accept byte is 0 or 1, and anything else is corrupt. Ingest dropped the equivocation evidence for a double-sign that arrives AFTER the height certifies. A double-signer racing the honest cert gains nothing, so that is precisely the ordering it picks — and the already-certified early return fired before the subject was recorded, discarding the second-execution evidence along with the vote. The signature verified; only the record of it was skipped. Evidence is a property of the signed votes, not of whether a cert exists, so it is now recorded before the early return. And a nil stake source is a rejection at the top of Ingest rather than a nil dereference at q.stake.ValidatorCount deep inside. The file documents nil as fail-closed; it was a remote crash, because every entry point takes peer data and the first verified attestation reached the deref. Co-authored-by: Hanzo Dev <[email protected]>