mirror of
https://github.com/luxfi/consensus.git
synced 2026-09-24 00:26:58 +00:00
Catch-up reported both as ErrCatchupCertRejected. They have opposite remedies: a rejected cert means ask a different peer, a missing ancestor means ask this peer for the ancestor. Collapsed into one value, the only move the requester made was the one move that could not work, since every peer serves the same envelope -- and the operator-visible string said "forged/sub-quorum cert" about a block that was neither, followed by a bare "not found" that named nothing. The node reaching this holds byte-identical execution to its peers. It has the right inner block at the parent height under its own wrapper; the network names a different wrapper of that same block; the outer-parent lookup misses and falls through to asking the inner chain for an eth block whose hash is an outer id, which can never hit. The wrapper is what is missing, and a wrapper is fetchable. The blanket skip below the settled height went with it. "At or below settled" is not "already ours": the envelope such a node needs arrives inside that band and was discarded unexamined, hundreds of entries per batch, which is why a batch could report everything skipped while the node advanced nothing. Now only a block this VM actually holds is skipped; the rest is verified so the envelope resolves and is stored. That path decides nothing -- the inner block at that height is already applied, so the inner VM returns immediately, and nothing is tracked, voted, accepted, or folded into the ledger. Only database.ErrNotFound takes the new name, matched through wrapping, so a genuinely bad block still rejects and this cannot launder one into a retry loop. Co-authored-by: Hanzo Dev <[email protected]>