fix(bootnodoor): hand discv5-only EL clients the EL ENR instead of the enode - #1462
Merged
barnabasbusa merged 4 commits intoJul 31, 2026
Conversation
- pin --enr-ip (nat_exit_ip, or K8S_POD_IP on kubernetes) so the ENR no longer rewrites to the host WAN address learned from PONGs - pass --cl-bootnodes/--el-bootnodes (v0.0.3 split the removed --bootnodes flag) and feed enodes.txt to the EL side - fetch /cl-enr for the CL bootnode override (strips the EL-only eth field) - publish HTTP/discovery ports via port_publisher.additional_services, binding the published port number so the ENR is valid in-enclave and externally - scrape /metrics via prometheus additional_metrics_jobs - optional bootnodoor_params.separate_keys for distinct EL/CL identities
…e enode With ELs defaulting to discv5-only, the enode:// bootnode override from bootnodoor feeds a disabled protocol (and besu rejects non-ENR bootnodes outright in V5 mode). Fetch /el-enr — the EL identity's record with the CL-only eth2 field stripped, which is also correct with separate_keys — and use it for every EL client except discv4-only ethereumjs, which keeps the enode.
--el-bootnodes accepts ENRs and enode URLs alike, so merge el_enrs.txt (discv5) with enodes.txt (discv4) and tolerate either file being absent: el_enrs.txt only appears once ansible-collection-general#568 lands, and discv4-only stragglers stay reachable through the enodes.
pk910
marked this pull request as ready for review
July 31, 2026 01:59
barnabasbusa
approved these changes
Jul 31, 2026
barnabasbusa
merged commit Jul 31, 2026
234b662
into
bbusa/el-discv5-only-enr-bootnodes
17 of 19 checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Targets #1461. Merges #1451 and closes the gap between the two: with ELs defaulting to discv5-only, the bootnodoor override still handed every EL client an
enode://URL, which feeds a disabled protocol — and besu in V5 mode rejects non-ENR bootnodes outright, so a discv5-only enclave with bootnodoor enabled had no working EL bootstrap at all.What
launch_bootnodooralso fetches/el-enrand returns(cl_enr, enode, el_enr)./el-enris the EL identity's record with the CL-onlyeth2field stripped (mirroring why feat: update bootnodoor integration for v0.0.3 #1451 switched the CL side to/cl-enr), and stays correct withseparate_keys: true, where the CL ENR is a different node identity altogether.el_launcher.launchselects the override per client: the seven discv5-only launchers (geth, besu, erigon, nethermind, reth, nimbus-eth1, ethrex) get the EL ENR — theirbootnodoor_enodeparameter is renamed tobootnodoor_el_enr— while discv4-only ethereumjs keeps the enode (bootnodoor still answers discv4 on the EL identity, so that pairing keeps working).Testing
kurtosis lintclean. Two live enclaves on this branch, all images freshly pulled:geth + besu + bootnodoor — both ELs received
--bootnodes=enr:…matching bootnodoor's/el-enr, peered within 10s (besu is the strict case: it hard-rejects enode bootnodes in V5 mode), both imported blocks.7-EL matrix + bootnodoor (geth, besu, erigon, reth, nethermind, nimbus-eth1, ethrex — bootnodoor as sole bootnode, no static peer bootnodes):
Six clients registered in bootnodoor's EL table and formed a full mesh through it (peers=5 = everyone except erigon); all seven lighthouses registered in the CL table and peered. Chain progressed on all nodes.
Erigon parses the ENR bootnode, logs
Setup P2P discovery v4=false v5=true, and binds UDP 30303 — but never sends a single discv5 packet: after 15+ min it is absent even from bootnodoor's inactive-node DB, and it logs[p2p] No GoodPeersforever. #1461's own 7-EL test masked this: erigon showedpeers=1there only because other clients had erigon's ENR in their static bootnode lists and dialed it inbound. Behind bootnodoor — where discovery is the only way to be found — erigon is fully isolated (it still follows the chain via its CL / engine API). Needs an upstream erigon fix; nothing this package can do.Stale-image traps (relevant to CI on both parent PRs)
ethpandaops/bootnodoor:lateststill on v0.0.2 404s on/cl-enr, hard-failing feat: update bootnodoor integration for v0.0.3 #1451's fetch.ethpandaops/besu:mainpredating besu#10800 doesn't know--discovery-mode.ethpandaops/ethereumjs:master(2026-05-19) crashes at startup withcrypto.getRandomValues must be defined— unrelated to these PRs (dies generating its node key), but it means the ethereumjs+bootnodoor enode path can't be live-tested until that image is rebuilt on a newer Node.Devnet EL seeding
#1451 seeded bootnodoor's devnet EL side from
enodes.txtonly.--el-bootnodesaccepts ENRs and enode URLs alike, so the newget_devnet_el_bootnodesmergesel_enrs.txt(discv5) withenodes.txt(discv4) into one list and tolerates either file being absent —el_enrs.txtonly appears once ethpandaops/ansible-collection-general#568 lands and devnet metadata is regenerated, and discv4-only stragglers stay reachable through the enodes. The merge snippet was verified for all four file-presence combinations (exit 0, clean comma list); the devnet path itself has no live devnet withel_enrs.txtto test against yet.