Three fixes for single-node consensus (--dev mode, K=1):
1. Self-voting: when K=1 and all sampled validators are self, deliver
a self-vote via callback instead of polling 0 peers.
2. Block acceptance: call Verify() before Accept() — PlatformVM requires
block state prepared during Verify(). Without it, Accept() fails
silently due to missing block state.
3. DrainAccepted: after each VM notification, check for blocks that
consensus accepted and call their Verify+Accept pipeline.
Multi-node consensus (K>1) is unchanged — self-voting only activates
when K=1 and no external validators exist in the sample.
Tests:
- TestSingleNodeSelfVote: K=1 self-votes, no network queries
- TestMultiNodeDoesNotSelfVote: K=3 uses network, no self-vote
- TestSelfVoterNilWhenKGreaterThan1: callback only for K=1
Fixed SimpleConsensus.Vote() to set finalized=true even when block
is already accepted. Previously, only the first node to vote would
finalize, causing tests to fail with only 1/N nodes finalized.
Changes:
- Modified Vote() to separate block acceptance from finalization
- Now sets finalized=true for any valid block, regardless of status
- Added network-wide finalization check with 50% threshold
- Implemented parallel polling (10% of nodes per round) for faster convergence
Results:
- TestRandomizedConsistency: PASS (1 round convergence)
- TestPropertyBasedConsensus: ALL PASS
- TestConsensusAtScale: PASS (up to 1000 nodes)
- TestChaosConsensus: PASS
Outstanding: TestNetworkScalability and TestDAGConsensus use different
simulation framework and require separate investigation.