v1.3.3 — DAG-based view change + deterministic gas limit
DAG-based view change + deterministic gas limit
Follows up on v1.3.1 (four-way fork fix) by eliminating the last two sources
of cross-validator non-determinism observed on the 4-validator testnet:
-
View change triggers are now DAG-based, not wall-clock based.
BothcheckLeaderTimeoutLockedandcheckInsufficientSupportTimeoutLocked
now fire when the local DAG has advanced past the leader round by a fixed
round count (8 and 12 rounds respectively), not after N milliseconds of
elapsed wall clock. Because the DAG converges via gossip, all validators
reach the decision point at the same logical moment. Previously, validator
A's timer could fire for wave W while B was still committing W normally,
giving them divergent committed sequences. -
Block gas limit is now inherited verbatim from the parent block.
Previously the block header usednt.dynamicScaler.GetCurrentGasLimit(),
which adjusts based on locally-observed TPS and therefore differs per
validator. Observed at block 254 on testnet: val-1 produced
gasLimit=30,180,000 while val-4 produced 30,000,000 for the same commit.
Every other header field matched; only gasLimit differed. Now every
validator usesparentBlock.Header.GasLimit, which is identical across
nodes. Dynamic scaling still tracks its internal target for metering, but
header-visible changes need a deterministic epoch mechanism (future work).
Testnet verification
All 4 validators on the Digital Ocean testnet now produce identical block
hashes past block 254 (previous divergence point) — the chain stays in
consensus indefinitely with the full determinism pipeline in place.
Upgrade notes
Chain data MUST be wiped on upgrade.