Skip to content

v1.3.3 — DAG-based view change + deterministic gas limit

Choose a tag to compare

@twobitapps twobitapps released this 09 Apr 18:45
· 28 commits to main since this release

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:

  1. View change triggers are now DAG-based, not wall-clock based.
    Both checkLeaderTimeoutLocked and checkInsufficientSupportTimeoutLocked
    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.

  2. Block gas limit is now inherited verbatim from the parent block.
    Previously the block header used nt.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 uses parentBlock.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.