Scope: Build the local Lighthouse and ETH2030 images as needed, launch the Kurtosis full-feature devnet in the eth2030-devnet enclave, and verify block production plus basic EL/CL health.
Planned Verification:
cd ../lighthouse && docker build -t eth2030cl:local .cd pkg && docker build -t eth2030:local .cd pkg/devnet/kurtosis && ./scripts/cleanup.sh eth2030-devnetcd pkg/devnet/kurtosis && ./scripts/run-devnet.sh full-featurecast bn -r http://$(kurtosis port print eth2030-devnet el-1-geth-lighthouse rpc)kurtosis service logs eth2030-devnet cl-1-lighthouse-geth 2>&1 | grep -E "verified|ERROR" | tail -20kurtosis service logs eth2030-devnet el-1-geth-lighthouse 2>&1 | grep -E "WARN|ERROR" | tail -20
Scope: Simplify the local inclusion-list JSON parsing helpers in pkg/engine/inclusion_list.go without changing the wire format or validation behavior.
Completed Work:
- Extract small helper functions for repeated hex-prefix stripping and byte-slice conversion.
- Reuse the helpers from the custom JSON marshal/unmarshal paths.
- Add focused parsing tests and rerun the relevant engine test suites.
Verification:
cd pkg && go test ./engine/...
Scope: Deduplicate the cell-proof expansion logic shared by the V2 and V6 blob-bundle builders in pkg/engine/backend.go without changing output formats.
Completed Work:
- Extract shared blob sidecar collection and cell-proof expansion logic.
- Reuse the helper from the V2 and V6 blob-bundle builders.
- Verify the relevant engine test suites after the refactor.
Verification:
cd pkg && go test ./engine/...
Scope: Deduplicate the repeated payload retrieval paths in pkg/engine/backend.go without changing API-specific response contents or async eviction behavior.
Completed Work:
- Extract shared helpers for async payload waiting and mutex-protected payload lookup.
- Reuse the helpers from
GetPayloadByID,GetPayloadV4ByID,GetPayloadV5, andGetPayloadV6ByID. - Verify the relevant engine test suites after the refactor.
Verification:
cd pkg && go test ./engine/...
Scope: Deduplicate inclusion-list transaction selection across engine backends and make oversized pending transactions skippable instead of aborting the whole selection pass.
Completed Work:
- Extract shared inclusion-list transaction selection into a helper in
pkg/core/eips/inclusion_list.go. - Use the helper from both
pkg/engine/backend.goandpkg/node/backend/engine_backend.go. - Add a focused test for oversized-transaction skipping.
- Verify the relevant Go test suites after the refactor.
Verification:
cd pkg && go test ./core/eips ./engine/... ./node/backend/...
Scope: Recheck branch review findings, confirm whether engine_getPayloadV5 JSON encoding is already fixed, and address the remaining safe bugs in inclusion-list handling.
Completed Work:
- Verified that the
engine_getPayloadV5response encoding issue was already fixed on this branch byfdd0820. - Reject oversized hex input in
flexibleUint64instead of truncating it. - Make the node backend return an explicit error for
ProcessInclusionListuntil real storage/wiring exists. - Add tests for the inclusion-list fixes and rerun the relevant engine/node test suites.
Verification:
cd pkg && go test ./engine/... ./node/backend/...
Scope: Refactor pkg/engine/backend.go so accesses guarded by stateMu, blocksMu, payloadMu, and ilMu go through helper functions instead of open-coded lock/unlock pairs.
Completed Work:
- Add backend accessor methods that encapsulate
stateMu,blocksMu,payloadMu, andilMureads/writes. - Migrate existing call sites in
pkg/engine/backend.goto the accessors without changing lock ordering or behavior. - Follow up on the accessor refactor by removing remaining unsynchronized forkchoice field reads in
ForkchoiceUpdated. - Extend the accessor refactor into
pkg/engine/backend_bodies.goto remove direct mutex usage there as well. - Verify the
pkg/enginebuild and tests after the refactor.
Verification:
cd pkg && go test ./engine/...
Scope: Reproduce and fix failing or hanging go test ./... runs from the Go module root at pkg/.
Resolved Issues:
pkg/core/vmJSON-vector and precompile fixture tests no longer fail when the optional external fixture corpus is absent from the checkout; they now skip cleanly on missing files.pkg/engineno longer deadlocks while storing processed blocks:ProcessBlockandProcessBlockV5were callingevictOldBlockswithblocksMualready held, while the helper tried to lockblocksMuagain.
Verification:
cd pkg && go test ./...
Devnet Configuration: full-feature-prysm.yaml with PeerDAS/Fulu
Test Results:
- Slot: 367+ (continuing to advance)
- Finalized Epoch: 9+ (continuing to finalize)
- Block Processing Time: 15-200ms (normal)
- Data Availability Check: ~5 microseconds (instant)
-
engine_getPayloadV5 "build timed out" (CRITICAL)
- Root Cause:
buildMumutex held duringStateAtBlockcall which could take tens of seconds on cache miss - Death Spiral: state cache miss → state rebuild blocks buildMu → all builds timeout → chain stalls
- Fix: Pre-fetch state BEFORE acquiring
buildMu, use singleflight for deduplication - File:
pkg/node/backend.go - Status: ✅ RESOLVED
- Root Cause:
-
Race condition in computeBlobsV2
- Root Cause:
len(b.blobCache)accessed afterblobCacheMu.RUnlock() - Fix: Capture cache size before releasing lock
- Status: ✅ RESOLVED
- Root Cause:
- engine_getBlobsV2 "JSON-RPC response has no result"
- This is expected behavior in PeerDAS
- Blobs are propagated via gossip (data column sidecars), not through Engine API
- Prysm CL attempts to reconstruct data columns from EL as a fallback
- EL doesn't have blobs for blocks built by other nodes
- Impact: NONE - Chain continues to advance and finalize normally
- These errors are just log noise from Prysm's gossip message handling
PeerDAS Data Flow:
- Block proposer (CL-2) broadcasts data column sidecars (128 columns per block)
- Other CL nodes receive data columns via gossip
- Data availability is verified from gossip-received columns
- CL may attempt to reconstruct from EL as fallback (fails but non-fatal)
- Block processing succeeds regardless
State Cache Behavior:
StateAtBlockuses singleflight for deduplication- Hot cache (
sc) and permanent cache (memSC) provide state caching - Re-execution needed when cache misses (can take tens of seconds)
- Formal Lean workspace is present under
formal/lean. - Initial EVM/VM model (
Lean2030/VM) and richerLean2030/EVMmodel are now linked inLean2030/Lean2030.lean. - EVM model now includes:
- arithmetic and bitwise ops,
- DUP/SWAP,
- POP/JUMP/JUMPI/JUMPDEST,
- compiler and theorem suites.
- Current status: still a semantic subset only (toy control-flow, no memory/tracing, no Go cross-checking).
- Added bytecode-offset execution module
formal/lean/Lean2030/EVM/Bytecode.leanwithdecodeAt/decodePush/runBytecode. - Added executable mismatch lemmas showing current op-index
rundiverges from byte-offset EVM behavior forPUSH-preceded jumps. - Lean 4 test driver is now configured in
formal/lean/lakefile.leanwithLean2030/Tests.lean. - Added
.gitignoreentries for Lean outputs (.lake,*.olean,*.ilean) and linked the Lean VM strategy doc in README. - Next major deliverable: full
compile→runBytecoderefinement theorem and stronger instruction/stack invariants.