feat: add mempool-bridge service integration#1222
Merged
barnabasbusa merged 21 commits intomainfrom Oct 21, 2025
Merged
Conversation
Add support for mempool-bridge service to bridge mempool transactions between execution layer nodes. Changes: - Created mempool_bridge_launcher.star module - Added config template for dynamic node configuration - Integrated service into additional_services workflow - Exposes HTTP API on port 9090 Usage: Add 'mempool_bridge' to additional_services list to enable. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Fix config template to use source/target nodeRecords structure - Add mempool_bridge to allowed additional services - Add test configuration for mempool-bridge with 3 node setup - Verified service starts successfully with corrected config 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Add mempool_bridge_params configuration: - Auto-detects shadowfork networks and sets source URL - Uses ethpandaops RPC endpoint for shadowforks (e.g. rpc.hoodi.ethpandaops.io) - Allows custom source_url override via params - Updates config template to conditionally include source section Changes: - Added mempool_bridge_params to input_parser with get_default_mempool_bridge_params() - Updated launcher to accept and use mempool_bridge_params - Modified config template to support optional source endpoints - Added sanity check validation for mempool_bridge_params - Updated test config to demonstrate shadowfork usage Example shadowfork usage: ```yaml network_params: network: hoodi-shadowfork additional_services: - mempool_bridge ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Critical fix: mempool-bridge uses devp2p protocol (ENR/enode), not HTTP RPC. Changes: - Updated launcher to extract enode/enr from EL contexts instead of HTTP URLs - Added fallback: uses first node as source if no source_url specified - Updated config template to match mempool-bridge example format - Added logging and metricsAddr fields - Added retryInterval to source/target sections - Fixed source_url param comments to clarify ENR/enode requirement For shadowforks, users must provide enode/enr of source network: ```yaml mempool_bridge_params: source_url: "enode://abc...@bootnode.sepolia.ethpandaops.io:30303" ``` Resolves connection issues where peers were disconnected due to incorrect HTTP URL format. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Change mempool_bridge_params from single source_url to source_enodes list
to support multiple bootnode enodes for shadowfork networks.
Changes:
- Renamed source_url to source_enodes (list of enode strings)
- Updated launcher to iterate over source_enodes list
- Added example hoodi shadowfork test config with enodes from eth-clients repo
- Updated sanity check and struct definitions
Usage for shadowforks:
```yaml
network_params:
network: hoodi-shadowfork
mempool_bridge_params:
source_enodes:
- "enode://pubkey1@ip1:30303"
- "enode://pubkey2@ip2:30303"
```
Enode sources:
- mainnet: https://github.com/eth-clients/mainnet/blob/main/metadata/enodes.yaml
- sepolia: https://github.com/eth-clients/sepolia/blob/main/metadata/enodes.yaml
- hoodi: https://github.com/eth-clients/hoodi/blob/main/metadata/enodes.yaml
- holesky: https://github.com/eth-clients/holesky/blob/main/metadata/enodes.yaml
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Remove get_default_mempool_bridge_params function and initialize
params with empty list by default. This avoids unnecessary processing
when mempool_bridge service is not enabled.
Changes:
- Initialize mempool_bridge_params as {"source_enodes": []} directly
- Remove unused get_default_mempool_bridge_params function
- Add documentation comment pointing to eth-clients repos
- No functional changes, params work same as before
This ensures we only process mempool bridge configuration when the
service is actually requested by the user.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Automatically fetch source enodes from eth-clients GitHub repos at runtime when launching mempool-bridge for shadowfork networks. No hardcoding needed. Changes: - Added fetch_enodes_from_url() function that uses curl to fetch YAML - Auto-detects shadowfork network and fetches from appropriate repo: * mainnet, sepolia, hoodi, holesky supported - Uses first EL service to run curl command - Parses YAML to extract enode lines and strip comments - Falls back to first local node if fetch fails or not shadowfork - Updated test config to rely on auto-fetch (no hardcoded enodes) Usage for shadowforks: ```yaml network_params: network: hoodi-shadowfork additional_services: - mempool_bridge ``` Enodes are fetched fresh each time from: https://github.com/eth-clients/{network}/blob/main/metadata/enodes.yaml 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Simplified fetch_enodes_from_url to trust the shell command output and use list comprehension for cleaner parsing. The shell command (curl | grep | sed) does all the heavy lifting: - Fetches YAML from URL - Extracts lines starting with '- enode:' - Strips '- ' prefix and '# comment' suffix No need for extra validation loops - just split and filter empty lines. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Barnabas Busa <barnabas.busa@ethereum.org>
qu0b
approved these changes
Oct 21, 2025
barnabasbusa
pushed a commit
that referenced
this pull request
Jan 5, 2026
🤖 I have created a release *beep* *boop* --- ## [6.0.0](5.0.1...6.0.0) (2026-01-05) ### ⚠ BREAKING CHANGES * geth genesis flag, osaka time passthrough for public networks ([#1229](#1229)) * remove mev_flood ([#1091](#1091)) ### Features * Add 'trace' to enabled JSON-RPC modules ([#1235](#1235)) ([ea241af](ea241af)) * add `depends_on` to store service files for parallel ([#1208](#1208)) ([98206c8](98206c8)) * add `env` parameter to Blockscout configuration for custom environment variables ([#1262](#1262)) ([627619c](627619c)) * add api to dora ([#1120](#1120)) ([9dbde5a](9dbde5a)) * add bpo ([#1016](#1016)) ([37082b2](37082b2)) * add chainspec support for fusaka-devnet-2 ([#1055](#1055)) ([0e18733](0e18733)) * add checkpointz ([#1254](#1254)) ([c9d72f9](c9d72f9)) * Add cl_devices parameter for mounting host devices to CL containers ([#1251](#1251)) ([ab9e55f](ab9e55f)) * add client-language label to ethereum service containers ([#1074](#1074)) ([6955763](6955763)) * add custody group and getBlobsV2 metrics on PeerDAS dashboard ([#982](#982)) ([e43e569](e43e569)) * add debug port for ethjs ([#1044](#1044)) ([459a931](459a931)) * add disk usage as a metric for ethereum-metrics-exporter ([#1026](#1026)) ([8e793a5](8e793a5)) * add el genesis files to dora config for extended blob gas display ([#1180](#1180)) ([2fd2b41](2fd2b41)) * add engine snooper urls to dora config for block execution time tracking ([#1083](#1083)) ([7ffb9d5](7ffb9d5)) * Add eRPC integration ([#1223](#1223)) ([16b72b7](16b72b7)) * add ethrex execution client ([#1131](#1131)) ([82e5a71](82e5a71)) * add extra labels ([#1030](#1030)) ([12447f8](12447f8)) * add genesis_time as a possible network_param config value ([#1216](#1216)) ([b11ce6f](b11ce6f)) * Add Geth dashboard to the grafana module ([#1166](#1166)) ([47c90f6](47c90f6)) * Add Kurtosis config for BALs devnet 0 ([#1197](#1197)) ([9a93b33](9a93b33)) * add log level to ethrex ([#1269](#1269)) ([57af564](57af564)) * add maxblobspertx ([#1063](#1063)) ([1944080](1944080)) * add mempool-bridge service integration ([#1222](#1222)) ([92d2239](92d2239)) * add mev-fulu test ([#1014](#1014)) ([67a76e9](67a76e9)) * add MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS as config option ([#1057](#1057)) ([97afe9c](97afe9c)) * add more groups to spamoor clients ([#1066](#1066)) ([c9ed485](c9ed485)) * add multiple bn nodes per vc ([#1189](#1189)) ([7727330](7727330)) * add name and nameoverride func to clients page spamoor ([#1068](#1068)) ([e3abf47](e3abf47)) * add new timing parameters ([#1168](#1168)) ([1d524c8](1d524c8)) * add nginx file server implementation ([#1065](#1065)) ([fd76bba](fd76bba)) * add node index label ([#1086](#1086)) ([5aa0d44](5aa0d44)) * add node selectors and tolerations to run_sh ([#1167](#1167)) ([c4e0c89](c4e0c89)) * add OTLP collector URL to Lighthouse validator client ([#1252](#1252)) ([f507360](f507360)) * add peercount support for nimbusel ([#1092](#1092)) ([12409e4](12409e4)) * add per participant checkpoint sync enabled flag ([#1243](#1243)) ([2101448](2101448)) * add public ports for mev ([#1023](#1023)) ([5d89274](5d89274)) * add public ports for other tools ([#1025](#1025)) ([fa9d05e](fa9d05e)) * add sanity check for lack of supernodes ([#1145](#1145)) ([70dd011](70dd011)) * add sanity check for perfect peerdas ([#1217](#1217)) ([6c51752](6c51752)) * add skip_start ([#1253](#1253)) ([338bb88](338bb88)) * Add support for dummy EL in kurtosis config ([#1276](#1276)) ([b8007fd](b8007fd)) * add support for extra mounts for CL, EL, and VC clients ([#1136](#1136)) ([d385265](d385265)) * add support for MIN_EPOCHS_FOR_BLOCK_REQUESTS ([#1211](#1211)) ([17ad84a](17ad84a)) * add support for separate bootnode with bootnodoor ([#1238](#1238)) ([f8f4de6](f8f4de6)) * Add support for the helix relay ([#1237](#1237)) ([e17cb60](e17cb60)) * add telemetry service name flag to Lighthouse ([#1160](#1160)) ([2f61b9c](2f61b9c)) * add Tempo as an additional service to collect Lighthouse tracing data ([#1150](#1150)) ([ba328bb](ba328bb)) * add tolerations ([#1137](#1137)) ([a4b52da](a4b52da)) * add tx snooper ([#1043](#1043)) ([34e1151](34e1151)) * add validator balance ([#1032](#1032)) ([3601346](3601346)) * add validator ranges for devnets ([#1176](#1176)) ([3fb5084](3fb5084)) * add validator summary dora ([#1177](#1177)) ([f289914](f289914)) * **ai:** Add docs ([#1061](#1061)) ([1bf0893](1bf0893)) * allow passing custom env vars to the genesis generator ([#1227](#1227)) ([a43368e](a43368e)) * allow specifying additional mnemonics ([#1267](#1267)) ([dad4ea3](dad4ea3)) * automatically generate a 2/3 ratio for target/max blobs ([#1156](#1156)) ([2d1aa15](2d1aa15)) * bump egg (fulu genesis support) ([#1140](#1140)) ([601df3b](601df3b)) * configure Blockscout to index from shadowfork block height ([#1221](#1221)) ([a1347fe](a1347fe)) * default to ethpandaops/client:devnet images ([#1097](#1097)) ([fa4f99a](fa4f99a)) * enable `custom_preset` in checkpointz config ([#1259](#1259)) ([8e9913b](8e9913b)) * enable extra env vars to be set during runtime mev, enable pprof by default ([#1012](#1012)) ([94a7f22](94a7f22)) * enable mass das guardian scans in dora ([#1125](#1125)) ([0671925](0671925)) * enable prom and grafana to be ran separatly ([#1028](#1028)) ([500c3f0](500c3f0)) * enable rpc proxy in dora ([#1212](#1212)) ([4de44ce](4de44ce)) * enable tty for prysm ([#1076](#1076)) ([1ae1826](1ae1826)) * enable validator block on sentry ([#1224](#1224)) ([0f61746](0f61746)) * Extra Files for `*_extra_mounts` support ([#1144](#1144)) ([1b889f6](1b889f6)) * feature flag for DisableFinalizedRootCheck ([#1228](#1228)) ([c51f183](c51f183)) * fine grained control with public ip addresses per service ([#1111](#1111)) ([3f60fa8](3f60fa8)) * make default node a supernode ([#1230](#1230)) ([802c045](802c045)) * remove maxBlobsPerTx ([#1113](#1113)) ([9f40d0a](9f40d0a)) * remove mev_flood ([#1091](#1091)) ([2d3b170](2d3b170)) * rename eip7732 to gloas ([#1157](#1157)) ([f0c5522](f0c5522)) * set fulu fork epoch at genesis ([#1261](#1261)) ([6ae2474](6ae2474)) * sps setting Qu0b/nethermind sps ([#1225](#1225)) ([969a707](969a707)) * Support el_storage_type flag ([#1257](#1257)) ([2eb1e85](2eb1e85)) * use dns names instead of ip addresses for services ([#1194](#1194)) ([f360a51](f360a51)) ### Bug Fixes * add fulu fork version for mev-boost-relay ([#1088](#1088)) ([953ec57](953ec57)) * add input option for blobber ([#1072](#1072)) ([293286d](293286d)) * assertoor image for fulu support ([#1240](#1240)) ([b0f4fab](b0f4fab)) * besu sync snap if non kurtosis ([#1034](#1034)) ([6752218](6752218)) * **blockscout:** make frontend available in kubernetes ([#1033](#1033)) ([d3ae571](d3ae571)) * bump egg,fix minimal preset ([#1165](#1165)) ([0f877c6](0f877c6)) * bump ethereum-genesis-generator to fix issues with large additional contracts ([#1019](#1019)) ([cb644af](cb644af)) * change default images ([#1099](#1099)) ([ba92830](ba92830)) * change lh supernode flag ([#1186](#1186)) ([f64ff38](f64ff38)) * change nimbus supernode flag ([#1275](#1275)) ([094b3f3](094b3f3)) * cl node discovery on k8s ([#1162](#1162)) ([5643dfd](5643dfd)) * cleanup besu ([#1139](#1139)) ([5001427](5001427)) * commit boost cb-config ([#1233](#1233)) ([87f3e03](87f3e03)) * commit boost integration ([#1204](#1204)) ([69e60b3](69e60b3)) * default to empty blob schedule if non defined ([#1115](#1115)) ([35c298d](35c298d)) * default to pandaops ethrex image for arm/amd ([#1249](#1249)) ([b03a571](b03a571)) * disable page cache in dora ([#1079](#1079)) ([1e51446](1e51446)) * dora,assertoor pull through cache ([#1059](#1059)) ([69c965f](69c965f)) * downgrade teku from latest to master ([#1155](#1155)) ([996c2a1](996c2a1)) * el/cl/vc index calculation bug, due to parallel execution ([#1121](#1121)) ([fc4e65e](fc4e65e)) * enable submission pages in dora ([#1031](#1031)) ([33e3f7b](33e3f7b)) * ensure proper bpo scheduling ([#1266](#1266)) ([57120bf](57120bf)) * erigon db size alloc ([#1096](#1096)) ([777d37e](777d37e)) * failed to start network: ethereum-package execution error: Evaluation error: key osaka_time not in dict ([#1218](#1218)) ([ae74385](ae74385)) * fix checkpointz params override ([#1258](#1258)) ([9518b72](9518b72)) * geth genesis flag, osaka time passthrough for public networks ([#1229](#1229)) ([d58cab7](d58cab7)) * geth peering bug ([#1133](#1133)) ([bc62c0c](bc62c0c)) * gloas minimal config values ([#1250](#1250)) ([2ec3a94](2ec3a94)) * helix logging type ([#1279](#1279)) ([756bfdd](756bfdd)) * **lighthouse:** allow genesis sync when checkpoint sync isn't enabled ([#1192](#1192)) ([4053331](4053331)) * make sure builder cl is supernode ([#1188](#1188)) ([dfef921](dfef921)) * mev rbuilder remove unused config param ([#1248](#1248)) ([3838a5f](3838a5f)) * minimal builds should use latest unstable branches ([#1174](#1174)) ([d6d6d5f](d6d6d5f)) * minimal spec ([#1037](#1037)) ([2372550](2372550)) * missing dns_name ([#1274](#1274)) ([3238be5](3238be5)) * move bootnodoor to additional_services ([#1264](#1264)) ([bf40917](bf40917)) * nethermind chainspec, default genesis gas to 60M ([#1039](#1039)) ([b839e61](b839e61)) * network params default images ([#1213](#1213)) ([33a0db2](33a0db2)) * nimbus checkpoint syncing ([#1181](#1181)) ([d464295](d464295)) * only add --target-peers=0 only when the network is kurtosis ([#1119](#1119)) ([572cbfc](572cbfc)) * only append blob schedule, if defined ([#1022](#1022)) ([43db03a](43db03a)) * override bpo1,2 ([#1196](#1196)) ([836cbb8](836cbb8)) * pass gas limit to ethrex if network gas_limit was specified ([#1232](#1232)) ([39ac09b](39ac09b)) * prysm gzip encoding bug ([#1112](#1112)) ([9f5fc45](9f5fc45)) * pull kurtosis images in kurtosis install ([#1048](#1048)) ([a00b6dd](a00b6dd)) * rbuilder parallel safe sorting ([#1046](#1046)) ([ec5895d](ec5895d)) * readme for additional services ([#1270](#1270)) ([ba855e0](ba855e0)) * readme/CI jobs ([#1263](#1263)) ([ca6b7d2](ca6b7d2)) * remove default basefee fraction ([#1143](#1143)) ([d29e0bf](d29e0bf)) * remove graffiti ([#1082](#1082)) ([ee4fff4](ee4fff4)) * remove unused env ([#1153](#1153)) ([ea73a95](ea73a95)) * revert prometheus branch ([#1024](#1024)) ([1559386](1559386)) * sanity check for all subfields ([#1130](#1130)) ([3d2c71c](3d2c71c)) * service ports ([#1021](#1021)) ([e83a1ad](e83a1ad)) * set deploy_client_group for mev related uniswap spammer ([#1195](#1195)) ([09d09b0](09d09b0)) * set miner gasprice for geth if running kt' ([#1027](#1027)) ([161fc14](161fc14)) * sf for erigon/geth post fulu ([#1183](#1183)) ([e964e30](e964e30)) * shadowfork enclave edits ([#1070](#1070)) ([63689ec](63689ec)) * shadowfork latest bug ([#1045](#1045)) ([197cdf8](197cdf8)) * shadowfork upstream to eth-clients ([#1047](#1047)) ([7c11a34](7c11a34)) * single-node lighthouse startup issue ([#1073](#1073)) ([6d29b3a](6d29b3a)) * some tests ([#1190](#1190)) ([fca81b3](fca81b3)) * specify devnet size for persistent flag ([#1054](#1054)) ([b4c398c](b4c398c)) * update custom-network to --network ([#1159](#1159)) ([1f57a7b](1f57a7b)) * Update mainnet yaml ([#1069](#1069)) ([288919b](288919b)) * Update sf to osaka ([#1105](#1105)) ([59579bb](59579bb)) * update some tests ([#1122](#1122)) ([9488046](9488046)) * use default dora image for fulu networks ([#1128](#1128)) ([b1f4e5c](b1f4e5c)) * use reth-rbuilder image as the default mev_builder_image in network_params.yaml ([#1077](#1077)) ([f07f3b6](f07f3b6)) * use self hosted runners ([#1100](#1100)) ([2fc4a3c](2fc4a3c)) * use ubuntu-latest ([#1078](#1078)) ([d209af4](d209af4)) * validator client compatibility update ([#1114](#1114)) ([b826cc9](b826cc9)) * yeet unused mev builder ([#1056](#1056)) ([40767fe](40767fe)) * yeet-7907 ([#1116](#1116)) ([93c6630](93c6630)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
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.
Summary
Add support for the mempool-bridge service to bridge mempool transactions between execution layer nodes in the network.
Changes
New module:
src/mempool_bridge/mempool_bridge_launcher.starethpandaops/mempool-bridge:latestConfiguration template:
static_files/mempool-bridge-config/config.yaml.tmplIntegration: Updated
main.starandsrc/static_files/static_files.starUsage
Add
mempool_bridgeto theadditional_serviceslist in your network configuration:The service will automatically:
Test plan
🤖 Generated with Claude Code