Bridge: Sepolia Glamsterdam fork breaks bridge image (Prysm v5 / geth 1.16.7) — testnet-4 bridge down #2162
Summary
The Ethereum bridge is non-functional on testnet-4 (all 4 validators): Prysm inside ghcr.io/product-science/bridge:0.2.15 crash-loops on checkpoint sync because Sepolia activated Glamsterdam (CL fork Gloas 0x90000076, epoch 353024, 2026-10-06 13:53 UTC) and the bundled clients predate that fork. The same applies to bridge:0.2.16 — every published bridge tag pins the same Prysm/Geth base images, so redeploying does not help.
Related: #2153 (mainnet bridge update, projected activation 2026-11-18) — the fix below is the same image that mainnet will need before Ethereum mainnet Glamsterdam.
Symptoms
docker logs bridge on any testnet-4 host (18221/18223/18226/18214), repeating every ~8 s:
PRSM: INFO Checkpoint sync - Downloading origin state and block
PRSM: FATAL unable to start beacon node: could not start modules: could not start DB:
Error retrieving checkpoint origin state and block: error detecting chain config for
finalized state: version=0x90000076 not found in any known fork choice schedule:
unable to find requested BeaconChainConfig
Prysm failed to stay alive after start ... Prysm-only restart failed; will retry in monitor loop
GETH: WARN Beacon client online, but no consensus updates received in a while.
API handshake returns no block:
Root cause
| Component | In bridge:0.2.13 … 0.2.16 |
Problem |
|---|---|---|
Prysm — ghcr.io/product-science/bridge-prysm:0.2.12 |
Prysm v5.x (gonka-ai/bridge-prysm; only a Dockerfile on top of upstream) |
Knows forks up to Fulu (0x90000075); Sepolia finalized state is now Gloas (0x90000076) |
Geth — ghcr.io/product-science/bridge-geth:0.2.14-post3 |
patched v1.16.7 (gonka-ai/bridge-geth branch bridge-rebase-1.16.7) |
Sepolia config has Osaka/BPO1/BPO2 but no amsterdamTime; cannot follow the EL side of Glamsterdam |
Sepolia fork schedule (from https://sepolia.checkpoint-sync.ethpandaops.io/eth/v1/config/fork_schedule): 222464 0x90000074 (Electra), 272640 0x90000075 (Fulu), 353024 0x90000076 (Gloas). Any checkpoint provider now serves a Gloas finalized state, so changing BEACON_STATE_URL does not help; the force-clear of the Prysm datadir on restart rules out stale DB state.
Upstream support: Prysm v7.3.1 — config/params/testnet_sepolia_config.go: GloasForkEpoch = 353024, GloasForkVersion = 0x90000076. go-ethereum v1.17.10 — params/chainspecs/sepolia.json: "amsterdamTime": 1791294816.
Ethereum mainnet is still on Fusaka (0x06000000), so the mainnet bridge is unaffected until mainnet Glamsterdam.
Proposed fix
gonka-ai/bridge-prysm: branch from upstreamv7.3.1, cherry-pick the Dockerfile commits (c8c0b6568,35f8630de), build and pushghcr.io/product-science/bridge-prysm:0.2.18.gonka-ai/bridge-geth: branch from upstreamv1.17.10, cherry-pick the bridge commits8c9f51e66^..06055a1ac(bridge changes for initial release,explicit urls fix request,docker alpine version up,withdrawal support,update classify bridge log,when ReceiptSync is active skip blockchain header check,previous uncommitted changes,bridge sync - self heal), resolve conflicts, run tests for touched packages, build and pushghcr.io/product-science/bridge-geth:0.2.18.gonka: update the twoFROMlines inbridge/Dockerfile(pin by digest),make -C bridge build-docker docker-push VERSION=0.2.18; bump thebridgeimage indeploy/join/docker-compose.yml.- Verify locally with
ETHEREUM_NETWORK=sepolia: Prysm completes checkpoint sync, Geth imports Sepolia blocks,--bridge.postblockposts reach the API. - Roll out on testnet-4 (4 hosts,
docker compose ... pull bridge && up -d --no-deps --force-recreate bridge), confirm/v1/bridge/block/latest?chain=sepoliareturns a block, re-run a bridge scenario (docs/bridge-upgrade-scenario-a-runbook.md). - Ship the same image to mainnet ahead of mainnet Glamsterdam (#2153).
Environment
- testnet-4, chain
gonka-testnet-4, binaryv0.2.17-testnet-2 bridgeservice fromdeploy/join/docker-compose.yml,ETHEREUM_NETWORK=sepolia,BEACON_STATE_URL=https://sepolia.checkpoint-sync.ethpandaops.iodocker exec bridge beacon-chain --version→Prysm/Unknown/Local build(prysm/v5 symbols);geth version→1.16.7-stable
🔄 Auto-synced from Issue #2162 every hour.