From 43ef7ccbd0e067c430da0701c842eedaeb582346 Mon Sep 17 00:00:00 2001 From: "stepsecurity-app[bot]" <188008098+stepsecurity-app[bot]@users.noreply.github.com> Date: Wed, 11 Feb 2026 10:01:22 -0600 Subject: [PATCH 01/13] [StepSecurity] Apply security best practices (#966) Signed-off-by: StepSecurity Bot Co-authored-by: stepsecurity-app[bot] <188008098+stepsecurity-app[bot]@users.noreply.github.com> --- .github/workflows/stale.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 04bee16e0..f2cd59025 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -4,6 +4,9 @@ on: schedule: - cron: '30 0 * * *' workflow_dispatch: +permissions: + contents: read + jobs: stale: runs-on: ubuntu-latest @@ -12,6 +15,11 @@ jobs: issues: write pull-requests: write steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 + with: + egress-policy: audit + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10.1.0 with: days-before-stale: 14 From 5d47f18690ea40cc6cbb0ddb6b2fb4f77e9daf6d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Feb 2026 10:01:41 -0600 Subject: [PATCH 02/13] chore: updated base, nethermind, op-geth, optimism, reth (#937) Co-authored-by: danyalprout <672580+danyalprout@users.noreply.github.com> --- versions.env | 20 ++++++++++---------- versions.json | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/versions.env b/versions.env index 535b158e7..7a1d118d9 100644 --- a/versions.env +++ b/versions.env @@ -1,15 +1,15 @@ -export BASE_RETH_NODE_COMMIT=bb1b4571bebb8a9cd8ff1ec8758001fdc32758e8 +export BASE_RETH_NODE_COMMIT=fa6d3444debd96977ae14ccae502b91cbbe3f463 export BASE_RETH_NODE_REPO=https://github.com/base/base.git -export BASE_RETH_NODE_TAG=v0.3.0 -export NETHERMIND_COMMIT=d9febbce240491e8f918d41a4ffd06385a746b6c +export BASE_RETH_NODE_TAG=v0.3.1 +export NETHERMIND_COMMIT=31cb81b7328026791cdfaccd9db230c82f1db02d export NETHERMIND_REPO=https://github.com/NethermindEth/nethermind.git -export NETHERMIND_TAG=1.35.3 -export OP_GETH_COMMIT=904a088c5cc1eeec21a1ffa47327dc20a809e642 +export NETHERMIND_TAG=1.36.0 +export OP_GETH_COMMIT=32cc3b8caf8647dbefbd29b2c3ed862132e53ad2 export OP_GETH_REPO=https://github.com/ethereum-optimism/op-geth.git -export OP_GETH_TAG=v1.101603.5 -export OP_NODE_COMMIT=1b8c541060f0d323a7023fbc68fbbc8daf674340 +export OP_GETH_TAG=v1.101608.0 +export OP_NODE_COMMIT=b66cc587b4185089e6f81bf6a4fc4233f2a7505d export OP_NODE_REPO=https://github.com/ethereum-optimism/optimism.git -export OP_NODE_TAG=op-node/v1.16.2 -export OP_RETH_COMMIT=27a8c0f5a6dfb27dea84c5751776ecabdd069646 +export OP_NODE_TAG=op-node/v1.16.6 +export OP_RETH_COMMIT=8e3b5e6a99439561b73c5dd31bd3eced2e994d60 export OP_RETH_REPO=https://github.com/paradigmxyz/reth.git -export OP_RETH_TAG=v1.9.3 \ No newline at end of file +export OP_RETH_TAG=v1.10.2 \ No newline at end of file diff --git a/versions.json b/versions.json index 82698cbfc..3b88fd5c2 100644 --- a/versions.json +++ b/versions.json @@ -1,36 +1,36 @@ { "base_reth_node": { - "tag": "v0.3.0", - "commit": "bb1b4571bebb8a9cd8ff1ec8758001fdc32758e8", + "tag": "v0.3.1", + "commit": "fa6d3444debd96977ae14ccae502b91cbbe3f463", "owner": "base", "repo": "base", "tracking": "release" }, "nethermind": { - "tag": "1.35.3", - "commit": "d9febbce240491e8f918d41a4ffd06385a746b6c", + "tag": "1.36.0", + "commit": "31cb81b7328026791cdfaccd9db230c82f1db02d", "owner": "NethermindEth", "repo": "nethermind", "tracking": "release" }, "op_geth": { - "tag": "v1.101603.5", - "commit": "904a088c5cc1eeec21a1ffa47327dc20a809e642", + "tag": "v1.101608.0", + "commit": "32cc3b8caf8647dbefbd29b2c3ed862132e53ad2", "owner": "ethereum-optimism", "repo": "op-geth", "tracking": "release" }, "op_node": { - "tag": "op-node/v1.16.2", - "commit": "1b8c541060f0d323a7023fbc68fbbc8daf674340", + "tag": "op-node/v1.16.6", + "commit": "b66cc587b4185089e6f81bf6a4fc4233f2a7505d", "tagPrefix": "op-node", "owner": "ethereum-optimism", "repo": "optimism", "tracking": "release" }, "op_reth": { - "tag": "v1.9.3", - "commit": "27a8c0f5a6dfb27dea84c5751776ecabdd069646", + "tag": "v1.10.2", + "commit": "8e3b5e6a99439561b73c5dd31bd3eced2e994d60", "owner": "paradigmxyz", "repo": "reth", "tracking": "release" From 5598217c5e5f6d44f909529a7c2e5a2568fa581c Mon Sep 17 00:00:00 2001 From: Danyal Prout Date: Wed, 11 Feb 2026 10:29:32 -0600 Subject: [PATCH 03/13] fix: update dotnet images to 10.0 for Nethermind 1.36.0 (#967) Nethermind 1.36.0 requires .NET SDK 10.0.100 (via global.json), but the Dockerfile was still using 9.0 images, causing the build to fail with exit code 145. --- nethermind/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nethermind/Dockerfile b/nethermind/Dockerfile index 729b9264c..f03032f76 100644 --- a/nethermind/Dockerfile +++ b/nethermind/Dockerfile @@ -13,7 +13,7 @@ RUN . /tmp/versions.env && git clone $OP_NODE_REPO --branch $OP_NODE_TAG --singl RUN . /tmp/versions.env && cd op-node && \ just VERSION=$OP_NODE_TAG op-node -FROM mcr.microsoft.com/dotnet/sdk:9.0-noble AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0-noble AS build ARG BUILD_CONFIG=release ARG TARGETARCH @@ -31,7 +31,7 @@ RUN TARGETARCH=${TARGETARCH#linux/} && \ echo "Using architecture: $arch" && \ dotnet publish src/Nethermind/Nethermind.Runner -c $BUILD_CONFIG -a $arch -o /publish --sc false -FROM mcr.microsoft.com/dotnet/aspnet:9.0-noble +FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble RUN apt-get update && \ apt-get install -y jq curl supervisor && \ From 2d8c44cc02d92fc09773289ead5a7d7db5fee3bb Mon Sep 17 00:00:00 2001 From: Danyal Prout Date: Tue, 17 Feb 2026 14:25:01 -0600 Subject: [PATCH 04/13] chore: update base reth to v0.4.0 (#972) --- versions.env | 4 ++-- versions.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/versions.env b/versions.env index 7a1d118d9..16067ad09 100644 --- a/versions.env +++ b/versions.env @@ -1,6 +1,6 @@ -export BASE_RETH_NODE_COMMIT=fa6d3444debd96977ae14ccae502b91cbbe3f463 +export BASE_RETH_NODE_COMMIT=00087fd960f65a79b6ce87e55e3b3440c99237fa export BASE_RETH_NODE_REPO=https://github.com/base/base.git -export BASE_RETH_NODE_TAG=v0.3.1 +export BASE_RETH_NODE_TAG=v0.4.0 export NETHERMIND_COMMIT=31cb81b7328026791cdfaccd9db230c82f1db02d export NETHERMIND_REPO=https://github.com/NethermindEth/nethermind.git export NETHERMIND_TAG=1.36.0 diff --git a/versions.json b/versions.json index 3b88fd5c2..f30e3c844 100644 --- a/versions.json +++ b/versions.json @@ -1,7 +1,7 @@ { "base_reth_node": { - "tag": "v0.3.1", - "commit": "fa6d3444debd96977ae14ccae502b91cbbe3f463", + "tag": "v0.4.0", + "commit": "00087fd960f65a79b6ce87e55e3b3440c99237fa", "owner": "base", "repo": "base", "tracking": "release" From a294d4a0cad590d4664e15d72e69c7da3a7a8ce8 Mon Sep 17 00:00:00 2001 From: Danyal Prout Date: Wed, 18 Feb 2026 12:58:41 -0600 Subject: [PATCH 05/13] chore: update base reth to v0.4.1 (#975) --- versions.env | 4 ++-- versions.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/versions.env b/versions.env index 16067ad09..1a6972f58 100644 --- a/versions.env +++ b/versions.env @@ -1,6 +1,6 @@ -export BASE_RETH_NODE_COMMIT=00087fd960f65a79b6ce87e55e3b3440c99237fa +export BASE_RETH_NODE_COMMIT=5e5260c26a1d1af7a74a79a692a56b5d73d5363b export BASE_RETH_NODE_REPO=https://github.com/base/base.git -export BASE_RETH_NODE_TAG=v0.4.0 +export BASE_RETH_NODE_TAG=v0.4.1 export NETHERMIND_COMMIT=31cb81b7328026791cdfaccd9db230c82f1db02d export NETHERMIND_REPO=https://github.com/NethermindEth/nethermind.git export NETHERMIND_TAG=1.36.0 diff --git a/versions.json b/versions.json index f30e3c844..001541ff2 100644 --- a/versions.json +++ b/versions.json @@ -1,7 +1,7 @@ { "base_reth_node": { - "tag": "v0.4.0", - "commit": "00087fd960f65a79b6ce87e55e3b3440c99237fa", + "tag": "v0.4.1", + "commit": "5e5260c26a1d1af7a74a79a692a56b5d73d5363b", "owner": "base", "repo": "base", "tracking": "release" From fccea225ed0c4807c05267d1a68bdebb316cc5d3 Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Wed, 25 Feb 2026 15:27:12 -0800 Subject: [PATCH 06/13] chore: remove unused op-reth repo (#981) --- versions.env | 5 +---- versions.json | 7 ------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/versions.env b/versions.env index 1a6972f58..7a0173993 100644 --- a/versions.env +++ b/versions.env @@ -9,7 +9,4 @@ export OP_GETH_REPO=https://github.com/ethereum-optimism/op-geth.git export OP_GETH_TAG=v1.101608.0 export OP_NODE_COMMIT=b66cc587b4185089e6f81bf6a4fc4233f2a7505d export OP_NODE_REPO=https://github.com/ethereum-optimism/optimism.git -export OP_NODE_TAG=op-node/v1.16.6 -export OP_RETH_COMMIT=8e3b5e6a99439561b73c5dd31bd3eced2e994d60 -export OP_RETH_REPO=https://github.com/paradigmxyz/reth.git -export OP_RETH_TAG=v1.10.2 \ No newline at end of file +export OP_NODE_TAG=op-node/v1.16.6 \ No newline at end of file diff --git a/versions.json b/versions.json index 001541ff2..02e133598 100644 --- a/versions.json +++ b/versions.json @@ -27,12 +27,5 @@ "owner": "ethereum-optimism", "repo": "optimism", "tracking": "release" - }, - "op_reth": { - "tag": "v1.10.2", - "commit": "8e3b5e6a99439561b73c5dd31bd3eced2e994d60", - "owner": "paradigmxyz", - "repo": "reth", - "tracking": "release" } } \ No newline at end of file From 6e9cb084e94d6177035340e452578525bd9c6dd3 Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Thu, 26 Feb 2026 10:59:44 -0800 Subject: [PATCH 07/13] feat: support proofs ExEx (#980) --- reth/reth-entrypoint | 77 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/reth/reth-entrypoint b/reth/reth-entrypoint index 6948731f6..12d9b9cf8 100755 --- a/reth/reth-entrypoint +++ b/reth/reth-entrypoint @@ -11,6 +11,9 @@ DISCOVERY_PORT="${DISCOVERY_PORT:-30303}" P2P_PORT="${P2P_PORT:-30303}" ADDITIONAL_ARGS="" BINARY="./base-reth-node" +RETH_HISTORICAL_PROOFS="${RETH_HISTORICAL_PROOFS:-false}" +RETH_HISTORICAL_PROOFS_STORAGE_PATH="${RETH_HISTORICAL_PROOFS_STORAGE_PATH:-}" +LOG_LEVEL="${LOG_LEVEL:-info}" if [[ -z "${RETH_CHAIN:-}" ]]; then echo "expected RETH_CHAIN to be set" 1>&2 @@ -25,18 +28,90 @@ else echo "Running in vanilla node mode (no Flashblocks URL provided)" fi +case "$LOG_LEVEL" in + "error") + LOG_LEVEL="v" + ;; + "warn") + LOG_LEVEL="vv" + ;; + "info"|*) + LOG_LEVEL="vvv" + ;; + "debug") + LOG_LEVEL="vvvv" + ;; + "trace") + LOG_LEVEL="vvvvv" + ;; +esac + # Add pruning for base if [[ "${RETH_PRUNING_ARGS+x}" = x ]]; then echo "Adding pruning arguments: $RETH_PRUNING_ARGS" ADDITIONAL_ARGS="$ADDITIONAL_ARGS $RETH_PRUNING_ARGS" fi +if [[ "$RETH_HISTORICAL_PROOFS" == "true" && -n "$RETH_HISTORICAL_PROOFS_STORAGE_PATH" ]]; then + # reth doesn't like starting an old database in RO mode, so we have to start the reth node, wait for it to start up, then shut it down first + "$BINARY" node \ + -$LOG_LEVEL \ + --datadir="$RETH_DATA_DIR" \ + --log.stdout.format json \ + --http \ + --http.addr=127.0.0.1 \ + --http.port="$RPC_PORT" \ + --http.api=eth \ + --chain "$RETH_CHAIN" & + + PID=$! + + MAX_WAIT=$((60 * 60 * 6)) # 6 hours (static file manager init is slow) + + # wait for json-rpc to return a block number greater than 0 (synced beyond genesis) + while true; do + RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest", false],"id":1}' http://127.0.0.1:"$RPC_PORT" 2>/dev/null || true) + + if echo "$RESPONSE" | grep -q '"number":"0x0"'; then + echo "waiting for reth node to sync beyond genesis block" + elif echo "$RESPONSE" | grep -q '"result"'; then + # curl succeeded and returned a valid result with block number != 0x0 + break + else + echo "waiting for reth node to start up" + fi + + sleep 1 + MAX_WAIT=$((MAX_WAIT - 1)) + if [ "$MAX_WAIT" -eq 0 ]; then + echo "timed out waiting for reth node to start up" + kill "$PID" + exit 1 + fi + done + + # shut down gracefully + kill "$PID" + + (wait "$PID" && echo "reth node initialized") || echo "warning: reth node exited with code $?" + + ADDITIONAL_ARGS="$ADDITIONAL_ARGS --proofs-history --proofs-history.storage-path=$RETH_HISTORICAL_PROOFS_STORAGE_PATH" + + # in this case, we need to run the init script first (idempotent) + "$BINARY" proofs init \ + -$LOG_LEVEL \ + --log.stdout.format json \ + --chain "$RETH_CHAIN" \ + --datadir="$RETH_DATA_DIR" \ + --proofs-history.storage-path=$RETH_HISTORICAL_PROOFS_STORAGE_PATH +fi + mkdir -p "$RETH_DATA_DIR" echo "Starting reth with additional args: $ADDITIONAL_ARGS" echo "$OP_NODE_L2_ENGINE_AUTH_RAW" > "$OP_NODE_L2_ENGINE_AUTH" exec "$BINARY" node \ - -vvv \ + -$LOG_LEVEL \ --datadir="$RETH_DATA_DIR" \ --log.stdout.format json \ --ws \ From 208d69628fcb6579363d1c4bb4206ec11c3551c2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 13:53:01 -0500 Subject: [PATCH 08/13] chore: updated base-reth to 0.5.1 (#969) * chore: updated op-geth, optimism, base * chore: revert op-geth to v1.101608.0 and op-node to op-node/v1.16.6 Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: cody-wang-cb <156240243+cody-wang-cb@users.noreply.github.com> Co-authored-by: Cody Wang Co-authored-by: Claude Opus 4.6 --- versions.env | 4 ++-- versions.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/versions.env b/versions.env index 7a0173993..a4431f1d7 100644 --- a/versions.env +++ b/versions.env @@ -1,6 +1,6 @@ -export BASE_RETH_NODE_COMMIT=5e5260c26a1d1af7a74a79a692a56b5d73d5363b +export BASE_RETH_NODE_COMMIT=6e54e8cbcbd27cb86bde54d3a5b0e9b4e9ea960a export BASE_RETH_NODE_REPO=https://github.com/base/base.git -export BASE_RETH_NODE_TAG=v0.4.1 +export BASE_RETH_NODE_TAG=v0.5.1 export NETHERMIND_COMMIT=31cb81b7328026791cdfaccd9db230c82f1db02d export NETHERMIND_REPO=https://github.com/NethermindEth/nethermind.git export NETHERMIND_TAG=1.36.0 diff --git a/versions.json b/versions.json index 02e133598..7b748a130 100644 --- a/versions.json +++ b/versions.json @@ -1,7 +1,7 @@ { "base_reth_node": { - "tag": "v0.4.1", - "commit": "5e5260c26a1d1af7a74a79a692a56b5d73d5363b", + "tag": "v0.5.1", + "commit": "6e54e8cbcbd27cb86bde54d3a5b0e9b4e9ea960a", "owner": "base", "repo": "base", "tracking": "release" From 9c50daec0fcc72aa891b005125cc4a952f97b004 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 13:53:19 -0500 Subject: [PATCH 09/13] chore: updated base-reth to 0.5.1 (#969) * chore: updated op-geth, optimism, base * chore: revert op-geth to v1.101608.0 and op-node to op-node/v1.16.6 Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: cody-wang-cb <156240243+cody-wang-cb@users.noreply.github.com> Co-authored-by: Cody Wang Co-authored-by: Claude Opus 4.6 From f14551c15cb846eddb77cb9503dc630b785075d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 16:48:44 -0500 Subject: [PATCH 10/13] chore: updated optimism, op-geth (#984) Co-authored-by: danyalprout <672580+danyalprout@users.noreply.github.com> --- versions.env | 8 ++++---- versions.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/versions.env b/versions.env index a4431f1d7..0a6d6a29f 100644 --- a/versions.env +++ b/versions.env @@ -4,9 +4,9 @@ export BASE_RETH_NODE_TAG=v0.5.1 export NETHERMIND_COMMIT=31cb81b7328026791cdfaccd9db230c82f1db02d export NETHERMIND_REPO=https://github.com/NethermindEth/nethermind.git export NETHERMIND_TAG=1.36.0 -export OP_GETH_COMMIT=32cc3b8caf8647dbefbd29b2c3ed862132e53ad2 +export OP_GETH_COMMIT=878a554cc84cead647d20ba366043c6fd41ebf1c export OP_GETH_REPO=https://github.com/ethereum-optimism/op-geth.git -export OP_GETH_TAG=v1.101608.0 -export OP_NODE_COMMIT=b66cc587b4185089e6f81bf6a4fc4233f2a7505d +export OP_GETH_TAG=v1.101609.1 +export OP_NODE_COMMIT=3019251e80aa248e91743addd3e833190acb26f1 export OP_NODE_REPO=https://github.com/ethereum-optimism/optimism.git -export OP_NODE_TAG=op-node/v1.16.6 \ No newline at end of file +export OP_NODE_TAG=op-node/v1.16.7 \ No newline at end of file diff --git a/versions.json b/versions.json index 7b748a130..c5f0b111c 100644 --- a/versions.json +++ b/versions.json @@ -14,15 +14,15 @@ "tracking": "release" }, "op_geth": { - "tag": "v1.101608.0", - "commit": "32cc3b8caf8647dbefbd29b2c3ed862132e53ad2", + "tag": "v1.101609.1", + "commit": "878a554cc84cead647d20ba366043c6fd41ebf1c", "owner": "ethereum-optimism", "repo": "op-geth", "tracking": "release" }, "op_node": { - "tag": "op-node/v1.16.6", - "commit": "b66cc587b4185089e6f81bf6a4fc4233f2a7505d", + "tag": "op-node/v1.16.7", + "commit": "3019251e80aa248e91743addd3e833190acb26f1", "tagPrefix": "op-node", "owner": "ethereum-optimism", "repo": "optimism", From 23ffb270a00a90a74c852dcabad4a2185b485245 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 16:07:48 -0500 Subject: [PATCH 11/13] chore: updated base, nethermind, op-geth, optimism (#987) Co-authored-by: danyalprout <672580+danyalprout@users.noreply.github.com> --- versions.env | 16 ++++++++-------- versions.json | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/versions.env b/versions.env index 0a6d6a29f..1837475f2 100644 --- a/versions.env +++ b/versions.env @@ -1,12 +1,12 @@ -export BASE_RETH_NODE_COMMIT=6e54e8cbcbd27cb86bde54d3a5b0e9b4e9ea960a +export BASE_RETH_NODE_COMMIT=50e3bb16233ef7a50070bf16169dc6356fe5dd39 export BASE_RETH_NODE_REPO=https://github.com/base/base.git -export BASE_RETH_NODE_TAG=v0.5.1 -export NETHERMIND_COMMIT=31cb81b7328026791cdfaccd9db230c82f1db02d +export BASE_RETH_NODE_TAG=v0.6.0 +export NETHERMIND_COMMIT=f5507dec1c9c7f5e31dadae445c08622be166054 export NETHERMIND_REPO=https://github.com/NethermindEth/nethermind.git -export NETHERMIND_TAG=1.36.0 -export OP_GETH_COMMIT=878a554cc84cead647d20ba366043c6fd41ebf1c +export NETHERMIND_TAG=1.36.2 +export OP_GETH_COMMIT=d0734fd5f44234cde3b0a7c4beb1256fc6feedef export OP_GETH_REPO=https://github.com/ethereum-optimism/op-geth.git -export OP_GETH_TAG=v1.101609.1 -export OP_NODE_COMMIT=3019251e80aa248e91743addd3e833190acb26f1 +export OP_GETH_TAG=v1.101701.0 +export OP_NODE_COMMIT=2954d9fd41248a3a95c6d89f57e8d629114c6c70 export OP_NODE_REPO=https://github.com/ethereum-optimism/optimism.git -export OP_NODE_TAG=op-node/v1.16.7 \ No newline at end of file +export OP_NODE_TAG=op-node/v1.16.9 \ No newline at end of file diff --git a/versions.json b/versions.json index c5f0b111c..9df308dc7 100644 --- a/versions.json +++ b/versions.json @@ -1,28 +1,28 @@ { "base_reth_node": { - "tag": "v0.5.1", - "commit": "6e54e8cbcbd27cb86bde54d3a5b0e9b4e9ea960a", + "tag": "v0.6.0", + "commit": "50e3bb16233ef7a50070bf16169dc6356fe5dd39", "owner": "base", "repo": "base", "tracking": "release" }, "nethermind": { - "tag": "1.36.0", - "commit": "31cb81b7328026791cdfaccd9db230c82f1db02d", + "tag": "1.36.2", + "commit": "f5507dec1c9c7f5e31dadae445c08622be166054", "owner": "NethermindEth", "repo": "nethermind", "tracking": "release" }, "op_geth": { - "tag": "v1.101609.1", - "commit": "878a554cc84cead647d20ba366043c6fd41ebf1c", + "tag": "v1.101701.0", + "commit": "d0734fd5f44234cde3b0a7c4beb1256fc6feedef", "owner": "ethereum-optimism", "repo": "op-geth", "tracking": "release" }, "op_node": { - "tag": "op-node/v1.16.7", - "commit": "3019251e80aa248e91743addd3e833190acb26f1", + "tag": "op-node/v1.16.9", + "commit": "2954d9fd41248a3a95c6d89f57e8d629114c6c70", "tagPrefix": "op-node", "owner": "ethereum-optimism", "repo": "optimism", From 6a2a3616470ae37e975c4a23bdc7c514d8075e74 Mon Sep 17 00:00:00 2001 From: Danyal Prout Date: Sat, 28 Mar 2026 10:29:42 -0500 Subject: [PATCH 12/13] fix(base-reth): add mold linker (#992) --- reth/Dockerfile | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/reth/Dockerfile b/reth/Dockerfile index a0138937f..40777e2e3 100644 --- a/reth/Dockerfile +++ b/reth/Dockerfile @@ -1,3 +1,5 @@ +ARG RUST_VERSION=1.93 + FROM golang:1.24 AS op RUN curl -sSfL 'https://just.systems/install.sh' | bash -s -- --to /usr/local/bin @@ -13,16 +15,39 @@ RUN . /tmp/versions.env && git clone $OP_NODE_REPO --branch $OP_NODE_TAG --singl RUN . /tmp/versions.env && cd op-node && \ make VERSION=$OP_NODE_TAG op-node -FROM rust:1.88 AS reth-base +FROM public.ecr.aws/docker/library/rust:${RUST_VERSION}-trixie AS rust-builder-base WORKDIR /app -COPY versions.env /tmp/versions.env +ARG MOLD_VERSION=2.40.4 +ARG MOLD_SHA256_AARCH64=c799b9ccae8728793da2186718fbe53b76400a9da396184fac0c64aa3298ec37 +ARG MOLD_SHA256_ARM=d82792748a81202423ddd2496fc8719404fe694493abdef691cc080392ee44bf +ARG MOLD_SHA256_X86_64=4c999e19ffa31afa5aa429c679b665d5e2ca5a6b6832ad4b79668e8dcf3d8ec1 -RUN apt-get update && apt-get -y upgrade && \ - apt-get install -y git libclang-dev pkg-config curl build-essential && \ +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + git libclang-dev pkg-config curl build-essential cmake && \ rm -rf /var/lib/apt/lists/* +RUN set -eux; \ + case "$(uname -m)" in \ + x86_64) MOLD_ARCH=x86_64; MOLD_SHA256="${MOLD_SHA256_X86_64}" ;; \ + aarch64|arm64) MOLD_ARCH=aarch64; MOLD_SHA256="${MOLD_SHA256_AARCH64}" ;; \ + armv7l|armv6l) MOLD_ARCH=arm; MOLD_SHA256="${MOLD_SHA256_ARM}" ;; \ + *) echo "unsupported architecture: $(uname -m)" >&2; exit 1 ;; \ + esac; \ + curl -fsSL "https://github.com/rui314/mold/releases/download/v${MOLD_VERSION}/mold-${MOLD_VERSION}-${MOLD_ARCH}-linux.tar.gz" -o /tmp/mold.tar.gz; \ + echo "${MOLD_SHA256} /tmp/mold.tar.gz" | sha256sum -c -; \ + tar -xzf /tmp/mold.tar.gz -C /tmp; \ + cp /tmp/mold-${MOLD_VERSION}-${MOLD_ARCH}-linux/bin/* /usr/local/bin/; \ + rm -rf /tmp/mold* + +FROM rust-builder-base AS reth-base + +WORKDIR /app + +COPY versions.env /tmp/versions.env + RUN . /tmp/versions.env && git clone $BASE_RETH_NODE_REPO . && \ git checkout tags/$BASE_RETH_NODE_TAG && \ bash -c '[ "$(git rev-parse HEAD)" = "$BASE_RETH_NODE_COMMIT" ]' || (echo "Commit hash verification failed" && exit 1) From e684286fc0c76ddd041db8a1025ade4e818f22bf Mon Sep 17 00:00:00 2001 From: Julian Meyer Date: Mon, 6 Apr 2026 18:20:50 -0400 Subject: [PATCH 13/13] feat: switch consensus client from op-node to base-consensus (#985) --- .env | 3 ++- .env.mainnet | 30 ++++++++++++++++++++----- .env.sepolia | 28 +++++++++++++++++++---- .gitignore | 2 +- base-consensus-entrypoint | 47 +++++++++++++++++++++++++++++++++++++++ consensus-entrypoint | 15 +++++++++++++ docker-compose.yml | 6 ++++- geth/Dockerfile | 1 + geth/geth-entrypoint | 2 +- nethermind/Dockerfile | 3 ++- reth/Dockerfile | 5 ++++- reth/reth-entrypoint | 32 +++++++++++++++++++++----- supervisord.conf | 4 ++-- 13 files changed, 155 insertions(+), 23 deletions(-) create mode 100755 base-consensus-entrypoint create mode 100755 consensus-entrypoint diff --git a/.env b/.env index 90f423c39..f250d81ac 100644 --- a/.env +++ b/.env @@ -1,2 +1,3 @@ CLIENT=${CLIENT:-geth} -HOST_DATA_DIR=./${CLIENT}-data \ No newline at end of file +HOST_DATA_DIR=./${CLIENT}-data +USE_BASE_CONSENSUS=true diff --git a/.env.mainnet b/.env.mainnet index ee9354265..04f9999af 100644 --- a/.env.mainnet +++ b/.env.mainnet @@ -4,6 +4,7 @@ # NETWORK CONFIGURATION # -------------------- RETH_CHAIN=base +BASE_NODE_NETWORK=base OP_NODE_NETWORK=base-mainnet OP_GETH_OP_NETWORK=base-mainnet @@ -14,13 +15,13 @@ OP_SEQUENCER_HTTP=https://mainnet-sequencer.base.org OP_GETH_SEQUENCER_HTTP=https://mainnet-sequencer.base.org OP_RETH_SEQUENCER_HTTP=https://mainnet-sequencer.base.org -# SYNC CONFIGURATION +# SYNC CONFIGURATION (deprecated) # ----------------- OP_NODE_SYNCMODE=execution-layer OP_NODE_VERIFIER_L1_CONFS=4 OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true -# [REQUIRED] L1 CONFIGURATION +# [REQUIRED] L1 CONFIGURATION # -------------------------- # Replace these values with your L1 (Ethereum) node endpoints OP_NODE_L1_ETH_RPC= @@ -30,13 +31,21 @@ OP_NODE_L1_BEACON_FETCH_ALL_SIDECARS="true" OP_NODE_L1_RPC_KIND="debug_geth" OP_NODE_L1_TRUST_RPC="false" +BASE_NODE_L1_ETH_RPC= +BASE_NODE_L1_BEACON= +BASE_NODE_L1_TRUST_RPC="false" + # ENGINE CONFIGURATION # ------------------- OP_NODE_L2_ENGINE_KIND=reth -OP_NODE_L2_ENGINE_RPC=ws://execution:8551 +OP_NODE_L2_ENGINE_RPC=http://execution:8551 OP_NODE_L2_ENGINE_AUTH=/tmp/engine-auth-jwt OP_NODE_L2_ENGINE_AUTH_RAW=688f5d737bad920bdfb2fc2f488d6b6209eebda1dae949a8de91398d932c517a +BASE_NODE_L2_ENGINE_RPC=ws://execution:8551 +BASE_NODE_L2_ENGINE_AUTH=/tmp/engine-auth-jwt +BASE_NODE_L2_ENGINE_AUTH_RAW=688f5d737bad920bdfb2fc2f488d6b6209eebda1dae949a8de91398d932c517a + # P2P CONFIGURATION # --------------- OP_NODE_P2P_AGENT=base @@ -46,13 +55,18 @@ OP_NODE_P2P_LISTEN_UDP_PORT=9222 OP_NODE_INTERNAL_IP="true" OP_NODE_P2P_BOOTNODES=enr:-J24QNz9lbrKbN4iSmmjtnr7SjUMk4zB7f1krHZcTZx-JRKZd0kA2gjufUROD6T3sOWDVDnFJRvqBBo62zuF-hYCohOGAYiOoEyEgmlkgnY0gmlwhAPniryHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQKNVFlCxh_B-716tTs-h1vMzZkSs1FTu_OYTNjgufplG4N0Y3CCJAaDdWRwgiQG,enr:-J24QH-f1wt99sfpHy4c0QJM-NfmsIfmlLAMMcgZCUEgKG_BBYFc6FwYgaMJMQN5dsRBJApIok0jFn-9CS842lGpLmqGAYiOoDRAgmlkgnY0gmlwhLhIgb2Hb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJ9FTIv8B9myn1MWaC_2lJ-sMoeCDkusCsk4BYHjjCq04N0Y3CCJAaDdWRwgiQG,enr:-J24QDXyyxvQYsd0yfsN0cRr1lZ1N11zGTplMNlW4xNEc7LkPXh0NAJ9iSOVdRO95GPYAIc6xmyoCCG6_0JxdL3a0zaGAYiOoAjFgmlkgnY0gmlwhAPckbGHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJwoS7tzwxqXSyFL7g0JM-KWVbgvjfB8JA__T7yY_cYboN0Y3CCJAaDdWRwgiQG,enr:-J24QHmGyBwUZXIcsGYMaUqGGSl4CFdx9Tozu-vQCn5bHIQbR7On7dZbU61vYvfrJr30t0iahSqhc64J46MnUO2JvQaGAYiOoCKKgmlkgnY0gmlwhAPnCzSHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQINc4fSijfbNIiGhcgvwjsjxVFJHUstK9L1T8OTKUjgloN0Y3CCJAaDdWRwgiQG,enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG +BASE_NODE_P2P_LISTEN_IP=0.0.0.0 +BASE_NODE_P2P_ADVERTISE_TCP_PORT=9222 +BASE_NODE_P2P_ADVERTISE_UDP_PORT=9222 +BASE_NODE_P2P_BOOTNODES=enr:-J24QNz9lbrKbN4iSmmjtnr7SjUMk4zB7f1krHZcTZx-JRKZd0kA2gjufUROD6T3sOWDVDnFJRvqBBo62zuF-hYCohOGAYiOoEyEgmlkgnY0gmlwhAPniryHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQKNVFlCxh_B-716tTs-h1vMzZkSs1FTu_OYTNjgufplG4N0Y3CCJAaDdWRwgiQG,enr:-J24QH-f1wt99sfpHy4c0QJM-NfmsIfmlLAMMcgZCUEgKG_BBYFc6FwYgaMJMQN5dsRBJApIok0jFn-9CS842lGpLmqGAYiOoDRAgmlkgnY0gmlwhLhIgb2Hb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJ9FTIv8B9myn1MWaC_2lJ-sMoeCDkusCsk4BYHjjCq04N0Y3CCJAaDdWRwgiQG,enr:-J24QDXyyxvQYsd0yfsN0cRr1lZ1N11zGTplMNlW4xNEc7LkPXh0NAJ9iSOVdRO95GPYAIc6xmyoCCG6_0JxdL3a0zaGAYiOoAjFgmlkgnY0gmlwhAPckbGHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJwoS7tzwxqXSyFL7g0JM-KWVbgvjfB8JA__T7yY_cYboN0Y3CCJAaDdWRwgiQG,enr:-J24QHmGyBwUZXIcsGYMaUqGGSl4CFdx9Tozu-vQCn5bHIQbR7On7dZbU61vYvfrJr30t0iahSqhc64J46MnUO2JvQaGAYiOoCKKgmlkgnY0gmlwhAPnCzSHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQINc4fSijfbNIiGhcgvwjsjxVFJHUstK9L1T8OTKUjgloN0Y3CCJAaDdWRwgiQG,enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG + # RETH CONFIGURATION # ---------------- OP_RETH_DISABLE_DISCOVERY="false" OP_RETH_DISABLE_TX_POOL_GOSSIP="true" OP_RETH_OP_NETWORK="base" -# RPC CONFIGURATION +# RPC CONFIGURATION (deprecated) # --------------- OP_NODE_RPC_ADDR=0.0.0.0 OP_NODE_RPC_PORT=8545 @@ -74,6 +88,12 @@ OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log OP_NODE_METRICS_ENABLED="true" OP_NODE_METRICS_ADDR=0.0.0.0 OP_NODE_METRICS_PORT="7300" + +BASE_NODE_LOG_VERBOSITY=3 +BASE_NODE_LOG_FORMAT="json" +BASE_NODE_METRICS_ENABLED="true" +BASE_NODE_METRICS_ADDR=0.0.0.0 +BASE_NODE_METRICS_PORT="7300" STATSD_ADDRESS="172.17.0.1" # OPTIONAL SETTINGS @@ -85,7 +105,7 @@ STATSD_ADDRESS="172.17.0.1" # OP_NETHERMIND_ETHSTATS_NODE_NAME=NethermindNode # OP_NETHERMIND_ETHSTATS_ENDPOINT=ethstats_endpoint -# TRUSTED RPC MODE (OPTIONAL - UNCOMMENT TO ENABLE) +# TRUSTED RPC MODE (OPTIONAL - UNCOMMENT TO ENABLE) (deprecated) # OP_NODE_L1_TRUST_RPC=true # SNAP SYNC (OPTIONAL EXPERIMENTAL FEATURE - UNCOMMENT TO ENABLE) diff --git a/.env.sepolia b/.env.sepolia index b78fc8722..4c99fb7a4 100644 --- a/.env.sepolia +++ b/.env.sepolia @@ -5,6 +5,7 @@ # -------------------- RETH_CHAIN=base-sepolia OP_NODE_NETWORK=base-sepolia +BASE_NODE_NETWORK=base-sepolia OP_GETH_OP_NETWORK=base-sepolia # BASE SEQUENCER ENDPOINTS @@ -14,13 +15,13 @@ OP_SEQUENCER_HTTP=https://sepolia-sequencer.base.org OP_GETH_SEQUENCER_HTTP=https://sepolia-sequencer.base.org OP_RETH_SEQUENCER_HTTP=https://sepolia-sequencer.base.org -# SYNC CONFIGURATION +# SYNC CONFIGURATION (deprecated) # ----------------- OP_NODE_SYNCMODE=execution-layer OP_NODE_VERIFIER_L1_CONFS=4 OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true -# [REQUIRED] L1 CONFIGURATION +# [REQUIRED] L1 CONFIGURATION # -------------------------- # Replace these values with your L1 (Ethereum) node endpoints OP_NODE_L1_ETH_RPC= @@ -30,6 +31,10 @@ OP_NODE_L1_BEACON_FETCH_ALL_SIDECARS="true" OP_NODE_L1_RPC_KIND="debug_geth" OP_NODE_L1_TRUST_RPC="false" +BASE_NODE_L1_ETH_RPC= +BASE_NODE_L1_BEACON= +BASE_NODE_L1_TRUST_RPC="false" + # ENGINE CONFIGURATION # ------------------- OP_NODE_L2_ENGINE_KIND=reth @@ -37,6 +42,10 @@ OP_NODE_L2_ENGINE_RPC=ws://execution:8551 OP_NODE_L2_ENGINE_AUTH=/tmp/engine-auth-jwt OP_NODE_L2_ENGINE_AUTH_RAW=688f5d737bad920bdfb2fc2f488d6b6209eebda1dae949a8de91398d932c517a +BASE_NODE_L2_ENGINE_RPC=http://execution:8551 +BASE_NODE_L2_ENGINE_AUTH=/tmp/engine-auth-jwt +BASE_NODE_L2_ENGINE_AUTH_RAW=688f5d737bad920bdfb2fc2f488d6b6209eebda1dae949a8de91398d932c517a + # P2P CONFIGURATION # --------------- OP_NODE_P2P_AGENT=base @@ -46,13 +55,18 @@ OP_NODE_P2P_LISTEN_UDP_PORT=9222 OP_NODE_INTERNAL_IP="true" OP_NODE_P2P_BOOTNODES=enr:-J24QNz9lbrKbN4iSmmjtnr7SjUMk4zB7f1krHZcTZx-JRKZd0kA2gjufUROD6T3sOWDVDnFJRvqBBo62zuF-hYCohOGAYiOoEyEgmlkgnY0gmlwhAPniryHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQKNVFlCxh_B-716tTs-h1vMzZkSs1FTu_OYTNjgufplG4N0Y3CCJAaDdWRwgiQG,enr:-J24QH-f1wt99sfpHy4c0QJM-NfmsIfmlLAMMcgZCUEgKG_BBYFc6FwYgaMJMQN5dsRBJApIok0jFn-9CS842lGpLmqGAYiOoDRAgmlkgnY0gmlwhLhIgb2Hb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJ9FTIv8B9myn1MWaC_2lJ-sMoeCDkusCsk4BYHjjCq04N0Y3CCJAaDdWRwgiQG,enr:-J24QDXyyxvQYsd0yfsN0cRr1lZ1N11zGTplMNlW4xNEc7LkPXh0NAJ9iSOVdRO95GPYAIc6xmyoCCG6_0JxdL3a0zaGAYiOoAjFgmlkgnY0gmlwhAPckbGHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJwoS7tzwxqXSyFL7g0JM-KWVbgvjfB8JA__T7yY_cYboN0Y3CCJAaDdWRwgiQG,enr:-J24QHmGyBwUZXIcsGYMaUqGGSl4CFdx9Tozu-vQCn5bHIQbR7On7dZbU61vYvfrJr30t0iahSqhc64J46MnUO2JvQaGAYiOoCKKgmlkgnY0gmlwhAPnCzSHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQINc4fSijfbNIiGhcgvwjsjxVFJHUstK9L1T8OTKUjgloN0Y3CCJAaDdWRwgiQG,enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG +BASE_NODE_P2P_LISTEN_IP=0.0.0.0 +BASE_NODE_P2P_ADVERTISE_TCP_PORT=9222 +BASE_NODE_P2P_ADVERTISE_UDP_PORT=9222 +BASE_NODE_P2P_BOOTNODES=enr:-J24QNz9lbrKbN4iSmmjtnr7SjUMk4zB7f1krHZcTZx-JRKZd0kA2gjufUROD6T3sOWDVDnFJRvqBBo62zuF-hYCohOGAYiOoEyEgmlkgnY0gmlwhAPniryHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQKNVFlCxh_B-716tTs-h1vMzZkSs1FTu_OYTNjgufplG4N0Y3CCJAaDdWRwgiQG,enr:-J24QH-f1wt99sfpHy4c0QJM-NfmsIfmlLAMMcgZCUEgKG_BBYFc6FwYgaMJMQN5dsRBJApIok0jFn-9CS842lGpLmqGAYiOoDRAgmlkgnY0gmlwhLhIgb2Hb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJ9FTIv8B9myn1MWaC_2lJ-sMoeCDkusCsk4BYHjjCq04N0Y3CCJAaDdWRwgiQG,enr:-J24QDXyyxvQYsd0yfsN0cRr1lZ1N11zGTplMNlW4xNEc7LkPXh0NAJ9iSOVdRO95GPYAIc6xmyoCCG6_0JxdL3a0zaGAYiOoAjFgmlkgnY0gmlwhAPckbGHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQJwoS7tzwxqXSyFL7g0JM-KWVbgvjfB8JA__T7yY_cYboN0Y3CCJAaDdWRwgiQG,enr:-J24QHmGyBwUZXIcsGYMaUqGGSl4CFdx9Tozu-vQCn5bHIQbR7On7dZbU61vYvfrJr30t0iahSqhc64J46MnUO2JvQaGAYiOoCKKgmlkgnY0gmlwhAPnCzSHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQINc4fSijfbNIiGhcgvwjsjxVFJHUstK9L1T8OTKUjgloN0Y3CCJAaDdWRwgiQG,enr:-J24QG3ypT4xSu0gjb5PABCmVxZqBjVw9ca7pvsI8jl4KATYAnxBmfkaIuEqy9sKvDHKuNCsy57WwK9wTt2aQgcaDDyGAYiOoGAXgmlkgnY0gmlwhDbGmZaHb3BzdGFja4OFQgCJc2VjcDI1NmsxoQIeAK_--tcLEiu7HvoUlbV52MspE0uCocsx1f_rYvRenIN0Y3CCJAaDdWRwgiQG + # RETH CONFIGURATION # ---------------- OP_RETH_DISABLE_DISCOVERY="false" OP_RETH_DISABLE_TX_POOL_GOSSIP="true" OP_RETH_OP_NETWORK="base-sepolia" -# RPC CONFIGURATION +# RPC CONFIGURATION (deprecated) # --------------- OP_NODE_RPC_ADDR=0.0.0.0 OP_NODE_RPC_PORT=8545 @@ -74,6 +88,12 @@ OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log OP_NODE_METRICS_ENABLED="true" OP_NODE_METRICS_ADDR=0.0.0.0 OP_NODE_METRICS_PORT="7300" + +BASE_NODE_LOG_VERBOSITY=3 +BASE_NODE_LOG_FORMAT="json" +BASE_NODE_METRICS_ENABLED="true" +BASE_NODE_METRICS_ADDR=0.0.0.0 +BASE_NODE_METRICS_PORT="7300" STATSD_ADDRESS="172.17.0.1" # OPTIONAL SETTINGS @@ -85,7 +105,7 @@ STATSD_ADDRESS="172.17.0.1" # OP_NETHERMIND_ETHSTATS_NODE_NAME=NethermindNode # OP_NETHERMIND_ETHSTATS_ENDPOINT=ethstats_endpoint -# TRUSTED RPC MODE (OPTIONAL - UNCOMMENT TO ENABLE) +# TRUSTED RPC MODE (OPTIONAL - UNCOMMENT TO ENABLE) (deprecated) # OP_NODE_L1_TRUST_RPC=true # SNAP SYNC (OPTIONAL EXPERIMENTAL FEATURE - UNCOMMENT TO ENABLE) diff --git a/.gitignore b/.gitignore index daa8017b0..7bb8e3f91 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ /reth-data/ /nethermind-data/ /dependency_updater/dependency_updater -.DS_Store \ No newline at end of file +.DS_Store diff --git a/base-consensus-entrypoint b/base-consensus-entrypoint new file mode 100755 index 000000000..c3d0dbd55 --- /dev/null +++ b/base-consensus-entrypoint @@ -0,0 +1,47 @@ +#!/bin/bash +set -eu + +get_public_ip() { + # Define a list of HTTP-based providers + local PROVIDERS=( + "http://ifconfig.me" + "http://api.ipify.org" + "http://ipecho.net/plain" + "http://v4.ident.me" + ) + # Iterate through the providers until an IP is found or the list is exhausted + for provider in "${PROVIDERS[@]}"; do + local IP + IP=$(curl -s --max-time 10 --connect-timeout 5 "$provider") + # Check if IP contains a valid format (simple regex for an IPv4 address) + if [[ $IP =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "$IP" + return 0 + fi + done + return 1 +} + +if [[ -z "${BASE_NODE_NETWORK:-}" ]]; then + echo "expected BASE_NODE_NETWORK to be set" 1>&2 + exit 1 +fi + +# wait until local execution client comes up (authed so will return 401 without token) +until [ "$(curl -s --max-time 10 --connect-timeout 5 -w '%{http_code}' -o /dev/null "${BASE_NODE_L2_ENGINE_RPC/ws/http}")" -eq 401 ]; do + echo "waiting for execution client to be ready" + sleep 5 +done + +# public-facing P2P node, advertise public IP address +if PUBLIC_IP=$(get_public_ip); then + echo "fetched public IP is: $PUBLIC_IP" +else + echo "Could not retrieve public IP." + exit 8 +fi +export BASE_NODE_P2P_ADVERTISE_IP=$PUBLIC_IP + +echo "$BASE_NODE_L2_ENGINE_AUTH_RAW" > "$BASE_NODE_L2_ENGINE_AUTH" + +exec ./base-consensus diff --git a/consensus-entrypoint b/consensus-entrypoint new file mode 100755 index 000000000..be95aa3c5 --- /dev/null +++ b/consensus-entrypoint @@ -0,0 +1,15 @@ +#!/bin/bash +set -eu + +if [ "${USE_BASE_CONSENSUS:-false}" = "true" ]; then + if [ -f ./base-consensus-entrypoint ]; then + echo "Using Base Client" + exec ./base-consensus-entrypoint + else + echo "Base client is not supported for this node type" + exit 1 + fi +else + echo "Using OP Node" + exec ./op-node-entrypoint +fi diff --git a/docker-compose.yml b/docker-compose.yml index fc7cebe1d..83d2c4c1f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,8 @@ services: command: ["bash", "./execution-entrypoint"] volumes: - ${HOST_DATA_DIR}:/data + environment: + - USE_BASE_CONSENSUS=${USE_BASE_CONSENSUS:-false} env_file: - ${NETWORK_ENV:-.env.mainnet} # Use .env.mainnet by default, override with .env.sepolia for testnet node: @@ -28,6 +30,8 @@ services: - "9222:9222/udp" # P2P UDP - "7300:7300" # metrics - "6060:6060" # pprof - command: ["bash", "./op-node-entrypoint"] + command: ["bash", "./consensus-entrypoint"] + environment: + - USE_BASE_CONSENSUS=${USE_BASE_CONSENSUS:-false} env_file: - ${NETWORK_ENV:-.env.mainnet} # Use .env.mainnet by default, override with .env.sepolia for testnet diff --git a/geth/Dockerfile b/geth/Dockerfile index e9312e2f1..c32881405 100644 --- a/geth/Dockerfile +++ b/geth/Dockerfile @@ -39,5 +39,6 @@ COPY --from=geth /app/build/bin/geth ./ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY geth/geth-entrypoint ./execution-entrypoint COPY op-node-entrypoint . +COPY consensus-entrypoint . CMD ["/usr/bin/supervisord"] diff --git a/geth/geth-entrypoint b/geth/geth-entrypoint index 7180e8337..5b355d124 100755 --- a/geth/geth-entrypoint +++ b/geth/geth-entrypoint @@ -48,7 +48,7 @@ fi if [ "${HOST_IP:+x}" = x ]; then ADDITIONAL_ARGS="$ADDITIONAL_ARGS --nat=extip:$HOST_IP" -fi +fi exec ./geth \ --datadir="$GETH_DATA_DIR" \ diff --git a/nethermind/Dockerfile b/nethermind/Dockerfile index f03032f76..0ecb7360a 100644 --- a/nethermind/Dockerfile +++ b/nethermind/Dockerfile @@ -25,7 +25,7 @@ COPY versions.env /tmp/versions.env RUN . /tmp/versions.env && git clone $NETHERMIND_REPO --branch $NETHERMIND_TAG --single-branch . && \ git switch -c $NETHERMIND_TAG && \ bash -c '[ "$(git rev-parse HEAD)" = "$NETHERMIND_COMMIT" ]' - + RUN TARGETARCH=${TARGETARCH#linux/} && \ arch=$([ "$TARGETARCH" = "amd64" ] && echo "x64" || echo "$TARGETARCH") && \ echo "Using architecture: $arch" && \ @@ -46,5 +46,6 @@ COPY --from=op /app/op-node/bin/op-node ./ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY nethermind/nethermind-entrypoint ./execution-entrypoint COPY op-node-entrypoint . +COPY consensus-entrypoint . CMD ["/usr/bin/supervisord"] diff --git a/reth/Dockerfile b/reth/Dockerfile index 40777e2e3..2c9eec55f 100644 --- a/reth/Dockerfile +++ b/reth/Dockerfile @@ -52,7 +52,7 @@ RUN . /tmp/versions.env && git clone $BASE_RETH_NODE_REPO . && \ git checkout tags/$BASE_RETH_NODE_TAG && \ bash -c '[ "$(git rev-parse HEAD)" = "$BASE_RETH_NODE_COMMIT" ]' || (echo "Commit hash verification failed" && exit 1) -RUN cargo build --bin base-reth-node --profile maxperf +RUN cargo build --bin base-reth-node --bin base-consensus --profile maxperf FROM ubuntu:24.04 @@ -64,9 +64,12 @@ RUN mkdir -p /var/log/supervisor WORKDIR /app COPY --from=op /app/op-node/bin/op-node ./ +COPY --from=reth-base /app/target/maxperf/base-consensus ./ COPY --from=reth-base /app/target/maxperf/base-reth-node ./ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ./reth/reth-entrypoint ./execution-entrypoint COPY op-node-entrypoint . +COPY base-consensus-entrypoint . +COPY consensus-entrypoint . CMD ["/usr/bin/supervisord"] diff --git a/reth/reth-entrypoint b/reth/reth-entrypoint index 12d9b9cf8..0ffebc83f 100755 --- a/reth/reth-entrypoint +++ b/reth/reth-entrypoint @@ -35,7 +35,7 @@ case "$LOG_LEVEL" in "warn") LOG_LEVEL="vv" ;; - "info"|*) + "info") LOG_LEVEL="vvv" ;; "debug") @@ -44,8 +44,28 @@ case "$LOG_LEVEL" in "trace") LOG_LEVEL="vvvvv" ;; + *) + echo "Unknown log level: $LOG_LEVEL" + LOG_LEVEL="vvv" + ;; esac +wait_for_pid() { + local pid="$1" + + # Check if the process exists at all before waiting + if [[ ! -e "/proc/$pid" ]]; then + echo "Process $pid does not exist." >&2 + return 1 + fi + + echo "Waiting for process $pid to exit..." + while [[ -e "/proc/$pid" ]]; do + sleep 1 + done + echo "Process $pid has exited." +} + # Add pruning for base if [[ "${RETH_PRUNING_ARGS+x}" = x ]]; then echo "Adding pruning arguments: $RETH_PRUNING_ARGS" @@ -71,7 +91,7 @@ if [[ "$RETH_HISTORICAL_PROOFS" == "true" && -n "$RETH_HISTORICAL_PROOFS_STORAGE # wait for json-rpc to return a block number greater than 0 (synced beyond genesis) while true; do RESPONSE=$(curl -s -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest", false],"id":1}' http://127.0.0.1:"$RPC_PORT" 2>/dev/null || true) - + if echo "$RESPONSE" | grep -q '"number":"0x0"'; then echo "waiting for reth node to sync beyond genesis block" elif echo "$RESPONSE" | grep -q '"result"'; then @@ -80,7 +100,7 @@ if [[ "$RETH_HISTORICAL_PROOFS" == "true" && -n "$RETH_HISTORICAL_PROOFS_STORAGE else echo "waiting for reth node to start up" fi - + sleep 1 MAX_WAIT=$((MAX_WAIT - 1)) if [ "$MAX_WAIT" -eq 0 ]; then @@ -93,7 +113,7 @@ if [[ "$RETH_HISTORICAL_PROOFS" == "true" && -n "$RETH_HISTORICAL_PROOFS_STORAGE # shut down gracefully kill "$PID" - (wait "$PID" && echo "reth node initialized") || echo "warning: reth node exited with code $?" + (wait_for_pid "$PID" && echo "reth node initialized") || echo "warning: reth node exited with code $?" ADDITIONAL_ARGS="$ADDITIONAL_ARGS --proofs-history --proofs-history.storage-path=$RETH_HISTORICAL_PROOFS_STORAGE_PATH" @@ -108,7 +128,7 @@ fi mkdir -p "$RETH_DATA_DIR" echo "Starting reth with additional args: $ADDITIONAL_ARGS" -echo "$OP_NODE_L2_ENGINE_AUTH_RAW" > "$OP_NODE_L2_ENGINE_AUTH" +echo "$BASE_NODE_L2_ENGINE_AUTH_RAW" > "$BASE_NODE_L2_ENGINE_AUTH" exec "$BINARY" node \ -$LOG_LEVEL \ @@ -127,7 +147,7 @@ exec "$BINARY" node \ --ipcpath="$IPC_PATH" \ --authrpc.addr=0.0.0.0 \ --authrpc.port="$AUTHRPC_PORT" \ - --authrpc.jwtsecret="$OP_NODE_L2_ENGINE_AUTH" \ + --authrpc.jwtsecret="$BASE_NODE_L2_ENGINE_AUTH" \ --metrics=0.0.0.0:"$METRICS_PORT" \ --max-outbound-peers=100 \ --chain "$RETH_CHAIN" \ diff --git a/supervisord.conf b/supervisord.conf index 8021dce12..aa634ed35 100644 --- a/supervisord.conf +++ b/supervisord.conf @@ -3,8 +3,8 @@ nodaemon=true logfile=/dev/null logfile_maxbytes=0 -[program:op-node] -command=/app/op-node-entrypoint +[program:base-consensus] +command=/app/consensus-entrypoint stdout_logfile=/dev/fd/1 stdout_logfile_maxbytes=0 redirect_stderr=true