mirror of
https://github.com/luxfi/evm.git
synced 2026-09-24 00:27:44 +00:00
TASK 1 — sub-second block rate. TargetBlockRate is uint64 SECONDS and header.Time is Unix seconds; the sole cadence chokepoint was vm.go minNextBuildTime = time.Unix(header.Time+TargetBlockRate, 0) (whole-second). New opt-in config MinBlockBuildInterval (JSON min-block-build-interval, default 0 = disabled) decouples ONLY the block-BUILD cadence from the (unchanged, second-granular) fee window: when set, minNextBuildTime/nextBuildTime pace off sub-second wall-clock. header.Time stays Unix seconds (a consensus-critical geth field); two sub-second blocks may share a second-granular header.Time (EVM-spec-legal, non-decreasing). Unset ⇒ mainnet BYTE-IDENTICAL. The proposervm above supplies sub-second ordering via UnixMilli (node v1.36.19). TASK 2 — parallel EVM backend fail-closed. The per-tx cevm/revm executors returned (nil,nil) stubs and the old guard SILENTLY fell through to the Go EVM — an operator selecting revm/cevm unknowingly ran geth. New CheckTxResult errors the block instead of silently degrading; SetBackend rejects unregistered backends; RegisterExecutor documents the consensus-safety invariant (an executor MUST commit to the canonical StateDB — the Go BlockSTMExecutor does not, so it stays unregistered → no fork). revm/cevm remain build-tag-gated stubs; NONE is or can silently become the default execution path (the parallel==serial determinism gate is unmet). Go serial EVM stays default. Cryptographer-reviewed (adversarial): SAFE TO PUBLISH — default-unset = mainnet byte-identical and no-silent-nondeterministic-execution both verified from code; fee math under same-second blocks has no base-fee collapse, no consensus split, no overflow. One MEDIUM (evm_setBackend stub-halt) applies ONLY to -tags revm/cevm GPU-accel builds (inert for the mainnet pure-Go image) — fast-follow: don't register non-executable stubs. Tests green (pacing, fail-closed selection, config). Co-authored-by: Hanzo Dev <[email protected]>