cl: implement Gloas devnet 8 - #23548
Conversation
e4edbb7 to
5c70f63
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 109 out of 111 changed files in this pull request and generated 5 comments.
Files not reviewed (2)
- cl/abstract/mock_services/beacon_state_mock.go: Generated file
- cl/beacon/builder/mock_services/builder_client_mock.go: Generated file
Suppressed comments (1)
cl/cltypes/gloas_api.go:88
- These three fields are dynamic, so the encoded container also contains three 4-byte offsets. The current result under-reports the SSZ size by 12 bytes.
yperbasis
left a comment
There was a problem hiding this comment.
Requesting changes for the following blockers:
-
Persisted envelopes bypass validation for later submissions. cl/phase1/forkchoice/on_execution_payload.go returns success when HasEnvelope(root) is true, before bid, BLS, DA, or EL checks. The P2P service and REST consensus path interpret nil as successful validation and may propagate the submitted object. Return an explicit duplicate/ignore result and ensure callers never emit or propagate an unvalidated duplicate.
-
The self-build path persists a SignedExecutionPayloadEnvelope with InfiniteSignature. This marks the payload present and prevents the later VC-signed envelope from replacing it. The invalid placeholder can also be served through REST and req/resp. Keep local payload data separate and wait for the proposer-signed envelope before setting HasEnvelope.
-
storeBlockAndBlobs calls OnBlock before the database write, while OnBlock emits the block SSE event immediately. This matches the failing caplin-minimal serial job: assertoor receives a block event and immediately gets 404 for that root. Emit the public block-import event only after persistence commits.
-
caplin.builder.allow-private-urls also applies to a raw request-supplied Eth-Builder-Url. ClaimOrAdd does not bind that route to an authenticated builder configuration, so enabling the flag permits request headers to target private or loopback services. Restrict private targets to trusted configured builder entries.
-
cl/beacon/handler/epbs.go emitFullHeadV2 only rechecks root and slot. Gloas EMPTY and FULL nodes share the same root, and optimism can also change. Mirror the payload-status and optimism checks already used by execution_payload_service.go.
-
The SSZ payload-attestation endpoint rejects a zero-byte body, although that is the valid encoding of an empty List[PayloadAttestationMessage, PTC_SIZE] and JSON [] succeeds.
There is also a scope mismatch: the PR description says arbitrary Eth-Builder-Url forwarding, private targets, and external-bid fallback after local EL failure remain disabled pending approval, but all three paths are enabled in the current code. Please gate them or record the approval and update the stated scope. The private-target trust-boundary issue still needs correction either way.
The focused CL test set and git diff --check pass. Current CI remains red from the Caplin minimal ordering race above and a likely unrelated Sonar failure in execution/commitment.
|
Addressed the requested blockers in
The scope text has also been reconciled with the approved implementation: multi-BN forwarding is supported through the echoed URL, but remains strict-public unless the operator explicitly enables private configured builders; direct builder fallback uses the frozen requested parent and keeps gossip-only policy separate. Additional review-driven hardening in the same commit covers payload-attestation REST/P2P first-valid and publish-retry ownership, SSE idempotency, forward-sync envelope reconciliation, finalized-checkpoint ancestry, and public-builder DNS/connection-pool boundaries. Validation:
All inline review threads are resolved. Re-review requested. |
| netip.MustParsePrefix("192.88.99.0/24"), netip.MustParsePrefix("192.168.0.0/16"), | ||
| netip.MustParsePrefix("192.175.48.0/24"), | ||
| netip.MustParsePrefix("198.18.0.0/15"), netip.MustParsePrefix("198.51.100.0/24"), | ||
| netip.MustParsePrefix("203.0.113.0/24"), netip.MustParsePrefix("224.0.0.0/4"), |
| netip.MustParsePrefix("192.175.48.0/24"), | ||
| netip.MustParsePrefix("198.18.0.0/15"), netip.MustParsePrefix("198.51.100.0/24"), | ||
| netip.MustParsePrefix("203.0.113.0/24"), netip.MustParsePrefix("224.0.0.0/4"), | ||
| netip.MustParsePrefix("240.0.0.0/4"), netip.MustParsePrefix("::/128"), |
| netip.MustParsePrefix("198.18.0.0/15"), netip.MustParsePrefix("198.51.100.0/24"), | ||
| netip.MustParsePrefix("203.0.113.0/24"), netip.MustParsePrefix("224.0.0.0/4"), | ||
| netip.MustParsePrefix("240.0.0.0/4"), netip.MustParsePrefix("::/128"), | ||
| netip.MustParsePrefix("::1/128"), netip.MustParsePrefix("64:ff9b::/96"), |
| netip.MustParsePrefix("198.18.0.0/15"), netip.MustParsePrefix("198.51.100.0/24"), | ||
| netip.MustParsePrefix("203.0.113.0/24"), netip.MustParsePrefix("224.0.0.0/4"), | ||
| netip.MustParsePrefix("240.0.0.0/4"), netip.MustParsePrefix("::/128"), | ||
| netip.MustParsePrefix("::1/128"), netip.MustParsePrefix("64:ff9b::/96"), |
| netip.MustParsePrefix("203.0.113.0/24"), netip.MustParsePrefix("224.0.0.0/4"), | ||
| netip.MustParsePrefix("240.0.0.0/4"), netip.MustParsePrefix("::/128"), | ||
| netip.MustParsePrefix("::1/128"), netip.MustParsePrefix("64:ff9b::/96"), | ||
| netip.MustParsePrefix("64:ff9b:1::/48"), netip.MustParsePrefix("100:0:0:1::/64"), |
| netip.MustParsePrefix("::1/128"), netip.MustParsePrefix("64:ff9b::/96"), | ||
| netip.MustParsePrefix("64:ff9b:1::/48"), netip.MustParsePrefix("100:0:0:1::/64"), | ||
| netip.MustParsePrefix("100::/64"), | ||
| netip.MustParsePrefix("2001::/23"), netip.MustParsePrefix("2001:2::/48"), |
| netip.MustParsePrefix("64:ff9b:1::/48"), netip.MustParsePrefix("100:0:0:1::/64"), | ||
| netip.MustParsePrefix("100::/64"), | ||
| netip.MustParsePrefix("2001::/23"), netip.MustParsePrefix("2001:2::/48"), | ||
| netip.MustParsePrefix("2001:db8::/32"), netip.MustParsePrefix("2002::/16"), |
| netip.MustParsePrefix("100::/64"), | ||
| netip.MustParsePrefix("2001::/23"), netip.MustParsePrefix("2001:2::/48"), | ||
| netip.MustParsePrefix("2001:db8::/32"), netip.MustParsePrefix("2002::/16"), | ||
| netip.MustParsePrefix("3fff::/20"), netip.MustParsePrefix("5f00::/16"), |
| netip.MustParsePrefix("2001::/23"), netip.MustParsePrefix("2001:2::/48"), | ||
| netip.MustParsePrefix("2001:db8::/32"), netip.MustParsePrefix("2002::/16"), | ||
| netip.MustParsePrefix("3fff::/20"), netip.MustParsePrefix("5f00::/16"), | ||
| netip.MustParsePrefix("fc00::/7"), netip.MustParsePrefix("fec0::/10"), |
| netip.MustParsePrefix("2001:db8::/32"), netip.MustParsePrefix("2002::/16"), | ||
| netip.MustParsePrefix("3fff::/20"), netip.MustParsePrefix("5f00::/16"), | ||
| netip.MustParsePrefix("fc00::/7"), netip.MustParsePrefix("fec0::/10"), | ||
| netip.MustParsePrefix("fe80::/10"), |
Summary
Validation
make erigon integrationgo test -tags=spectest ./cl/spectest -count=1go test ./cl/beacon/handler ./cl/beacon/builder/... ./cl/beacon/beaconevents ./cl/phase1/network/services ./cl/phase1/forkchoice/... ./cl/phase1/stages ./common/event ./cmd/caplin/caplin1 -count=1git diff --checkc24c661c92Scope and explicit policy follow-ups
This PR is limited to the devnet 8 consensus-layer and CL-facing API implementation. Remaining execution-layer work, including full EIP-8070
engine_getBlobsV4/ FCU custody-column wiring and native Erigon EL devnet 8 execution issues, is intentionally out of scope.The following external-builder behaviors remain disabled pending explicit operator/security-policy approval:
Eth-Builder-UrlSpec: https://github.com/ethereum/consensus-specs/releases/tag/v1.7.0-alpha.14
Devnet: https://notes.ethereum.org/@ethpandaops/glamsterdam-devnet-8