mirror of
https://github.com/luxfi/evm.git
synced 2026-09-24 00:27:44 +00:00
The host side of the 0x9999 native C<->D atomic seam, and the consensus-liveness fix Red found. THE BUG: Block.Accept applied the staged atomic ops to shared memory FIRST (sm.Apply, no batch -> committed immediately) and advanced the node-local seq marker LATER, in a separate versiondb.Commit(). atomic.SharedMemory.Apply is NOT idempotent (duplicate Put errors). A crash BETWEEN them left shared memory mutated but the marker unadvanced; on restart the same parent->current window re-collected, sm.Apply re-applied the present Put, errored, and Accept returned fatal -> the chain HALTED. THE FIX (mirrors chains/dexvm commitAtomic): flushDexAtomic -> stageDexAtomic stages the advanced dexAtomicSeqKey marker INTO the versiondb in-memory layer and returns (reqs, sm). Block.Accept snapshots the versiondb (marker + lastAccepted) via CommitBatch() and passes it to sm.Apply(reqs, batch) — its WriteAll commits the shared-memory mutation AND the batch in ONE database write. The marker advance and the SM mutation are now all-or-nothing: a crash applies-and-marks both or neither, and a re-accept of an applied window sees an advanced marker -> empty window -> no duplicate Put -> no halt. With no atomic ops the plain versiondb.Commit() path is unchanged. Also: core/precompile_overrider.go wires CallIndex() through the EVM accessible- state adapter; precompile/registry/bridge.go + precompile/contract/atomic.go forward the optional contract.AtomicState capability to luxfi/precompile. Regression for the closed halt window lives in precompile native_haltwindow_test.go (unit). The live-path test (real versiondb + crash injection) is CI-only (CGO + luxfi/accel LUXCPP). Local symbol-resolution proof: CGO_ENABLED=0 go build ./plugin/evm/ compiles clean.