mirror of
https://github.com/luxfi/consensus.git
synced 2026-09-24 00:26:58 +00:00
The far-past epoch bound was given a second door and a test file, and the test file drives the predicate. Where it calls the door it hands AcceptCatchupBlock a three-byte cert, which fails UnmarshalQuorumCert about forty lines before the epoch is read: the error it observes is a codec error, and it is asserted as proof of a safety property. Deleting the bound from both of its sites in catchup_accept.go leaves that file green. These drive the door with a real 4-of-5 cert -- the same assembly the liveness path accepts -- over a VM whose blocks carry an epoch, on a node stranded at N with the parent tracked. A block at N+1 stamped below its parent's epoch is refused, reaches VM.Accept zero times, and leaves the finalized height where it was. Epoch 0 under a live parent is the same attack with the cheapest payload. The forward-epoch case is admitted through identical machinery, differing only in the epoch, so the refusals are attributable to the bound and not to some earlier gate. It is also the half that matters for liveness: catch-up exists to serve exactly the history across which an honest chain's epoch advances, and a bound that froze the epoch rather than directing it would stop the fetch it was added to protect. Co-authored-by: Hanzo Dev <[email protected]>