Skip to content

feat: add mempool-bridge service integration#1222

Merged
barnabasbusa merged 21 commits intomainfrom
barnabasbusa/add-mempool-bridge
Oct 21, 2025
Merged

feat: add mempool-bridge service integration#1222
barnabasbusa merged 21 commits intomainfrom
barnabasbusa/add-mempool-bridge

Conversation

@barnabasbusa
Copy link
Collaborator

@barnabasbusa barnabasbusa commented Oct 13, 2025

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.star

    • Implements service launcher following ethereum-package patterns
    • Uses Docker image: ethpandaops/mempool-bridge:latest
    • Exposes HTTP API on port 9090
    • Automatically connects to all execution layer nodes
  • Configuration template: static_files/mempool-bridge-config/config.yaml.tmpl

    • Dynamically generates configuration based on EL contexts
    • Lists all execution nodes for bridging
  • Integration: Updated main.star and src/static_files/static_files.star

    • Added mempool-bridge to additional_services workflow
    • Follows existing patterns from services like tracoor and broadcaster

Usage

Add mempool_bridge to the additional_services list in your network configuration:

additional_services:
  - mempool_bridge

The service will automatically:

  • Connect to all execution layer nodes in the network
  • Bridge mempool transactions between nodes
  • Expose metrics/API on port 9090

Test plan

  • Syntax validation (dry-run passes)
  • Code follows ethereum-package patterns
  • Configuration template uses correct syntax
  • Runtime testing with actual network deployment

🤖 Generated with Claude Code

barnabasbusa and others added 20 commits October 13, 2025 11:10
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>
@barnabasbusa barnabasbusa enabled auto-merge (squash) October 17, 2025 10:52
@barnabasbusa barnabasbusa merged commit 92d2239 into main Oct 21, 2025
14 of 26 checks passed
@barnabasbusa barnabasbusa deleted the barnabasbusa/add-mempool-bridge branch October 21, 2025 09:36
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).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants