every.channel/evolution/proposals/ECP-0113-op-stack-runtime-port-and-rollup-json-compat.md

3 KiB

ECP-0113: Keep OP Stack Runtime Compatible With Forge Host Services

Status: Draft

Problem / context

ecp-forge now runs the OP Stack bootstrap far enough to produce deployment.json, genesis.json, and rollup.json, but the runtime containers still failed to stay up. op-geth tried to bind the default Ethereum P2P port 30303, already owned by the host full Ethereum node. The pinned op-node:v1.13.5 rejected current op-deployer/v0.6.0-rc.3 rollup fields such as minBaseFee. After aligning to op-node:v1.14.0, that image still rejected the newer genesis.system_config.daFootprintGasScalar field. The generated rollup config also carried eip1559Params = 0x0000000000000000 even though the genesis extraData and chain config encode denominator 250 and elasticity 6; that zero value caused op-geth to panic when the sequencer requested the first payload. op-batcher:v1.14.0 also no longer accepts --batch-inbox-address. Isolated compatibility probes showed op-node:v1.16.6 paired with op-geth:v1.101702.0-rc.1 can run against the generated genesis hash and produce L2 blocks.

Decision

Assign op-geth a repo-owned L2 P2P port in the existing 285xx range, align op-node to the probed v1.16.6 runtime, move op-geth to the probed v1.101702.0-rc.1 image, remove the stale batcher inbox-address flag, delete only genesis.system_config.daFootprintGasScalar from generated rollup configs, and derive zero eip1559Params from the generated chain_op_config.

Consequences

  • The host Ethereum node can keep 30303 without blocking OP Stack startup.
  • The OP Stack RPC and P2P port assignments stay documented in repo config.
  • Runtime image compatibility is explicit in Nix config.
  • The rollup JSON normalization is intentionally narrow: it removes the exact field rejected by the older op-node:v1.14.0 parser and repairs only the zero EIP-1559 params that caused the live op-geth payload panic.
  • The op-geth image is an explicit release-candidate tag because the previously pinned image panicked against the current deployer output.

Alternatives considered

  • Stop the host full Ethereum node. Rejected because the OP Stack should coexist with the existing Ethereum services.
  • Strip all newer-looking fields from rollup.json. Rejected because op-node:v1.14.0 accepts the other generated fields tested during recovery; broad deletion would hide schema drift.
  • Leave zero eip1559Params in place. Rejected because the live sequencer/geth pair panicked before the first L2 block could be built.
  • Keep op-geth:v1.101511.1. Rejected because it reproducibly panics on first payload construction for this generated chain config.

Rollout / teardown

Deploy the updated NixOS module and bootstrap helper, reset failed OP Stack units, and verify L2 RPC and rollup RPC locally on ecp-forge. Teardown is reverting the port assignment and rollup JSON normalization, then regenerating runtime files with a mutually compatible deployer/runtime image set.