Compare commits

...

48 Commits

Author SHA1 Message Date
b15af199d4 zircuit: reth version v2.1.2->v2.1.1 for mainnet and garfield; add robinhood-sepolia URL to reference-rpc-endpoint.json 2026-08-28 04:17:37 +00:00
3478d286f6 reload_dshackle.sh: make gateway reconnect conditional on upstream/disabled-method removals
Operator ruling: NEVER force a reconnect on a routine reload/rpc-update run.
Only upstream REMOVALS or new disabled-method ADDITIONS require a gateway
reconnect to be seen by dRPC gateways.

Implement snapshot-based comparison:
- Before SIGHUP, read current advertised set (upstream IDs + disabled methods)
- Compare against previous snapshot (if exists)
- Drop established gRPC connections ONLY IF:
  * an upstream ID disappeared, OR
  * a new disabled-method entry appeared
- Pure additions or no change: reload only, no drop
- First run with no prior snapshot: do NOT drop, just write snapshot
- Always rewrite snapshot after successful reload
- All operations best-effort (failures never fail the script)

Live-measured: upstream/method additions propagate over existing connection
in ~16s (no reconnect needed).

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-27 03:28:32 +00:00
8f8ac427d3 kite: fix staking port mapping to use fixed container port 9651
Fix AVAGO_STAKING_PORT to use fixed port 9651 instead of salted client_port.
Fix port mapping from {{ client_port }}:{{ client_port }} to {{ client_port }}:9651
to ensure container uses fixed P2P port while host binds to salted port.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-27 03:23:29 +00:00
81c9addac9 reload_dshackle.sh: drop established gRPC connections after successful SIGHUP reload
Extend reload_dshackle.sh to drop established gateway gRPC connections on
port 2449 after a successful SIGHUP config reload, forcing the dRPC edge
to reconnect within ~1s and re-read the advertised chain/method list.
Gateways only re-initialize advertisements on reconnection (verified live:
0.03-0.06s serving gap, 33 re-probes in 4s). This allows deploy-time upstream
additions (new chains like mova, new backends like us-50) to be seen by
dRPC immediately rather than waiting for natural reconnection.

The TCP-level drop is best-effort: failure does NOT fail the script.
Operator ruling: this stays a TCP-level drop, NOT a dshackle code change.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-27 03:14:47 +00:00
37a26d8791 mova: add mainnet-v2 geth profile (pruned, archive)
Add MOVA Mainnet v2 node profile with geth client and std_pruned_archive
profiles (pebble/path pruned, leveldb/hash archive). Chain ID 61901.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-27 03:10:45 +00:00
783435dc20 Raise cronos feeHistory cap from 100 to 250
- Add FEEHISTORY_CAP env tunable with default 250
- Update init.sh to use FEEHISTORY_CAP for feehistory-cap in app.toml
- Maintain backward compatibility with JSON_RPC_FEEHISTORY_CAP
- Apply to both mainnet and testnet profiles

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-27 02:46:48 +00:00
48302a4270 abcore: fix version interpolation and state scheme
- Use canonical clients version substitution format:
  ${SERVICE_CLIENT_VERSION:-version} instead of ${SERVICE_GETH_VERSION:-version}
- Change profile from pruned-pebble-path to pruned-pebble-hash
- Remove --state.scheme=path from run command (geth v1.13 cannot write path scheme)
- Remove --state.scheme=path from init.sh geth init command
- Keep --db.engine=pebble and --config=/config/config.toml

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-26 03:35:23 +00:00
d5e3068e7f Fix abcore init: add --db.engine=pebble --state.scheme=path to geth init
Matches the run profile flags to prevent 'incompatible state scheme' crash
on fresh datadir initialization (stored: hash, provided: path).

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-26 03:27:25 +00:00
5182ab6bd4 Fix abcore mainnet: wire client_version to build arg and use equals form for --config flag
- Fix ABCORE_MAINNET_GETH_VERSION default from empty to v1.13.15-abcore-1.2
- Fix command flag from '--config /config/config.toml' to '--config=/config/config.toml'

Both issues caused first-deploy failures on rpc-de-32:
1. Empty version default caused curl exit 22 on binary download
2. Space-separated flag/value caused geth crash-loop with 'flag provided but not defined: -config'

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-26 03:14:14 +00:00
20e2c1a66e Merge pull request 'haqq: fix init.sh addrbook bootstrap bug' (#50) from issue-2601 into main 2026-08-26 02:45:56 +00:00
bedd7a32aa Add abcore mainnet node profile (chain-id 36888)
- Add abcore.Dockerfile for geth-fork binary download from ABFoundationGlobal/abcore
- Add scripts/init.sh for geth initialization with genesis.json and config.toml
- Add generated compose file abcore-mainnet-geth-pruned-pebble-path.yml
- Update compose_registry.json with new entry

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-26 02:44:57 +00:00
206fc78735 Merge branch 'main' into issue-2601 2026-08-26 02:42:30 +00:00
20511cd247 Merge pull request 'abcore mainnet: add geth-fork chain-id 36888' (#56) from issue-3079 into main 2026-08-26 02:35:13 +00:00
42bc7f504e avalanche fuji: enable C-chain state-sync on pruned profile (mirrors #48 for mainnet; full block execution was 55h+ ETA on the de-22 prune-cycle test node) 2026-08-26 01:50:29 +00:00
fed15a5484 Merge pull request 'avalanche: enable state-sync on C-chain pruned profile' (#48) from issue-2307 into main 2026-08-26 01:49:58 +00:00
ba44def37b fix zero-gravity doubled-v: add VERSION normalization to extraction RUN step
The previous commit (7cbd0532) added VERSION normalization to the DOWNLOAD
RUN step but forgot to add it to the EXTRACTION RUN step. Each Dockerfile
RUN is a fresh shell, so the extraction step fails with 'VERSION: unbound
variable' when it tries to use ${VERSION} in the SRC variable.

Fix: add VERSION="${ZERO_GRAVITY_VERSION#v}"; to the extraction RUN step
(line 73) so it defines VERSION before using it.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-25 09:14:25 +00:00
0071f41e4c tac: update mainnet peer list with verified live peers (2026-08-25) 2026-08-25 05:35:26 +00:00
7cbd053236 fix zero-gravity doubled-v bug in Dockerfile asset names
Remove leading 'v' from ZERO_GRAVITY_VERSION values in context.yml
(1.0.6, 3.0.8 instead of v1.0.6, v3.0.8) and add defensive stripping in
zerog.Dockerfile (VERSION=${ZERO_GRAVITY_VERSION#v}) to prevent
asset names like aristotle-vv1.0.6.tar.gz / galileo-vv3.0.8.tar.gz.

The asset filename is always <spec>-v<version>.tar.gz, and the Dockerfile
was adding a 'v' prefix to versions that already had one.

Verified URLs resolve:
- aristotle: https://github.com/0gfoundation/0gchain-Aristotle/releases/download/v1.0.6/aristotle-v1.0.6.tar.gz
- galileo: https://github.com/0gfoundation/0gchain-NG/releases/download/v3.0.8/galileo-v3.0.8.tar.gz

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-25 04:36:36 +00:00
6979290310 tac: fix malformed sed address ranges in init.sh
Fix four sed address ranges that were missing closing slash before comma:
- /^\[rpc\],/^\[/ -> /^\[rpc\]/,/^\[/
- /^\[json-rpc\],/^\[/ -> /^\[json-rpc\]/,/^\[/ (3 occurrences)

The malformed patterns caused sed to crash-loop the TAC container.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-25 04:08:06 +00:00
0e6c2a3bc7 zero-gravity: bump zerog node versions aristotle 1.0.6->v1.0.6, galileo 3.0.8->v3.0.8
Match upstream release tags: aristotle v1.0.6 (0gchain-Aristotle) and
galileo v3.0.8 (0gchain-NG) both carry v-prefix in their release tags.
Required for 0g hardfork; old clients stuck-syncing.

Supersedes stale unmergeable PR ethereum-rpc-docker#62.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-25 04:03:35 +00:00
Mistral Vibe
7cab80da70 avalanche: bump fuji avalanchego version to v1.15.0-fuji
Fuji validators run the v1.15.0-fuji prerelease and refuse v1.14.2 peers
('peer attempting to connect with newer version'), so fuji nodes cannot
bootstrap on the stable version.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-25 03:51:42 +00:00
fc9f82ec48 tac: fix crash-loop by installing GNU sed for sed command compatibility
The TAC mainnet container was crash-looping with 'sed: unsupported command ^'
because busybox sed in Alpine does not support the GNU sed extensions used in
the cometbft-common.sh scripts (address ranges with ^ anchor and {} grouping).

Adding the 'sed' package installs GNU sed which supports these features.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-25 03:40:27 +00:00
b93ad15f52 avalanche: add mainnet offline-prune config matching fuji pattern
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-24 05:31:21 +00:00
cff52429bd tac: add TAC mainnet archive profile with EVM JSON-RPC upstream
- Add archive profile (pruning=nothing) for tacchaind
- Change client_rpc_port from 26657 (CometBFT) to 8545 (EVM JSON-RPC)
- Update Dockerfile to download pre-built binary from GitHub releases v1.6.0
- Verify binary against checksums.txt
- Update init.sh to support PRUNING env var (nothing for archive, default for pruned)
- Update peers from NETWORKS.md
- Add archive snapshot URL note
- Traefik routes to EVM JSON-RPC port 8545 for both pruned and archive

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-23 10:55:39 +00:00
434717b194 deploy: regenerate compose from vibe-node main a86fd1cc5923 2026-08-20 17:16:40 +00:00
25b764684d deploy: regenerate compose from vibe-node main 57aeb4d4424f 2026-08-20 04:01:57 +00:00
b92fb0ecb3 deploy: regenerate compose from vibe-node main a1ebdcbaffd4 2026-08-13 08:08:13 +00:00
92cdb31d17 zero-gravity: init guard must check the CONFIG volume, not a data-volume proxy
aristotle @ rpc-de-32 crash-looped after its build was fixed:

    priv_validator_state.json found in /root/.0g. Continuing!
    Already initialized, continuing!
    panic: ProvideBlsSigner (node-core/components/signer.go:46):
           key file does not exist at path: /root/.0g/config/priv_validator_key.json

$DATA_DIR and $CONFIG_DIR are SEPARATE docker volumes (<node>_zerog and
<node>_config), but the guard tested only $DATA_DIR/priv_validator_state.json —
inferring the state of the config volume from a file on the data volume. Worse, the
copy order wrote that guard file BEFORE the two key files, so an init interrupted
between them left the data volume with the guard and the config volume without the
keys. Every later start then took the 'Already initialized' branch, copied nothing,
and panicked. Unrecoverable by restarting: the node wedges permanently. aristotle
got there via the repeated build failures earlier today.

Fix, two parts:
  - guard on everything 0gchaind needs to boot (both config keys AND the data state
    file), not one proxy file on the wrong volume;
  - write the keys FIRST and the guard file LAST, so an interrupted init re-runs on
    the next start instead of latching into the wedged state.

Tested locally against the real 0gchaind binary (aristotle v1.0.6), sandboxed HOME:

  scenario                     before            after
  fresh volumes                keys created      keys created        (no regression)
  wedged (state, no keys)      keys MISSING      keys created        (unwedges)
  partial (state+node_key)     keys MISSING      keys created
  healthy (all present)        no re-init        no re-init, and a SENTINEL written
                                                 into priv_validator_key.json survives
                                                 -> never clobbers an initialized node

The 'wedged' row reproduces aristotle's production failure exactly.

Note this regenerates node identity on an affected node (node_key.json,
priv_validator_key.json). These are RPC nodes that never sign, so a fresh identity is
harmless; chain data on the _zerog volume is untouched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 19:33:48 +00:00
4a060bee0d deploy: regenerate compose from vibe-node main 3c848087f5c8 2026-08-12 17:37:46 +00:00
4db13b2fc4 deploy: regenerate compose from vibe-node main 0415567d141c 2026-08-12 16:53:00 +00:00
6df9f0f17a zero-gravity: detect tarball layout; galileo 3.0.8 moved binaries to a shared root bin/
Fixes the de-32 build break introduced by vibe-node #2912 (galileo 3.0.3 -> 3.0.8,
merged as bc4cecf). Job ad580587:

    #16 chmod: cannot access '/0g/bin/0gchaind': No such file or directory

The Dockerfile hardcoded 'galileo -> mv <root>/rpc /0g'. That held for 3.0.3, where
every profile dir carried its own copy of the binaries. 3.0.8 DEDUPLICATED them into
a shared <root>/bin/ (168 MB -> 69 MB), leaving rpc/ as configs-only — so the move
produced configs and no binaries, and the build died two layers later on a chmod.

Note 'does <root>/rpc exist' is not a sufficient test: 3.0.8 still ships rpc/, it just
no longer holds bin/. Verified layouts:

  galileo 3.0.3     <root>/{rpc,validator,archive,seed}/bin/ + configs
  galileo 3.0.8     <root>/bin/ shared + <root>/{rpc,...}/ configs
  aristotle 1.0.6   <root>/bin/ + configs, no profile dirs

So: take configs from the profile dir when present, then top the binaries up from the
shared root bin/ if the profile dir did not supply them.

Also asserts both binaries exist immediately after extraction, naming the chain, the
version and the known layouts — so the next upstream reshuffle reports itself at the
point of failure rather than as an anonymous chmod error.

Verified against the real artifacts — all three now yield an identical /0g
(bin/0gchaind 76M, bin/geth 46M, geth-config.toml, geth-genesis.json,
kzg-trusted-setup.json, 0g-home/, rollback_cl.sh), and a synthetic unknown layout
exits 1 with the diagnostic instead of reaching chmod.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 11:09:51 +00:00
561ff43828 deploy: regenerate compose from vibe-node main bc4cecf1a74f 2026-08-12 08:38:04 +00:00
cfac32736e zero-gravity: resolve release tag by probing known forms; fail loudly on 404
0G publishes aristotle and galileo from two different repos, and neither uses a
consistent release-tag format. The asset filename is always <spec>-v<version>.tar.gz;
only the tag varies:

  aristotle -> 0gchain-Aristotle   1.0.4 = "1.0.4"    1.0.6 = "v1.0.6"
  galileo   -> 0gchain-NG          3.0.3 = "v3.0.3"   3.0.7 = "galileo-v3.0.7"   3.0.8 = "v3.0.8"

The hardcoded formats meant aristotle could not go past 1.0.4 and galileo could not
reach 3.0.7. Resolve the tag by trying the known forms in order instead.

Also switch curl -sL to -fsSL. Without -f a 404 HTML body was written into the
.tar.gz and the build failed several layers later at 'tar: not in gzip format',
an error pointing nowhere near the cause. That has now caused three separate
misdiagnoses, including a de-32 build blocker.

Verified end-to-end against the real artifacts: aristotle 1.0.4/1.0.6 and galileo
3.0.3/3.0.7/3.0.8 all resolve; aristotle 3.0.3 and galileo 9.9.9 fail immediately
with an actionable message.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-11 06:21:38 +00:00
799209b5d2 zero-gravity-aristotle: fix node version to 1.0.4 (was 3.0.3 which doesn't exist for Aristotle repo) 2026-08-10 21:56:44 +00:00
477e969e54 abcore: add mainnet genesis.json and config.toml for chain-id 36888 2026-08-09 00:19:29 +00:00
b0efb236bf Add abcore mainnet genesis.json (chain-id 36888, Newton) 2026-08-08 22:47:51 +00:00
17cd0d5f23 deploy: regenerate compose from vibe-node main c5e4641499ff 2026-08-07 12:13:22 +00:00
d57fd2e644 tempo-mainnet: bump reth to 1.12.0 (T9 hardfork requires v1.12.0, node crash-loop at block 33513646) 2026-08-06 16:24:58 +00:00
e1427de966 ethereum: bump blsync to alltools-v1.17.5 for go-ethereum v1.17.5 patch (2026-07-27); includes polygon-amoy bor 2.10.0-private for hardfork at block 44,120,000 2026-08-06 11:48:53 +00:00
db38905bfe polygon-amoy: bump bor from 2.9.0 to 2.10.0-private for private Amoy hardfork at block 44,120,000 (ExtraData layout change)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-05 22:35:04 +00:00
699723d742 berachain: upgrade bera-reth to v1.4.4 for Osaka1 hardfork support
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-05 21:15:20 +00:00
a0483f6934 thundercore: zeus is MAINNET (chainid 108) — fix mislabeled thundercore-testnet upstream label (drpc_name pin; SLUG-COLLISION lint find) 2026-08-05 05:09:30 +00:00
b940a72643 soneium: remove 5 orphaned 'soneium-miniato' composes (typo'd generated leftovers from a pre-rename config; correct minato-sepolia variants exist; flagged by SLUG-COLLISION lint) 2026-08-05 04:14:00 +00:00
d5e39c2329 zircuit: migrate mainnet to Conduit op-reth stack, drop dead op-geth archives
- Add zircuit-mainnet to conduit-op-reth (ghcr.io/conduitxyz/conduit-op-reth:v2.1.1)
- Add genesis.json/rollup.json from Conduit API with bedrockBlock=32956468 fix
- Add Conduit P2P bootnodes + static peer
- Use ETHEREUM_MAINNET_* vars for L1 (chainid 1) with oplabs op-node:v1.19.3
- Remove zircuit-mainnet op-geth archive/pruned profiles (SLS dependency dead)
- Keep sequencer endpoint and drpc_chain=zircuit-mainnet

SLS-decommission root cause: zircuit1/l2-geth hard-requires Zircuit-hosted
SLS DB that no longer resolves (mainnet-sls-db-global-primary.cluster-ro...
no such host). Migrating to Conduit external-node stack per operator directive.
2026-08-05 03:58:36 +00:00
rob
e536c19191 slug resolution: derive from dRPC chains.yaml, no in-code name heuristics
Regenerated by the expand_config.py redesign (see vibe-node commit). Slug
corrections, each verified present in chains.yaml:
  soneium-minato-sepolia x5: soneium (MAINNET!) -> soneium-minato
  avalanche-fuji x5:         avalanche (MAINNET!) -> avalanche-fuji
  thundercore-venus:         thundercore (MAINNET!) -> thundercore-testnet
  core-pigeon:               core-pigeon -> core-testnet
  zircuit-garfield:          zircuit-testnet -> zircuit-garfield-testnet
  sonic-testnet x2:          sonic-testnet -> sonic-testnet-v2
  ronin-saigon x3:           (none) -> ronin-saigon
  everclear-sepolia x2:      dropped (chain shut down 2026-06-05)
fuse-spark x3 (hand-written, fuse has chains: null in context.yml): x-upstreams
REMOVED - Sparknet is absent from chains.yaml; it declared the mainnet slug.

Verified: 310 testnet composes, 0 wrong-slug failures (was 22); 0 mainnet
composes carrying a testnet slug; 0 mainnet slug changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 03:28:22 +00:00
bfe5bdd97d haqq: add required DTEAM and allnodes.me seeds to bootstrap config 2026-08-04 12:04:21 +00:00
223c694085 haqq: fix bootstrap config - correct addrbook filename, add Polkachu seeds, persistent peers, auto-refresh from Polkachu when empty 2026-08-04 10:28:18 +00:00
7a3003cb63 avalanche: enable state-sync on C-chain pruned profile 2026-08-01 00:17:37 +00:00
100 changed files with 17532 additions and 1457 deletions

25
abcore/abcore.Dockerfile Normal file
View File

@@ -0,0 +1,25 @@
FROM rockylinux:9
COPY ./scripts/init.sh /usr/local/bin/init.sh
RUN chmod +x /usr/local/bin/init.sh
ARG ABCORE_MAINNET_GETH_VERSION
# Download and verify the geth binary from GitHub releases
RUN set -eu; \
VERSION="${ABCORE_MAINNET_GETH_VERSION}"; \
BINARY="geth-${VERSION}"; \
URL="https://github.com/ABFoundationGlobal/abcore/releases/download/${VERSION}/${BINARY}"; \
SHA256_URL="${URL}.sha256"; \
echo "abcore: downloading geth binary from ${URL}"; \
curl -fsSL "${URL}" -o "/tmp/${BINARY}"; \
echo "abcore: downloading sha256 checksum from ${SHA256_URL}"; \
curl -fsSL "${SHA256_URL}" -o "/tmp/${BINARY}.sha256"; \
cd /tmp; \
sha256sum -c "${BINARY}.sha256" || (echo "abcore: SHA256 verification failed for ${BINARY}" >&2 && exit 1); \
chmod +x "${BINARY}"; \
mkdir -p /abcore/bin; \
mv "${BINARY}" /abcore/bin/geth; \
rm -f "${BINARY}" "${BINARY}.sha256"
ENTRYPOINT [ "init.sh" ]

View File

@@ -0,0 +1,151 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# ABFoundationGlobal/abcore geth-fork client
# Distributed as release binaries from https://github.com/ABFoundationGlobal/abcore/releases
# Version: v1.13.15-abcore-1.2
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:abcore/geth/abcore-mainnet-geth-pruned-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/abcore-mainnet-geth \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
abcore-mainnet-geth:
build:
context: ./abcore
dockerfile: abcore.Dockerfile
args:
ABCORE_MAINNET_GETH_VERSION: ${ABCORE_MAINNET_GETH_VERSION:-v1.13.15-abcore-1.2}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 13110:13110
- 13110:13110/udp
expose:
- 8545
- 6060
environment:
- CHAIN_NAME=mainnet
entrypoint: [/usr/local/bin/init.sh]
command:
- --config=/config/config.toml
- --datadir=/root/.ethereum
- --db.engine=pebble
- --gcmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --networkid=36888
- --port=13110
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --syncmode=full
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ABCORE_MAINNET_GETH_PRUNED_PEBBLE_HASH_DATA:-abcore-mainnet-geth-pruned-pebble-hash}:/root/.ethereum
- ./abcore/mainnet:/config
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.abcore-mainnet-geth-pruned-pebble-hash-stripprefix.stripprefix.prefixes=/abcore-mainnet-geth
- traefik.http.services.abcore-mainnet-geth-pruned-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.abcore-mainnet-geth-pruned-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.abcore-mainnet-geth-pruned-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.abcore-mainnet-geth-pruned-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/abcore-mainnet-geth`) || Path(`/abcore-mainnet-geth/`))}
- ${NO_SSL:+traefik.http.routers.abcore-mainnet-geth-pruned-pebble-hash.rule=Path(`/abcore-mainnet-geth`) || Path(`/abcore-mainnet-geth/`)}
- traefik.http.routers.abcore-mainnet-geth-pruned-pebble-hash.middlewares=abcore-mainnet-geth-pruned-pebble-hash-stripprefix, ipallowlist
volumes:
abcore-mainnet-geth-pruned-pebble-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: abcore
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...

View File

@@ -0,0 +1,33 @@
[Eth]
NetworkId = 36888
SyncMode = "snap"
NoPruning = false
NoPrefetch = false
[Eth.Miner]
GasFloor = 0
GasCeil = 63000000
GasPrice = 50000000000000
Recommit = 2000000000
NewPayloadTimeout = 2000000000
[Node]
DataDir = "/root/.ethereum"
HTTPHost = "0.0.0.0"
HTTPPort = 8545
HTTPVirtualHosts = ["*"]
HTTPModules = ["eth", "net", "web3", "debug", "admin", "txpool", "engine"]
WSHost = "0.0.0.0"
WSPort = 8546
WSModules = ["eth", "net", "web3", "debug", "admin", "txpool", "engine"]
WSOrigins = ["*"]
[Node.P2P]
MaxPeers = 50
NoDiscovery = false
DiscoveryV4 = true
ListenAddr = ":33333"
[Metrics]
HTTP = "127.0.0.1"
Port = 6060

View File

@@ -0,0 +1,28 @@
{
"config": {
"chainId": 36888,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"muirGlacierBlock": 0,
"berlinBlock": 0,
"clique": {
"period": 3,
"epoch": 30000
}
},
"timestamp": "0x67fda368",
"difficulty": "1",
"gasLimit": "63000000",
"extradata": "0x0000000000000000000000000000000000000000000000000000000000000000E9B95948d28EF808a9184d5fC98346EF3e56839c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"alloc": {
"da8B88027Ac27532E1525DD67974c2377b450A08": {
"balance": "100000000000000000000000000000"
}
}
}

22
abcore/scripts/init.sh Normal file
View File

@@ -0,0 +1,22 @@
#!/bin/sh
set -e # Exit on failure
GETH_DATA_DIR="/root/.ethereum"
CONFIG_FILE="/config/config.toml"
GENESIS_FILE="/config/genesis.json"
# Initialize geth from genesis if data directory is empty
if [ -z "$(ls -A "$GETH_DATA_DIR")" ]; then
echo "abcore: data directory is empty, initializing from genesis..."
if [ -f "$GENESIS_FILE" ]; then
/abcore/bin/geth init --datadir "$GETH_DATA_DIR" --db.engine=pebble "$GENESIS_FILE"
else
echo "abcore: genesis file not found at $GENESIS_FILE" >&2
exit 1
fi
else
echo "abcore: data directory not empty, continuing..."
fi
exec /abcore/bin/geth --config "$CONFIG_FILE" --datadir "$GETH_DATA_DIR" "$@"

View File

@@ -116,7 +116,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: everclear-sepolia chain:
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -117,7 +117,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: everclear-sepolia chain:
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -45,7 +45,7 @@ services:
arc-mainnet-archive-sockets-init: arc-mainnet-archive-sockets-init:
image: debian:bookworm-slim image: debian:bookworm-slim
entrypoint: [/bin/sh, -c] entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets] command: [chown 999:999 /sockets]
restart: no restart: no
depends_on: depends_on:
arc-mainnet-archive-consensus-init: arc-mainnet-archive-consensus-init:

View File

@@ -45,7 +45,7 @@ services:
arc-mainnet-sockets-init: arc-mainnet-sockets-init:
image: debian:bookworm-slim image: debian:bookworm-slim
entrypoint: [/bin/sh, -c] entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets] command: [chown 999:999 /sockets]
restart: no restart: no
depends_on: depends_on:
arc-mainnet-consensus-init: arc-mainnet-consensus-init:

View File

@@ -45,7 +45,7 @@ services:
arc-testnet-archive-sockets-init: arc-testnet-archive-sockets-init:
image: debian:bookworm-slim image: debian:bookworm-slim
entrypoint: [/bin/sh, -c] entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets] command: [chown 999:999 /sockets]
restart: no restart: no
depends_on: depends_on:
arc-testnet-archive-consensus-init: arc-testnet-archive-consensus-init:

View File

@@ -45,7 +45,7 @@ services:
arc-testnet-sockets-init: arc-testnet-sockets-init:
image: debian:bookworm-slim image: debian:bookworm-slim
entrypoint: [/bin/sh, -c] entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets] command: [chown 999:999 /sockets]
restart: no restart: no
depends_on: depends_on:
arc-testnet-consensus-init: arc-testnet-consensus-init:

View File

@@ -45,7 +45,7 @@ services:
arc-testnet-sockets-init: arc-testnet-sockets-init:
image: debian:bookworm-slim image: debian:bookworm-slim
entrypoint: [/bin/sh, -c] entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets] command: [chown 999:999 /sockets]
restart: no restart: no
depends_on: depends_on:
arc-testnet-consensus-init: arc-testnet-consensus-init:

View File

@@ -1,4 +1,6 @@
{ {
"rpc-gas-cap": 2500000000, "rpc-gas-cap": 2500000000,
"eth-rpc-gas-limit": 2500000000 "eth-rpc-gas-limit": 2500000000,
"state-sync-enabled": true,
"state-sync-skip-resume": true
} }

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
avalanche-fuji-archive: avalanche-fuji-archive:
image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.14.2} image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.15.0-fuji}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -107,7 +107,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: avalanche chain: avalanche-fuji
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
avalanche-fuji: avalanche-fuji:
image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.14.2} image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.15.0-fuji}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -107,7 +107,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: avalanche chain: avalanche-fuji
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
avalanche-fuji: avalanche-fuji:
image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.14.2} image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.15.0-fuji}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -107,7 +107,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: avalanche chain: avalanche-fuji
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
avalanche-fuji: avalanche-fuji:
image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.14.2} image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.15.0-fuji}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -107,7 +107,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: avalanche chain: avalanche-fuji
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
avalanche-fuji: avalanche-fuji:
image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.14.2} image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.15.0-fuji}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -107,7 +107,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: avalanche chain: avalanche-fuji
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -1,23 +1,6 @@
{ {
"snowman-api-enabled": false,
"coreth-admin-api-enabled": false,
"net-api-enabled": true,
"rpc-gas-cap": 2500000000, "rpc-gas-cap": 2500000000,
"rpc-tx-fee-cap": 100,
"eth-rpc-gas-limit": 2500000000, "eth-rpc-gas-limit": 2500000000,
"eth-api-enabled": true,
"personal-api-enabled": false,
"tx-pool-api-enabled": false,
"debug-api-enabled": false,
"web3-api-enabled": true,
"local-txs-enabled": false,
"pruning-enabled": true,
"api-max-duration": 0,
"api-max-blocks-per-request": 0,
"allow-unfinalized-queries": false,
"log-level": "info",
"state-sync-enabled": false,
"state-sync-skip-resume": true,
"offline-pruning-enabled": true, "offline-pruning-enabled": true,
"offline-pruning-data-directory": "/root/.avalanchego/offline-pruning" "offline-pruning-data-directory": "/root/.avalanchego/offline-pruning"
} }

View File

@@ -16,6 +16,6 @@
"api-max-blocks-per-request": 0, "api-max-blocks-per-request": 0,
"allow-unfinalized-queries": false, "allow-unfinalized-queries": false,
"log-level": "info", "log-level": "info",
"state-sync-enabled": false, "state-sync-enabled": true,
"state-sync-skip-resume": true "state-sync-skip-resume": true
} }

View File

@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services: services:
berachain-bartio-reth: berachain-bartio-reth:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BARTIO_RETH_VERSION:-v1.4.0} image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BARTIO_RETH_VERSION:-v1.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services: services:
berachain-bartio-reth-pruned: berachain-bartio-reth-pruned:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BARTIO_RETH_VERSION:-v1.4.0} image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BARTIO_RETH_VERSION:-v1.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services: services:
berachain-bepolia-reth: berachain-bepolia-reth:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.3-rc.0} image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services: services:
berachain-bepolia-reth-pruned: berachain-bepolia-reth-pruned:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.3-rc.0} image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services: services:
berachain-mainnet-reth: berachain-mainnet-reth:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.2} image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services: services:
berachain-mainnet-reth-pruned: berachain-mainnet-reth-pruned:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.2} image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.4}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -1,4 +1,22 @@
[ [
{
"chain": "mainnet",
"client": "geth",
"compose_file": "abcore/geth/abcore-mainnet-geth-pruned-pebble-hash",
"drpc_chain": "abcore",
"features": [
"hash",
"pebble"
],
"network": "abcore",
"node": null,
"relay": null,
"stack": null,
"type": "pruned",
"volumes": [
"abcore-mainnet-geth-pruned-pebble-hash"
]
},
{ {
"chain": "mainnet", "chain": "mainnet",
"client": "external-node", "client": "external-node",
@@ -521,7 +539,7 @@
"chain": "sepolia", "chain": "sepolia",
"client": "nitro", "client": "nitro",
"compose_file": "arb/nitro/connext-sepolia-nitro-archive-leveldb-hash", "compose_file": "arb/nitro/connext-sepolia-nitro-archive-leveldb-hash",
"drpc_chain": "everclear-sepolia", "drpc_chain": null,
"features": [ "features": [
"hash", "hash",
"leveldb" "leveldb"
@@ -539,7 +557,7 @@
"chain": "sepolia", "chain": "sepolia",
"client": "nitro", "client": "nitro",
"compose_file": "arb/nitro/connext-sepolia-nitro-pruned-pebble-path", "compose_file": "arb/nitro/connext-sepolia-nitro-pruned-pebble-path",
"drpc_chain": "everclear-sepolia", "drpc_chain": null,
"features": [ "features": [
"path", "path",
"pebble" "pebble"
@@ -1092,7 +1110,7 @@
"chain": "fuji", "chain": "fuji",
"client": "go", "client": "go",
"compose_file": "avalanche/go/avalanche-fuji-go-archive-leveldb", "compose_file": "avalanche/go/avalanche-fuji-go-archive-leveldb",
"drpc_chain": "avalanche", "drpc_chain": "avalanche-fuji",
"features": [ "features": [
"leveldb" "leveldb"
], ],
@@ -1109,7 +1127,7 @@
"chain": "fuji", "chain": "fuji",
"client": "go", "client": "go",
"compose_file": "avalanche/go/avalanche-fuji-go-pruned-leveldb", "compose_file": "avalanche/go/avalanche-fuji-go-pruned-leveldb",
"drpc_chain": "avalanche", "drpc_chain": "avalanche-fuji",
"features": [ "features": [
"leveldb" "leveldb"
], ],
@@ -1126,7 +1144,7 @@
"chain": "fuji", "chain": "fuji",
"client": "go", "client": "go",
"compose_file": "avalanche/go/avalanche-fuji-go-pruned-pebbledb", "compose_file": "avalanche/go/avalanche-fuji-go-pruned-pebbledb",
"drpc_chain": "avalanche", "drpc_chain": "avalanche-fuji",
"features": [ "features": [
"leveldb" "leveldb"
], ],
@@ -1912,7 +1930,7 @@
"chain": "buffalo", "chain": "buffalo",
"client": "core", "client": "core",
"compose_file": "core/core/core-buffalo-core-pruned-pebble-path", "compose_file": "core/core/core-buffalo-core-pruned-pebble-path",
"drpc_chain": "core-testnet", "drpc_chain": null,
"features": [ "features": [
"path", "path",
"pebble" "pebble"
@@ -2002,7 +2020,7 @@
"chain": "pigeon", "chain": "pigeon",
"client": "core", "client": "core",
"compose_file": "core/core/core-pigeon-core-pruned-pebble-path", "compose_file": "core/core/core-pigeon-core-pruned-pebble-path",
"drpc_chain": "core-pigeon", "drpc_chain": "core-testnet",
"features": [ "features": [
"path", "path",
"pebble" "pebble"
@@ -2196,7 +2214,7 @@
"bonsai" "bonsai"
], ],
"network": "ethereum", "network": "ethereum",
"node": null, "node": "nimbus",
"relay": null, "relay": null,
"stack": null, "stack": null,
"type": "pruned", "type": "pruned",
@@ -3199,7 +3217,7 @@
"chain": "spark", "chain": "spark",
"client": "nethermind", "client": "nethermind",
"compose_file": "fuse/nethermind/fuse-spark-nethermind-archive-rocksdb-trace", "compose_file": "fuse/nethermind/fuse-spark-nethermind-archive-rocksdb-trace",
"drpc_chain": "fuse", "drpc_chain": null,
"features": [ "features": [
"rocksdb", "rocksdb",
"trace" "trace"
@@ -3217,7 +3235,7 @@
"chain": "spark", "chain": "spark",
"client": "nethermind", "client": "nethermind",
"compose_file": "fuse/nethermind/fuse-spark-nethermind-minimal-rocksdb-trace", "compose_file": "fuse/nethermind/fuse-spark-nethermind-minimal-rocksdb-trace",
"drpc_chain": "fuse", "drpc_chain": null,
"features": [ "features": [
"rocksdb", "rocksdb",
"trace" "trace"
@@ -3235,7 +3253,7 @@
"chain": "spark", "chain": "spark",
"client": "nethermind", "client": "nethermind",
"compose_file": "fuse/nethermind/fuse-spark-nethermind-pruned-rocksdb-trace", "compose_file": "fuse/nethermind/fuse-spark-nethermind-pruned-rocksdb-trace",
"drpc_chain": "fuse", "drpc_chain": null,
"features": [ "features": [
"rocksdb", "rocksdb",
"trace" "trace"
@@ -4148,6 +4166,42 @@
"morph-mainnet-l2geth-archive-leveldb-hash-mpt_morph" "morph-mainnet-l2geth-archive-leveldb-hash-mpt_morph"
] ]
}, },
{
"chain": "mainnet-v2",
"client": "geth",
"compose_file": "mova/geth/mova-mainnet-v2-geth-archive-leveldb-hash",
"drpc_chain": "mova-mainnet-v2",
"features": [
"hash",
"leveldb"
],
"network": "mova",
"node": null,
"relay": null,
"stack": null,
"type": "archive",
"volumes": [
"mova-mainnet-v2-geth-archive-leveldb-hash"
]
},
{
"chain": "mainnet-v2",
"client": "geth",
"compose_file": "mova/geth/mova-mainnet-v2-geth-pruned-pebble-path",
"drpc_chain": "mova-mainnet-v2",
"features": [
"path",
"pebble"
],
"network": "mova",
"node": null,
"relay": null,
"stack": null,
"type": "pruned",
"volumes": [
"mova-mainnet-v2-geth-pruned-pebble-path"
]
},
{ {
"chain": "mainnet", "chain": "mainnet",
"client": "erigon", "client": "erigon",
@@ -4429,7 +4483,7 @@
"trace" "trace"
], ],
"network": "metal", "network": "metal",
"node": "kona", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
@@ -4446,7 +4500,7 @@
"trace" "trace"
], ],
"network": "metal", "network": "metal",
"node": "kona", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
@@ -4625,20 +4679,20 @@
] ]
}, },
{ {
"chain": "sepolia", "chain": "minato-sepolia",
"client": "erigon", "client": "erigon",
"compose_file": "op/erigon/soneium-miniato-sepolia-op-erigon-archive-trace", "compose_file": "op/erigon/soneium-minato-sepolia-op-erigon-archive-trace",
"drpc_chain": "soneium", "drpc_chain": "soneium-minato",
"features": [ "features": [
"trace" "trace"
], ],
"network": "soneium-miniato", "network": "soneium",
"node": null, "node": "node",
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
"volumes": [ "volumes": [
"soneium-miniato-sepolia-op-erigon-archive-trace" "soneium-minato-sepolia-op-erigon-archive-trace"
] ]
}, },
{ {
@@ -5018,7 +5072,7 @@
"leveldb" "leveldb"
], ],
"network": "bnb", "network": "bnb",
"node": "node", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
@@ -5036,7 +5090,7 @@
"pebble" "pebble"
], ],
"network": "bnb", "network": "bnb",
"node": "node", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "pruned", "type": "pruned",
@@ -5054,7 +5108,7 @@
"leveldb" "leveldb"
], ],
"network": "bnb", "network": "bnb",
"node": "node", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
@@ -5072,7 +5126,7 @@
"pebble" "pebble"
], ],
"network": "bnb", "network": "bnb",
"node": "node", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "pruned", "type": "pruned",
@@ -6199,7 +6253,7 @@
"leveldb" "leveldb"
], ],
"network": "metal", "network": "metal",
"node": "kona", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
@@ -6235,7 +6289,7 @@
"pebble" "pebble"
], ],
"network": "metal", "network": "metal",
"node": "kona", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "pruned", "type": "pruned",
@@ -6271,7 +6325,7 @@
"leveldb" "leveldb"
], ],
"network": "metal", "network": "metal",
"node": "kona", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
@@ -6307,7 +6361,7 @@
"pebble" "pebble"
], ],
"network": "metal", "network": "metal",
"node": "kona", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "pruned", "type": "pruned",
@@ -6788,39 +6842,39 @@
] ]
}, },
{ {
"chain": "sepolia", "chain": "minato-sepolia",
"client": "geth", "client": "geth",
"compose_file": "op/geth/soneium-miniato-sepolia-op-geth-archive-leveldb-hash", "compose_file": "op/geth/soneium-minato-sepolia-op-geth-archive-leveldb-hash",
"drpc_chain": "soneium", "drpc_chain": "soneium-minato",
"features": [ "features": [
"hash", "hash",
"leveldb" "leveldb"
], ],
"network": "soneium-miniato", "network": "soneium",
"node": null, "node": "node",
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
"volumes": [ "volumes": [
"soneium-miniato-sepolia-op-geth-archive-leveldb-hash" "soneium-minato-sepolia-op-geth-archive-leveldb-hash"
] ]
}, },
{ {
"chain": "sepolia", "chain": "minato-sepolia",
"client": "geth", "client": "geth",
"compose_file": "op/geth/soneium-miniato-sepolia-op-geth-pruned-pebble-path", "compose_file": "op/geth/soneium-minato-sepolia-op-geth-pruned-pebble-path",
"drpc_chain": "soneium", "drpc_chain": "soneium-minato",
"features": [ "features": [
"path", "path",
"pebble" "pebble"
], ],
"network": "soneium-miniato", "network": "soneium",
"node": null, "node": "node",
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "pruned", "type": "pruned",
"volumes": [ "volumes": [
"soneium-miniato-sepolia-op-geth-pruned-pebble-path" "soneium-minato-sepolia-op-geth-pruned-pebble-path"
] ]
}, },
{ {
@@ -7293,78 +7347,6 @@
"xlayer-testnet-op-geth-pruned-pebble-path" "xlayer-testnet-op-geth-pruned-pebble-path"
] ]
}, },
{
"chain": "mainnet",
"client": "geth",
"compose_file": "op/geth/zircuit-mainnet-op-geth-archive-leveldb-hash",
"drpc_chain": "zircuit-mainnet",
"features": [
"hash",
"pebble"
],
"network": "zircuit",
"node": "node",
"relay": null,
"stack": "op",
"type": "archive",
"volumes": [
"zircuit-mainnet-op-geth-archive-leveldb-hash"
]
},
{
"chain": "mainnet",
"client": "geth",
"compose_file": "op/geth/zircuit-mainnet-op-geth-archive-pebble-hash",
"drpc_chain": "zircuit-mainnet",
"features": [
"hash",
"pebble"
],
"network": "zircuit",
"node": "node",
"relay": null,
"stack": "op",
"type": "archive",
"volumes": [
"zircuit-mainnet-op-geth-archive-pebble-hash"
]
},
{
"chain": "mainnet",
"client": "geth",
"compose_file": "op/geth/zircuit-mainnet-op-geth-pruned-pebble-hash",
"drpc_chain": "zircuit-mainnet",
"features": [
"hash",
"pebble"
],
"network": "zircuit",
"node": "node",
"relay": null,
"stack": "op",
"type": "pruned",
"volumes": [
"zircuit-mainnet-op-geth-pruned-pebble-hash"
]
},
{
"chain": "mainnet",
"client": "geth",
"compose_file": "op/geth/zircuit-mainnet-op-geth-pruned-pebble-path",
"drpc_chain": "zircuit-mainnet",
"features": [
"hash",
"pebble"
],
"network": "zircuit",
"node": "node",
"relay": null,
"stack": "op",
"type": "pruned",
"volumes": [
"zircuit-mainnet-op-geth-pruned-pebble-path"
]
},
{ {
"chain": "testnet", "chain": "testnet",
"client": "geth", "client": "geth",
@@ -7372,10 +7354,10 @@
"drpc_chain": "zircuit-testnet", "drpc_chain": "zircuit-testnet",
"features": [ "features": [
"hash", "hash",
"pebble" "leveldb"
], ],
"network": "zircuit", "network": "zircuit",
"node": "node", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
@@ -7393,7 +7375,7 @@
"pebble" "pebble"
], ],
"network": "zircuit", "network": "zircuit",
"node": "node", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
@@ -8173,7 +8155,7 @@
"trace" "trace"
], ],
"network": "metal", "network": "metal",
"node": "kona", "node": null,
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "pruned", "type": "pruned",
@@ -8491,37 +8473,37 @@
] ]
}, },
{ {
"chain": "sepolia", "chain": "minato-sepolia",
"client": "reth", "client": "reth",
"compose_file": "op/reth/soneium-miniato-sepolia-op-reth-archive-trace", "compose_file": "op/reth/soneium-minato-sepolia-op-reth-archive-trace",
"drpc_chain": "soneium", "drpc_chain": "soneium-minato",
"features": [ "features": [
"trace" "trace"
], ],
"network": "soneium-miniato", "network": "soneium",
"node": null, "node": "node",
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "archive", "type": "archive",
"volumes": [ "volumes": [
"soneium-miniato-sepolia-op-reth-archive-trace" "soneium-minato-sepolia-op-reth-archive-trace"
] ]
}, },
{ {
"chain": "sepolia", "chain": "minato-sepolia",
"client": "reth", "client": "reth",
"compose_file": "op/reth/soneium-miniato-sepolia-op-reth-pruned-trace", "compose_file": "op/reth/soneium-minato-sepolia-op-reth-pruned-trace",
"drpc_chain": "soneium", "drpc_chain": "soneium-minato",
"features": [ "features": [
"trace" "trace"
], ],
"network": "soneium-miniato", "network": "soneium",
"node": null, "node": "node",
"relay": null, "relay": null,
"stack": "op", "stack": "op",
"type": "pruned", "type": "pruned",
"volumes": [ "volumes": [
"soneium-miniato-sepolia-op-reth-pruned-trace" "soneium-minato-sepolia-op-reth-pruned-trace"
] ]
}, },
{ {
@@ -8749,7 +8731,7 @@
"chain": "garfield", "chain": "garfield",
"client": "reth", "client": "reth",
"compose_file": "op/reth/zircuit-garfield-op-reth-pruned-trace", "compose_file": "op/reth/zircuit-garfield-op-reth-pruned-trace",
"drpc_chain": "zircuit-testnet", "drpc_chain": "zircuit-garfield-testnet",
"features": [ "features": [
"trace" "trace"
], ],
@@ -8762,6 +8744,23 @@
"zircuit-garfield-op-reth-pruned-trace" "zircuit-garfield-op-reth-pruned-trace"
] ]
}, },
{
"chain": "mainnet",
"client": "reth",
"compose_file": "op/reth/zircuit-mainnet-op-reth-pruned-trace",
"drpc_chain": "zircuit-mainnet",
"features": [
"trace"
],
"network": "zircuit",
"node": "node",
"relay": null,
"stack": "op",
"type": "pruned",
"volumes": [
"zircuit-mainnet-op-reth-pruned-trace"
]
},
{ {
"chain": "mainnet", "chain": "mainnet",
"client": "reth", "client": "reth",
@@ -9187,7 +9186,7 @@
"chain": "saigon", "chain": "saigon",
"client": "ronin", "client": "ronin",
"compose_file": "ronin/ronin/ronin-saigon-ronin-archive-leveldb-hash", "compose_file": "ronin/ronin/ronin-saigon-ronin-archive-leveldb-hash",
"drpc_chain": null, "drpc_chain": "ronin-saigon",
"features": [ "features": [
"hash", "hash",
"leveldb" "leveldb"
@@ -9205,7 +9204,7 @@
"chain": "saigon", "chain": "saigon",
"client": "ronin", "client": "ronin",
"compose_file": "ronin/ronin/ronin-saigon-ronin-pruned-pebble-hash", "compose_file": "ronin/ronin/ronin-saigon-ronin-pruned-pebble-hash",
"drpc_chain": null, "drpc_chain": "ronin-saigon",
"features": [ "features": [
"hash", "hash",
"pebble" "pebble"
@@ -9223,7 +9222,7 @@
"chain": "saigon", "chain": "saigon",
"client": "ronin", "client": "ronin",
"compose_file": "ronin/ronin/ronin-saigon-ronin-pruned-pebble-path", "compose_file": "ronin/ronin/ronin-saigon-ronin-pruned-pebble-path",
"drpc_chain": null, "drpc_chain": "ronin-saigon",
"features": [ "features": [
"hash", "hash",
"pebble" "pebble"
@@ -9383,7 +9382,7 @@
"pebble" "pebble"
], ],
"network": "shibarium", "network": "shibarium",
"node": "heimdall", "node": null,
"relay": null, "relay": null,
"stack": null, "stack": null,
"type": "archive", "type": "archive",
@@ -9402,7 +9401,7 @@
"pebble" "pebble"
], ],
"network": "shibarium", "network": "shibarium",
"node": "heimdall", "node": null,
"relay": null, "relay": null,
"stack": null, "stack": null,
"type": "pruned", "type": "pruned",
@@ -9481,7 +9480,7 @@
"chain": "testnet", "chain": "testnet",
"client": "sonic", "client": "sonic",
"compose_file": "sonic/sonic/sonic-testnet-sonic-archive", "compose_file": "sonic/sonic/sonic-testnet-sonic-archive",
"drpc_chain": "sonic-testnet", "drpc_chain": "sonic-testnet-v2",
"features": [], "features": [],
"network": "sonic", "network": "sonic",
"node": null, "node": null,
@@ -9496,7 +9495,7 @@
"chain": "testnet", "chain": "testnet",
"client": "sonic", "client": "sonic",
"compose_file": "sonic/sonic/sonic-testnet-sonic-pruned", "compose_file": "sonic/sonic/sonic-testnet-sonic-pruned",
"drpc_chain": "sonic-testnet", "drpc_chain": "sonic-testnet-v2",
"features": [], "features": [],
"network": "sonic", "network": "sonic",
"node": null, "node": null,
@@ -9727,6 +9726,22 @@
"starknet-sepolia-pathfinder-pruned" "starknet-sepolia-pathfinder-pruned"
] ]
}, },
{
"chain": "mainnet",
"client": "tacchaind",
"compose_file": "tac/tacchaind/tac-mainnet-tacchaind-archive",
"drpc_chain": "tac",
"features": [],
"network": "tac",
"node": "config",
"relay": null,
"stack": null,
"type": "archive",
"volumes": [
"tac-mainnet-tacchaind-archive",
"tac-mainnet-tacchaind-archive_config"
]
},
{ {
"chain": "mainnet", "chain": "mainnet",
"client": "tacchaind", "client": "tacchaind",
@@ -9743,6 +9758,22 @@
"tac-mainnet-tacchaind-pruned_config" "tac-mainnet-tacchaind-pruned_config"
] ]
}, },
{
"chain": "spb",
"client": "tacchaind",
"compose_file": "tac/tacchaind/tac-spb-tacchaind-archive",
"drpc_chain": "tac-spb",
"features": [],
"network": "tac",
"node": "config",
"relay": null,
"stack": null,
"type": "archive",
"volumes": [
"tac-spb-tacchaind-archive",
"tac-spb-tacchaind-archive_config"
]
},
{ {
"chain": "spb", "chain": "spb",
"client": "tacchaind", "client": "tacchaind",
@@ -10038,7 +10069,7 @@
"trace" "trace"
], ],
"network": "taiko", "network": "taiko",
"node": "driver", "node": null,
"relay": null, "relay": null,
"stack": null, "stack": null,
"type": "archive", "type": "archive",
@@ -10055,7 +10086,7 @@
"trace" "trace"
], ],
"network": "taiko", "network": "taiko",
"node": "driver", "node": null,
"relay": null, "relay": null,
"stack": null, "stack": null,
"type": "pruned", "type": "pruned",

View File

@@ -115,7 +115,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: core-testnet chain:
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -115,7 +115,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: core-pigeon chain: core-testnet
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -35,7 +35,7 @@ services:
dockerfile: cometbft.Dockerfile dockerfile: cometbft.Dockerfile
args: args:
CL_IMAGE: ${COSMOS_GAIAD_IMAGE:-ghcr.io/cosmos/gaia} CL_IMAGE: ${COSMOS_GAIAD_IMAGE:-ghcr.io/cosmos/gaia}
CL_VERSION: ${COSMOS_MAINNET_GAIAD_VERSION:-v27.5.0} CL_VERSION: ${COSMOS_MAINNET_GAIAD_VERSION:-v27.6.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -61,12 +61,13 @@ services:
- API=eth,txpool,net,debug,web3 - API=eth,txpool,net,debug,web3
- CHAINID=cronosmainnet_25-1 - CHAINID=cronosmainnet_25-1
- EVM_MAX_TX_GAS_WANTED=500000 - EVM_MAX_TX_GAS_WANTED=500000
- FEEHISTORY_CAP=250
- GENESIS_URL=https://raw.githubusercontent.com/crypto-org-chain/cronos-mainnet/master/cronosmainnet_25-1/genesis.json - GENESIS_URL=https://raw.githubusercontent.com/crypto-org-chain/cronos-mainnet/master/cronosmainnet_25-1/genesis.json
- IP=${IP} - IP=${IP}
- JSON_RPC_BLOCK_RANGE_CAP=10000 - JSON_RPC_BLOCK_RANGE_CAP=10000
- JSON_RPC_ENABLE=true - JSON_RPC_ENABLE=true
- JSON_RPC_ENABLE_INDEXER=true - JSON_RPC_ENABLE_INDEXER=true
- JSON_RPC_FEEHISTORY_CAP=100 - JSON_RPC_FEEHISTORY_CAP=250
- JSON_RPC_HTTP_TIMEOUT=30s - JSON_RPC_HTTP_TIMEOUT=30s
- JSON_RPC_LOGS_CAP=10000 - JSON_RPC_LOGS_CAP=10000
- MIN_GAS=5000000000000basecro - MIN_GAS=5000000000000basecro

View File

@@ -61,12 +61,13 @@ services:
- API=eth,txpool,net,debug,web3 - API=eth,txpool,net,debug,web3
- CHAINID=cronostestnet_338-3 - CHAINID=cronostestnet_338-3
- EVM_MAX_TX_GAS_WANTED=500000 - EVM_MAX_TX_GAS_WANTED=500000
- FEEHISTORY_CAP=250
- GENESIS_URL=https://raw.githubusercontent.com/crypto-org-chain/cronos-testnets/main/cronostestnet_338-3/genesis.json - GENESIS_URL=https://raw.githubusercontent.com/crypto-org-chain/cronos-testnets/main/cronostestnet_338-3/genesis.json
- IP=${IP} - IP=${IP}
- JSON_RPC_BLOCK_RANGE_CAP=10000 - JSON_RPC_BLOCK_RANGE_CAP=10000
- JSON_RPC_ENABLE=true - JSON_RPC_ENABLE=true
- JSON_RPC_ENABLE_INDEXER=true - JSON_RPC_ENABLE_INDEXER=true
- JSON_RPC_FEEHISTORY_CAP=100 - JSON_RPC_FEEHISTORY_CAP=250
- JSON_RPC_HTTP_TIMEOUT=30s - JSON_RPC_HTTP_TIMEOUT=30s
- JSON_RPC_LOGS_CAP=10000 - JSON_RPC_LOGS_CAP=10000
- MIN_GAS=5000000000000basetcro - MIN_GAS=5000000000000basetcro

View File

@@ -18,7 +18,8 @@ PRUNING_KEEP_RECENT="${PRUNING_KEEP_RECENT:-100}"
PRUNING_INTERVAL="${PRUNING_INTERVAL:-19}" PRUNING_INTERVAL="${PRUNING_INTERVAL:-19}"
JSON_RPC_ENABLE="${JSON_RPC_ENABLE:-true}" JSON_RPC_ENABLE="${JSON_RPC_ENABLE:-true}"
JSON_RPC_ENABLE_INDEXER="${JSON_RPC_ENABLE_INDEXER:-true}" JSON_RPC_ENABLE_INDEXER="${JSON_RPC_ENABLE_INDEXER:-true}"
JSON_RPC_FEEHISTORY_CAP="${JSON_RPC_FEEHISTORY_CAP:-100}" FEEHISTORY_CAP="${FEEHISTORY_CAP:-250}"
JSON_RPC_FEEHISTORY_CAP="${JSON_RPC_FEEHISTORY_CAP:-$FEEHISTORY_CAP}"
JSON_RPC_LOGS_CAP="${JSON_RPC_LOGS_CAP:-10000}" JSON_RPC_LOGS_CAP="${JSON_RPC_LOGS_CAP:-10000}"
JSON_RPC_BLOCK_RANGE_CAP="${JSON_RPC_BLOCK_RANGE_CAP:-10000}" JSON_RPC_BLOCK_RANGE_CAP="${JSON_RPC_BLOCK_RANGE_CAP:-10000}"
JSON_RPC_HTTP_TIMEOUT="${JSON_RPC_HTTP_TIMEOUT:-30s}" JSON_RPC_HTTP_TIMEOUT="${JSON_RPC_HTTP_TIMEOUT:-30s}"
@@ -47,7 +48,7 @@ sed -i "/^\[json-rpc\]/,/^\[/{s|^ws-origins = .*|ws-origins = \"$JSON_RPC_WS_ORI
sed -i "/^\[json-rpc\]/,/^\[/{s|^api = .*|api = \"$API\"|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^api = .*|api = \"$API\"|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^enable = .*|enable = $JSON_RPC_ENABLE|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^enable = .*|enable = $JSON_RPC_ENABLE|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^enable-indexer = .*|enable-indexer = $JSON_RPC_ENABLE_INDEXER|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^enable-indexer = .*|enable-indexer = $JSON_RPC_ENABLE_INDEXER|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^feehistory-cap = .*|feehistory-cap = $JSON_RPC_FEEHISTORY_CAP|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^feehistory-cap = .*|feehistory-cap = $FEEHISTORY_CAP|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^logs-cap = .*|logs-cap = $JSON_RPC_LOGS_CAP|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^logs-cap = .*|logs-cap = $JSON_RPC_LOGS_CAP|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^block-range-cap = .*|block-range-cap = $JSON_RPC_BLOCK_RANGE_CAP|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^block-range-cap = .*|block-range-cap = $JSON_RPC_BLOCK_RANGE_CAP|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^http-timeout = .*|http-timeout = \"$JSON_RPC_HTTP_TIMEOUT\"|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^http-timeout = .*|http-timeout = \"$JSON_RPC_HTTP_TIMEOUT\"|}" "$CONFIG_DIR/app.toml"

View File

@@ -61,6 +61,7 @@ services:
- --engine.cross-block-cache-size=${ETHEREUM_HOODI_RETH_STATE_CACHE:-4096} - --engine.cross-block-cache-size=${ETHEREUM_HOODI_RETH_STATE_CACHE:-4096}
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -62,6 +62,7 @@ services:
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --full - --full
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -61,6 +61,7 @@ services:
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096} - --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -61,6 +61,7 @@ services:
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096} - --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -61,6 +61,7 @@ services:
- --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096} - --engine.cross-block-cache-size=${ETHEREUM_MAINNET_RETH_STATE_CACHE:-4096}
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -65,6 +65,7 @@ services:
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --full - --full
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001
@@ -123,7 +124,7 @@ services:
- pruning - pruning
ethereum-mainnet-reth-minimal-node: ethereum-mainnet-reth-minimal-node:
image: ${ETHEREUM_BLSYNC_IMAGE:-ethereum/client-go}:${ETHEREUM_MAINNET_BLSYNC_VERSION:-alltools-v1.17.4} image: ${ETHEREUM_BLSYNC_IMAGE:-ethereum/client-go}:${ETHEREUM_MAINNET_BLSYNC_VERSION:-alltools-v1.17.5}
ports: ports:
- 19286:19286 - 19286:19286
- 19286:19286/udp - 19286:19286/udp

View File

@@ -87,6 +87,7 @@ services:
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --full - --full
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -62,6 +62,7 @@ services:
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --full - --full
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -62,6 +62,7 @@ services:
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --full - --full
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -62,6 +62,7 @@ services:
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --full - --full
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -61,6 +61,7 @@ services:
- --engine.cross-block-cache-size=${ETHEREUM_SEPOLIA_RETH_STATE_CACHE:-4096} - --engine.cross-block-cache-size=${ETHEREUM_SEPOLIA_RETH_STATE_CACHE:-4096}
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -61,6 +61,7 @@ services:
- --engine.cross-block-cache-size=${ETHEREUM_SEPOLIA_RETH_STATE_CACHE:-4096} - --engine.cross-block-cache-size=${ETHEREUM_SEPOLIA_RETH_STATE_CACHE:-4096}
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -62,6 +62,7 @@ services:
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --full - --full
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -62,6 +62,7 @@ services:
- --engine.memory-block-buffer-target=0 - --engine.memory-block-buffer-target=0
- --engine.persistence-threshold=0 - --engine.persistence-threshold=0
- --full - --full
- --gpo.ignoreprice=2
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001

View File

@@ -96,26 +96,8 @@ services:
volumes: volumes:
fuse-spark-nethermind-archive-rocksdb-trace: fuse-spark-nethermind-archive-rocksdb-trace:
x-upstreams: # fuse-spark (Sparknet, chainid 123) is ABSENT from dRPC chains.yaml - not a
- id: $${ID} # servable dRPC chain. x-upstreams removed 2026-08-05 (it declared the MAINNET
labels: # slug "fuse", which would have advertised testnet data as mainnet). This file is
provider: $${PROVIDER} # hand-written (fuse has chains: null in context.yml); onboarding it to generation
connection: # is the clean long-term fix. See chain-aliases.yaml fuse/spark: null.
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: fuse
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -99,26 +99,8 @@ services:
volumes: volumes:
fuse-spark-nethermind-minimal-rocksdb-trace: fuse-spark-nethermind-minimal-rocksdb-trace:
x-upstreams: # fuse-spark (Sparknet, chainid 123) is ABSENT from dRPC chains.yaml - not a
- id: $${ID} # servable dRPC chain. x-upstreams removed 2026-08-05 (it declared the MAINNET
labels: # slug "fuse", which would have advertised testnet data as mainnet). This file is
provider: $${PROVIDER} # hand-written (fuse has chains: null in context.yml); onboarding it to generation
connection: # is the clean long-term fix. See chain-aliases.yaml fuse/spark: null.
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: fuse
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -94,26 +94,8 @@ services:
volumes: volumes:
fuse-spark-nethermind-pruned-rocksdb-trace: fuse-spark-nethermind-pruned-rocksdb-trace:
x-upstreams: # fuse-spark (Sparknet, chainid 123) is ABSENT from dRPC chains.yaml - not a
- id: $${ID} # servable dRPC chain. x-upstreams removed 2026-08-05 (it declared the MAINNET
labels: # slug "fuse", which would have advertised testnet data as mainnet). This file is
provider: $${PROVIDER} # hand-written (fuse has chains: null in context.yml); onboarding it to generation
connection: # is the clean long-term fix. See chain-aliases.yaml fuse/spark: null.
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: fuse
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -0,0 +1,223 @@
#!/bin/sh
# cometbft-common.sh — reusable CometBFT-node bootstrap helpers (family C).
#
# Source this from a chain-specific init.sh. It encapsulates the operations every
# CometBFT-consensus node needs (init, fetch config artifacts, patch config.toml /
# app.toml, seed priv_validator_state), extracted verbatim from the proven berachain
# beacon-kit entrypoint so callers inherit known-good behavior.
#
# Each function takes explicit arguments (paths/values) — it is binary-agnostic. The
# caller owns the binary name, the `<binary> init` invocation, the artifact URLs, and
# the final `exec <binary> start ...`. EL-driven chains (beacon-kit, morph) also call
# the JWT / engine-dial helpers; pure-consensus chains (gaiad) skip them.
#
# Conventions: POSIX sh (alpine). Config dir is conventionally $HOME_DIR/config.
# Used by: morph-node, gaiad (cosmos batch), and any future family-C chain.
# beacon-kit (berachain) keeps its own bespoke init.sh on purpose — do not retrofit it.
set -e
ct_log() { echo "[cometbft-init] $*"; }
# Ensure curl exists (alpine base images often omit it). Idempotent.
ct_require_curl() {
if ! command -v curl >/dev/null 2>&1; then
ct_log "installing curl"
apk add --no-cache curl
fi
}
# ct_fetch URL DEST [required]
# Download URL -> DEST. If the 3rd arg is "required", a failure is fatal;
# otherwise a missing/failed fetch is logged and skipped (returns 0).
ct_fetch() {
_url="$1"; _dest="$2"; _req="${3:-optional}"
[ -n "$_url" ] || { [ "$_req" = required ] && { ct_log "FATAL: empty URL for $_dest"; exit 1; }; return 0; }
if curl -fsSL "$_url" -o "$_dest"; then
ct_log "fetched $_url -> $_dest"
else
if [ "$_req" = required ]; then
ct_log "FATAL: failed to fetch required $_url"; exit 1
fi
ct_log "skip: could not fetch optional $_url"
fi
}
# ct_patch_p2p CONFIG_TOML IP P2P_PORT
# Bind p2p to 0.0.0.0:PORT and advertise IP:PORT (only within the [p2p] section).
ct_patch_p2p() {
_cfg="$1"; _ip="$2"; _port="$3"
[ -f "$_cfg" ] || { ct_log "patch_p2p: $_cfg missing, skipping"; return 0; }
_laddr="tcp:\\/\\/0\\.0\\.0\\.0\\:${_port}"
sed -i "/^\[p2p\]/,/^\[/{s|^laddr = .*|laddr = \"$_laddr\"|}" "$_cfg"
sed -i "/^\[p2p\]/,/^\[/{s|^external_address = .*|external_address = \"${_ip}:${_port}\"|}" "$_cfg"
}
# ct_merge_seeds CONFIG_TOML CONFIGURED_SEEDS [SEEDS_URL]
# Merge operator-configured seeds with an optional official seed list (1 entry per
# line, first line skipped like the berachain cl-seeds.txt header), dedupe, write.
ct_merge_seeds() {
_cfg="$1"; _seeds="$2"; _url="$3"
[ -f "$_cfg" ] || return 0
if [ -n "$_url" ]; then
_official=$(curl -f -s "$_url" | tail -n +2 | tr '\n' ',' | sed 's/,$//' || true)
if [ -n "$_official" ]; then
ct_log "merging official seeds from $_url"
_seeds=$(echo "${_seeds},${_official}" | tr ',' '\n' | sed '/^$/d' | sort -u | paste -sd,)
else
ct_log "no official seeds fetched from $_url (continuing with configured)"
fi
fi
if [ -n "$_seeds" ]; then
sed -i "s/^seeds = \".*\"/seeds = \"${_seeds}\"/" "$_cfg"
fi
}
# ct_set_persistent_peers CONFIG_TOML PEERS
# Handles both cometbft-classic `persistent_peers` (underscore) and forks that use
# `persistent-peers` (hyphen, e.g. sei) — patches whichever key is present.
ct_set_persistent_peers() {
_cfg="$1"; _peers="$2"
[ -f "$_cfg" ] || return 0
[ -n "$_peers" ] || return 0
sed -i "s/^persistent_peers = \".*\"/persistent_peers = \"${_peers}\"/" "$_cfg"
sed -i "s/^persistent-peers = \".*\"/persistent-peers = \"${_peers}\"/" "$_cfg"
return 0
}
# ct_set_moniker CONFIG_TOML MONIKER
ct_set_moniker() {
_cfg="$1"; _mon="$2"
[ -f "$_cfg" ] || return 0
[ -n "$_mon" ] && sed -i "s/^moniker = \".*\"/moniker = \"$_mon\"/" "$_cfg"
return 0
}
# ct_set_addrbook CONFIG_DIR ADDRBOOK_URL
# Optional: cosmos chains often seed an addrbook.json for faster peer discovery.
ct_set_addrbook() {
_dir="$1"; _url="$2"
[ -n "$_url" ] || return 0
ct_fetch "$_url" "$_dir/addrbook.json" optional
}
# ct_write_jwt CONFIG_DIR [JWT_SRC]
# EL-driven chains: copy the shared engine JWT (default /jwtsecret) into the config
# dir as jwt.hex so the CL can authenticate to the EL engine API.
ct_write_jwt() {
_dir="$1"; _src="${2:-/jwtsecret}"
[ -f "$_src" ] || { ct_log "write_jwt: $_src missing, skipping"; return 0; }
cat "$_src" > "$_dir/jwt.hex"
}
# ct_set_rpc_dial_url APP_TOML AUTH_RPC
# beacon-kit / app.toml-style EL engine endpoint (e.g. http://<el>:8551).
ct_set_rpc_dial_url() {
_app="$1"; _rpc="$2"
[ -f "$_app" ] || return 0
[ -n "$_rpc" ] && sed -i "s|^rpc-dial-url = \".*\"|rpc-dial-url = \"$_rpc\"|" "$_app"
return 0
}
# ct_seed_priv_validator_state HOME_DIR
# Ensure data/priv_validator_state.json exists (cometbft refuses to start without it
# when one is present in config/). Mirrors the berachain init.sh behavior.
ct_seed_priv_validator_state() {
_home="$1"
if [ -e "$_home/config/priv_validator_state.json" ] && [ ! -e "$_home/data/priv_validator_state.json" ]; then
mkdir -p "$_home/data"
cp "$_home/config/priv_validator_state.json" "$_home/data/priv_validator_state.json"
fi
return 0
}
# ct_apk PKG...
# Install alpine packages idempotently (most cosmos init scripts need curl, some jq).
ct_apk() {
apk add --no-cache "$@"
}
# ct_localize_home CONFIG_DIR
# Rewrite `~/` to `/root/` in config.toml + app.toml. Cosmos `init` writes home-relative
# paths; the container runs as root with a static home, so make paths absolute.
ct_localize_home() {
_dir="$1"
[ -f "$_dir/config.toml" ] && sed -i 's|~/|/root/|g' "$_dir/config.toml"
[ -f "$_dir/app.toml" ] && sed -i 's|~/|/root/|g' "$_dir/app.toml"
return 0
}
# ct_set_min_gas_prices APP_TOML PRICE
# Cosmos chains reject txs (and sometimes refuse to start) with an empty
# minimum-gas-prices. PRICE e.g. "0.01usei", "0.0025uatom", "0.01hqq".
ct_set_min_gas_prices() {
_app="$1"; _price="$2"
[ -f "$_app" ] || return 0
[ -n "$_price" ] || return 0
sed -i "s/minimum-gas-prices = \"\"/minimum-gas-prices = \"${_price}\"/g" "$_app"
return 0
}
# ct_configure_statesync CONFIG_TOML RPC_SERVERS [TRUST_OFFSET]
# Enable cometbft state-sync so a fresh node bootstraps near chainhead instead of
# replaying from genesis — the single biggest lever for "can't keep it at chainhead"
# chains. RPC_SERVERS = comma list of trusted RPC endpoints (>=2 recommended; a single
# endpoint is duplicated). TRUST_OFFSET = blocks below head to trust (default 2000).
# Requires jq + curl. No-op (logged) if head height can't be fetched.
ct_configure_statesync() {
_cfg="$1"; _rpc="$2"; _offset="${3:-2000}"
[ -f "$_cfg" ] || return 0
# NEVER re-arm statesync on a node that already has application state (a restored
# snapshot or a prior sync). Re-statesyncing over it leaves a broken/partial datadir and,
# for wasm chains, drops the wasm files -> startup panic. _cfg is $HOME/config/config.toml,
# so application state lives at $HOME/data/application.db.
_home=$(dirname "$(dirname "$_cfg")")
if [ -e "$_home/data/application.db" ]; then
ct_log "statesync: existing data dir, skipping"
return 0
fi
[ -n "$_rpc" ] || { ct_log "statesync: no RPC servers given, skipping"; return 0; }
_primary=$(echo "$_rpc" | cut -d, -f1)
_latest=$(curl -s "$_primary/block" | jq -r '.result.block.header.height // .block.header.height' 2>/dev/null || true)
if [ -z "$_latest" ] || [ "$_latest" = null ]; then
ct_log "statesync: could not read head height from $_primary, skipping"; return 0
fi
_trust_h=$((_latest - _offset))
_trust_hash=$(curl -s "$_primary/block?height=$_trust_h" | jq -r '.result.block_id.hash // .block_id.hash' 2>/dev/null || true)
[ -n "$_trust_hash" ] && [ "$_trust_hash" != null ] || { ct_log "statesync: no trust hash, skipping"; return 0; }
# second server defaults to the first (cometbft wants >=2 for light-client cross-check)
echo "$_rpc" | grep -q ',' || _rpc="$_rpc,$_rpc"
ct_log "statesync: enable trust_height=$_trust_h trust_hash=$_trust_hash"
# Patch ONLY the [statesync] section. CometBFT config.toml uses underscore keys
# (rpc_servers/trust_height/trust_hash); tolerate hyphen variants with [_-].
sed -i.bak -E "/^\[statesync\]/,/^\[/{
s|^([[:space:]]*enable[[:space:]]*=[[:space:]]*).*|\1true|
s|^([[:space:]]*rpc[_-]servers[[:space:]]*=[[:space:]]*).*|\1\"$_rpc\"|
s|^([[:space:]]*trust[_-]height[[:space:]]*=[[:space:]]*).*|\1$_trust_h|
s|^([[:space:]]*trust[_-]hash[[:space:]]*=[[:space:]]*).*|\1\"$_trust_hash\"|
}" "$_cfg"
return 0
}
# ct_ensure_wasm HOME_DIR WASM_SNAPSHOT_URL
# CosmWasm + IBC 08-wasm bytecode are FILES on disk that state-sync does NOT restore, so
# a state-synced wasm chain panics at startup ("wasmlckeeper failed initialize pinned codes
# / Error opening Wasm file"). Seed them from a wasm-only snapshot (e.g. polkachu
# cosmos_wasmonly.tar.lz4) when the wasm dir is missing/empty. No-op if URL unset or wasm
# already present. Best-effort (logs on failure); the fully robust path for wasm chains is a
# FULL snapshot restore. Requires lz4 + tar (installed here).
ct_ensure_wasm() {
_home="$1"; _url="$2"
[ -n "$_url" ] || return 0
if [ -d "$_home/wasm" ] && [ -n "$(ls -A "$_home/wasm" 2>/dev/null)" ]; then
return 0 # wasm already present
fi
ct_log "wasm: empty, fetching snapshot $_url"
ct_apk lz4 tar
if curl -sL "$_url" | lz4 -dc | tar -xf - -C "$_home"; then
ct_log "wasm: extracted into $_home"
else
ct_log "WARN wasm: fetch/extract failed ($_url)"
fi
return 0
}

95
haqq/scripts/init.sh Normal file → Executable file
View File

@@ -1,64 +1,65 @@
#!/bin/sh #!/bin/sh
# haqq (haqqd) entrypoint — family C, pure CometBFT (no EL). Thin: sources the
# shared cometbft-common.sh and orchestrates init + statesync bootstrap + start.
# Serves CometBFT RPC :26657 (the dshackle/traefik upstream).
# Genesis replay across ~25 Haqq network upgrades is impractical, so we statesync
# near head with the current binary.
set -e
. /usr/local/bin/cometbft-common.sh
set -e # Exit on failure HOME_DIR="/root/.haqqd"
CONFIG_DIR="$HOME_DIR/config"
CHAIN_ID="${CHAINID:-haqq_11235-1}"
CHAINNAME="${CHAINNAME:-mainnet}"
GENESIS_URL="${GENESIS_URL:-https://raw.githubusercontent.com/haqq-network/${CHAINNAME}/master/genesis.json}"
ADDRBOOK_URL="${ADDRBOOK_URL:-https://snapshots.polkachu.com/addrbook/haqq/addrbook.json}"
STATESYNC_RPC="${STATESYNC_RPC:-https://haqq-rpc.polkachu.com:443}"
MIN_GAS="${MIN_GAS:-0.01hqq}"
MONIKER="${MONIKER:-rpc-node}"
echo "MONIKER: $MONIKER" # Polkachu seeds + official Haqq network seeds for reliable peer discovery
SEEDS="${SEEDS:-936e27a05f3cfb090507dd810395cbbd8efbffb0@65.109.115.172:24056,f4675b63b8872fb9216efa99428eb5b1fb297393@65.109.104.118:61256,6c9a6fc0e0d94bf303075e46560832e652cffc14@65.108.71.137:24056,7c153a83@peer.haqq.mainnet.dteam.tech:28656}"
CHAINID=${CHAINID:-haqq_11235-1} # Optional persistent peers for additional bootstrap reliability
CHAINNAME=${CHAINNAME:-mainnet} PERSISTENT_PEERS="${PERSISTENT_PEERS:-17e0fd08f04e062d18412808b8bf134e9ad34508@65.109.109.189:10656,e000b992a0066eae9e87c66e0d65229a76647509@198.96.92.242:32656,7c153a83@peer.haqq.mainnet.dteam.tech:28656,235ac65359582357b04754e838496545b3ba6429@haqq-seed-1.allnodes.me:26656,9573a569016378765444095484840d7f543d2800@haqq-seed-2.allnodes.me:26656}"
API=${API:-eth,net,web3}
CONFIG_DIR="/root/.haqqd/config" ct_apk curl jq
# Create config directory if haqqd init "$MONIKER" --chain-id "$CHAIN_ID" --home "$HOME_DIR" >/dev/null 2>&1; then
mkdir -p "$CONFIG_DIR" ct_log "fresh init; fetching genesis and addrbook"
ct_fetch "$GENESIS_URL" "$CONFIG_DIR/genesis.json" required
P2P_STRING="tcp:\\/\\/0\\.0\\.0\\.0\\:${P2P_PORT:-10465}" ct_set_addrbook "$CONFIG_DIR" "$ADDRBOOK_URL"
NAT_STRING="${IP}:${P2P_PORT:-10465}" ct_localize_home "$CONFIG_DIR"
ct_set_min_gas_prices "$CONFIG_DIR/app.toml" "$MIN_GAS"
env
# this goes first because it won't overwrite shit
apk add curl
if [ $? -ne 0 ]; then exit 1; fi
if haqqd init ${MONIKER} --chain-id ${CHAINID} --home /root/.haqqd/; then
# Define variables
GENESIS_URL="https://raw.githubusercontent.com/haqq-network/${CHAINNAME}/master/genesis.json"
ADDRESSBOOK_URL="https://raw.githubusercontent.com/haqq-network/${CHAINNAME}/master/addrbook.json"
# Download config files
curl -sL "$GENESIS_URL" -o "$CONFIG_DIR/genesis.json"
curl -sL "$ADDRESSBOOK_URL" -o "$CONFIG_DIR/addressbook.json"
# somehow it's better to make home static to /root
sed -i 's|~/|/root/|g' "$CONFIG_DIR/config.toml"
sed -i 's|~/|/root/|g' "$CONFIG_DIR/app.toml"
else else
echo "Already initialized, continuing!" >&2 ct_log "already initialized, continuing"
# Auto-refresh addrbook from Polkachu when empty on startup
if [ ! -s "$CONFIG_DIR/addrbook.json" ]; then
ct_log "addrbook.json is empty, refreshing from Polkachu"
ct_set_addrbook "$CONFIG_DIR" "$ADDRBOOK_URL"
fi
fi fi
# Serve RPC on all interfaces (dshackle/traefik upstream); default is 127.0.0.1.
sed -i '/^\[rpc\]/,/^\[/{s|^laddr = .*|laddr = "tcp://0.0.0.0:8545"|}' "$CONFIG_DIR/config.toml"
# apply a port change to the config ct_patch_p2p "$CONFIG_DIR/config.toml" "$IP" "${P2P_PORT:-10465}"
sed -i "/^\[p2p\]/,/^\[/{s|^laddr = .*|laddr = \"$P2P_STRING\"|}" "$CONFIG_DIR/config.toml" ct_merge_seeds "$CONFIG_DIR/config.toml" "$SEEDS" "$ADDRBOOK_URL"
#sed -i "s/^laddr = \".*\"/laddr = \"$P2P_STRING\"/" "$CONFIG_DIR/config.toml" ct_set_persistent_peers "$CONFIG_DIR/config.toml" "$PERSISTENT_PEERS"
sed -i "/^\[p2p\]/,/^\[/{s|^external_address = .*|external_address = \"$NAT_STRING\"|}" "$CONFIG_DIR/config.toml" ct_set_moniker "$CONFIG_DIR/config.toml" "$MONIKER"
ct_configure_statesync "$CONFIG_DIR/config.toml" "$STATESYNC_RPC"
#sed -i 's/minimum-gas-prices = ""/minimum-gas-prices = "0.01hqq"/g' $CONFIG_DIR/app.toml ct_seed_priv_validator_state "$HOME_DIR"
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $CONFIG_DIR/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $CONFIG_DIR/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" $CONFIG_DIR/app.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $CONFIG_DIR/config.toml
# Haqq-specific config: enable API endpoints
sed -i "/^\[json-rpc\]/,/^\[/{s|^address = .*|address = \"0.0.0.0:8545\"|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^address = .*|address = \"0.0.0.0:8545\"|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^ws-address = .*|ws-address = \"0.0.0.0:8546\"|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^ws-address = .*|ws-address = \"0.0.0.0:8546\"|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^metrics-address = .*|metrics-address = \"0.0.0.0:6065\"|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^metrics-address = .*|metrics-address = \"0.0.0.0:6065\"|}" "$CONFIG_DIR/app.toml"
sed -i "/^\[json-rpc\]/,/^\[/{s|^api = .*|api = \"$API\"|}" "$CONFIG_DIR/app.toml" sed -i "/^\[json-rpc\]/,/^\[/{s|^api = .*|api = \"$API\"|}" "$CONFIG_DIR/app.toml"
# Update moniker if set # Custom pruning settings for RPC node
if [ -n "$MONIKER" ] && [ -f "$CONFIG_DIR/config.toml" ]; then sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" "$CONFIG_DIR/app.toml"
sed -i "s/^moniker = \".*\"/moniker = \"$MONIKER\"/" "$CONFIG_DIR/config.toml" sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" "$CONFIG_DIR/app.toml"
fi sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" "$CONFIG_DIR/app.toml"
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" "$CONFIG_DIR/config.toml"
exec haqqd start --chain-id ${CHAINID} $@ exec haqqd start --chain-id "$CHAIN_ID" --home "$HOME_DIR" $@

View File

@@ -46,8 +46,8 @@ services:
nofile: 1048576 # Max open files (for RPC/WS connections) nofile: 1048576 # Max open files (for RPC/WS connections)
user: root user: root
ports: ports:
- 10127:10127 - 10127:9651
- 10127:10127/udp - 10127:9651/udp
expose: expose:
- 9650 - 9650
environment: environment:
@@ -59,7 +59,7 @@ services:
- AVAGO_NETWORK_ID=mainnet - AVAGO_NETWORK_ID=mainnet
- AVAGO_PARTIAL_SYNC_PRIMARY_NETWORK=true - AVAGO_PARTIAL_SYNC_PRIMARY_NETWORK=true
- AVAGO_PLUGIN_DIR=/plugins/ - AVAGO_PLUGIN_DIR=/plugins/
- AVAGO_STAKING_PORT=10127 - AVAGO_STAKING_PORT=9651
- AVAGO_TRACK_SUBNETS=21uUaTxVdR3Sp6SJhpcSrdH1g66aFoE8mPQDvwKJCjXNexo5y6 - AVAGO_TRACK_SUBNETS=21uUaTxVdR3Sp6SJhpcSrdH1g66aFoE8mPQDvwKJCjXNexo5y6
- KITE_CHAIN_ID=3USaEfTcoUhHxpKXvpAG916UKCUEyjrtkg2hBArBG3JyDP7my - KITE_CHAIN_ID=3USaEfTcoUhHxpKXvpAG916UKCUEyjrtkg2hBArBG3JyDP7my
- PLUGIN_ID=pJhES6xZkqZxjxMqHiucbpBTTnB97EjL5aTYSynmWBoF26v9e - PLUGIN_ID=pJhES6xZkqZxjxMqHiucbpBTTnB97EjL5aTYSynmWBoF26v9e

View File

@@ -54,6 +54,7 @@ services:
- 9545 - 9545
command: command:
- --Xbonsai-full-flat-db-enabled=true - --Xbonsai-full-flat-db-enabled=true
- --bonsai-historical-block-limit=4096
- --bootnodes=enode://069800db9e6e0ec9cadca670994ef1aea2cfd3d88133e63ecadbc1cdbd1a5847b09838ee08d8b5f02a9c32ee13abeb4d4104bb5514e5322c9d7ee19f41ff3e51@3.132.73.210:31002,enode://a8e03a71eab12ec4b47bb6e19169d8e4dc7a58373a2476969bbe463f2dded6003037fa4dd5f71e15027f7fc8d7340956fbbefed67ddd116ac19a7f74da034b61@3.132.73.210:31003,enode://97706526cf79df9d930003644f9156805f6c8bd964fc79e083444f7014ce10c9bdd2c5049e63b58040dca1d4c82ebef970822198cf0714de830cff4111534ff1@18.223.198.165:31004,enode://24e1c654a801975a96b7f54ebd7452ab15777fc635c1db25bdbd4425fdb04e7f4768e9e838a87ab724320a765e41631d5d37758c933ad0e8668693558125c8aa@18.223.198.165:31000,enode://27010891d960f73d272a553f72b6336c6698db3ade98d631f09c764e57674a797be5ebc6829ddbb65ab564f439ebc75215d20aa98b6f351d12ea623e7d139ac3@3.132.73.210:31001,enode://228e1b8a4931e46f383e30721dac21fb8fb4e5e1b32c870e13b25478c82db3dc1cd9e7ceb93d302a766466b55638cc9c5cbfc43aa48fa41ced19baf365951f76@3.1.142.64:31002,enode://c22eb0d40fc3ad5ea710aeddea906567778166bfe18c157955e8c39b23a46c45db18a0fa2ba07f2b64c81178a8c796aec2a29151533920ead06fcdfc6d8d03c6@47.128.192.57:31004,enode://8ce733abe39fd7ae0a278b9893f85c1193c611a3886168690dd843435460f22cc4d61f9e8d0ace7f5905836a665319a31cccdaacdada2acc69972c382ecce7db@3.1.142.64:31003,enode://b7c1b2bed65a855f7a2104aac9a14674dfdf018fdac763415b373b29ce18cdb81d36328ba4e5c9f12629f3a50c3e8f9ee048f22dbdbe93a82813da89c6b81334@51.20.235.126:31004,enode://95270e0550848a72fb141cf27f1c4ea10714edde365b411dc0fa06c81c0f282ce155eb9fa472b6b8bb9ee98395eeaf4c5a7b02a01fe58b37ea98ba152eda4c37@13.50.94.193:31000,enode://72013391755f24f08567b932feeeec4c893c06e0b1fb480890c83bf87fd277ad86a5ab9cb586db9ae9970371a2f8cb0c96f6c9f69045abca0fb801db7f047138@51.20.235.126:31001 - --bootnodes=enode://069800db9e6e0ec9cadca670994ef1aea2cfd3d88133e63ecadbc1cdbd1a5847b09838ee08d8b5f02a9c32ee13abeb4d4104bb5514e5322c9d7ee19f41ff3e51@3.132.73.210:31002,enode://a8e03a71eab12ec4b47bb6e19169d8e4dc7a58373a2476969bbe463f2dded6003037fa4dd5f71e15027f7fc8d7340956fbbefed67ddd116ac19a7f74da034b61@3.132.73.210:31003,enode://97706526cf79df9d930003644f9156805f6c8bd964fc79e083444f7014ce10c9bdd2c5049e63b58040dca1d4c82ebef970822198cf0714de830cff4111534ff1@18.223.198.165:31004,enode://24e1c654a801975a96b7f54ebd7452ab15777fc635c1db25bdbd4425fdb04e7f4768e9e838a87ab724320a765e41631d5d37758c933ad0e8668693558125c8aa@18.223.198.165:31000,enode://27010891d960f73d272a553f72b6336c6698db3ade98d631f09c764e57674a797be5ebc6829ddbb65ab564f439ebc75215d20aa98b6f351d12ea623e7d139ac3@3.132.73.210:31001,enode://228e1b8a4931e46f383e30721dac21fb8fb4e5e1b32c870e13b25478c82db3dc1cd9e7ceb93d302a766466b55638cc9c5cbfc43aa48fa41ced19baf365951f76@3.1.142.64:31002,enode://c22eb0d40fc3ad5ea710aeddea906567778166bfe18c157955e8c39b23a46c45db18a0fa2ba07f2b64c81178a8c796aec2a29151533920ead06fcdfc6d8d03c6@47.128.192.57:31004,enode://8ce733abe39fd7ae0a278b9893f85c1193c611a3886168690dd843435460f22cc4d61f9e8d0ace7f5905836a665319a31cccdaacdada2acc69972c382ecce7db@3.1.142.64:31003,enode://b7c1b2bed65a855f7a2104aac9a14674dfdf018fdac763415b373b29ce18cdb81d36328ba4e5c9f12629f3a50c3e8f9ee048f22dbdbe93a82813da89c6b81334@51.20.235.126:31004,enode://95270e0550848a72fb141cf27f1c4ea10714edde365b411dc0fa06c81c0f282ce155eb9fa472b6b8bb9ee98395eeaf4c5a7b02a01fe58b37ea98ba152eda4c37@13.50.94.193:31000,enode://72013391755f24f08567b932feeeec4c893c06e0b1fb480890c83bf87fd277ad86a5ab9cb586db9ae9970371a2f8cb0c96f6c9f69045abca0fb801db7f047138@51.20.235.126:31001
- --data-path=/opt/besu/database - --data-path=/opt/besu/database
- --data-storage-format=BONSAI - --data-storage-format=BONSAI

View File

@@ -54,6 +54,7 @@ services:
- 9545 - 9545
command: command:
- --Xbonsai-full-flat-db-enabled=true - --Xbonsai-full-flat-db-enabled=true
- --bonsai-historical-block-limit=4096
- --bootnodes=enode://6f20afbe4397e51b717a7c1ad3095e79aee48c835eebd9237a3e8a16951ade1fe0e66e981e30ea269849fcb6ba03d838da37f524fabd2a557474194a2e2604fa@18.221.100.27:31002,enode://ce1e0d8e0500cb5c0ac56bdcdafb2d6320c3a2c5125b5ccf12f5dfc9b47ee74acbcafc32559017613136c9c36a0ce74ba4f83b7fb8244f099f3b15708d9d3129@3.23.75.47:31000,enode://1b026a5eb0ae74300f58987d235ef0e3a550df963345cb3574be3b0b54378bd11f14dfd515a8976f2c2d2826090e9507b8ccc24f896a9ffffffcabcfd996a733@3.129.120.128:31001 - --bootnodes=enode://6f20afbe4397e51b717a7c1ad3095e79aee48c835eebd9237a3e8a16951ade1fe0e66e981e30ea269849fcb6ba03d838da37f524fabd2a557474194a2e2604fa@18.221.100.27:31002,enode://ce1e0d8e0500cb5c0ac56bdcdafb2d6320c3a2c5125b5ccf12f5dfc9b47ee74acbcafc32559017613136c9c36a0ce74ba4f83b7fb8244f099f3b15708d9d3129@3.23.75.47:31000,enode://1b026a5eb0ae74300f58987d235ef0e3a550df963345cb3574be3b0b54378bd11f14dfd515a8976f2c2d2826090e9507b8ccc24f896a9ffffffcabcfd996a733@3.129.120.128:31001
- --data-path=/opt/besu/database - --data-path=/opt/besu/database
- --data-storage-format=BONSAI - --data-storage-format=BONSAI

View File

@@ -0,0 +1,139 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:mova/geth/mova-mainnet-v2-geth-archive-leveldb-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/mova-mainnet-v2-geth-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
mova-mainnet-v2-geth-archive:
image: ${MOVA_GETH_IMAGE:-ethereum/client-go}:${MOVA_MAINNET_V2_GETH_VERSION:-v1.17.4}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 11121:11121
- 11121:11121/udp
expose:
- 8545
- 6060
command:
- --datadir=/root/.ethereum
- --db.engine=leveldb
- --gcmode=archive
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --port=11121
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${MOVA_MAINNET_V2_GETH_ARCHIVE_LEVELDB_HASH_DATA:-mova-mainnet-v2-geth-archive-leveldb-hash}:/root/.ethereum
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.mova-mainnet-v2-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/mova-mainnet-v2-geth-archive
- traefik.http.services.mova-mainnet-v2-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.mova-mainnet-v2-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.mova-mainnet-v2-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.mova-mainnet-v2-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/mova-mainnet-v2-geth-archive`) || Path(`/mova-mainnet-v2-geth-archive/`))}
- ${NO_SSL:+traefik.http.routers.mova-mainnet-v2-geth-archive-leveldb-hash.rule=Path(`/mova-mainnet-v2-geth-archive`) || Path(`/mova-mainnet-v2-geth-archive/`)}
- traefik.http.routers.mova-mainnet-v2-geth-archive-leveldb-hash.middlewares=mova-mainnet-v2-geth-archive-leveldb-hash-stripprefix, ipallowlist
volumes:
mova-mainnet-v2-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: mova-mainnet-v2
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...

View File

@@ -0,0 +1,141 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:mova/geth/mova-mainnet-v2-geth-pruned-pebble-path.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/mova-mainnet-v2-geth \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
mova-mainnet-v2-geth:
image: ${MOVA_GETH_IMAGE:-ethereum/client-go}:${MOVA_MAINNET_V2_GETH_VERSION:-v1.17.4}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 11242:11242
- 11242:11242/udp
expose:
- 8545
- 6060
command:
- --datadir=/root/.ethereum
- --db.engine=pebble
- --gcmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --nat=extip:${IP}
- --port=11242
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=snap
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${MOVA_MAINNET_V2_GETH_PRUNED_PEBBLE_PATH_DATA:-mova-mainnet-v2-geth-pruned-pebble-path}:/root/.ethereum
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.mova-mainnet-v2-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/mova-mainnet-v2-geth
- traefik.http.services.mova-mainnet-v2-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.mova-mainnet-v2-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.mova-mainnet-v2-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.mova-mainnet-v2-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/mova-mainnet-v2-geth`) || Path(`/mova-mainnet-v2-geth/`))}
- ${NO_SSL:+traefik.http.routers.mova-mainnet-v2-geth-pruned-pebble-path.rule=Path(`/mova-mainnet-v2-geth`) || Path(`/mova-mainnet-v2-geth/`)}
- traefik.http.routers.mova-mainnet-v2-geth-pruned-pebble-path.middlewares=mova-mainnet-v2-geth-pruned-pebble-path-stripprefix, ipallowlist
volumes:
mova-mainnet-v2-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: mova-mainnet-v2
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...

View File

@@ -20,17 +20,17 @@ x-logging-defaults: &logging-defaults
# ... # ...
# IP=$(curl ipinfo.io/ip) # IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me # DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/erigon/soneium-miniato-sepolia-op-erigon-archive-trace.yml # COMPOSE_FILE=base.yml:rpc.yml:op/erigon/soneium-minato-sepolia-op-erigon-archive-trace.yml
# #
# docker compose up -d # docker compose up -d
# #
# curl -X POST https://${IP}.traefik.me/soneium-miniato-sepolia-op-erigon \ # curl -X POST https://${IP}.traefik.me/soneium-minato-sepolia-op-erigon \
# -H "Content-Type: application/json" \ # -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' # --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services: services:
soneium-miniato-sepolia-op-erigon: soneium-minato-sepolia-op-erigon:
image: ${SONEIUM_ERIGON_IMAGE:-testinprod/op-erigon}:${SONEIUM_MINIATO_SEPOLIA_ERIGON_VERSION:-v2.61.3-0.10.1} image: ${SONEIUM_ERIGON_IMAGE:-testinprod/op-erigon}:${SONEIUM_MINATO_SEPOLIA_ERIGON_VERSION:-v2.61.3-0.10.1}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -47,29 +47,29 @@ services:
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX) memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root user: root
ports: ports:
- 14735:14735 - 12283:12283
- 14735:14735/udp - 12283:12283/udp
- 34735:34735 - 32283:32283
- 34735:34735/udp - 32283:32283/udp
- 39735:39735 - 37283:37283
- 39735:39735/udp - 37283:37283/udp
expose: expose:
- 8545 - 8545
- 6060 - 6060
- 8551 - 8551
entrypoint: [erigon] entrypoint: [erigon]
command: command:
- --chain=soneium-miniato-sepolia - --chain=soneium-minato-sepolia
- --datadir=/root/.local/share/erigon - --datadir=/root/.local/share/erigon
- --maxpeers=50 - --maxpeers=50
- --metrics - --metrics
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --p2p.allowed-ports=34735 - --p2p.allowed-ports=32283
- --p2p.allowed-ports=39735 - --p2p.allowed-ports=37283
- --port=14735 - --port=12283
- --rollup.sequencerhttp=https://rpc.soneium.org - --rollup.sequencerhttp=https://rpc.minato.soneium.org
- --rpc.gascap=6000000000 - --rpc.gascap=6000000000
- --rpc.returndata.limit=1500000 - --rpc.returndata.limit=1500000
- --http - --http
@@ -87,7 +87,7 @@ services:
networks: networks:
- chains - chains
volumes: volumes:
- ${SONEIUM_MINIATO_SEPOLIA_OP_ERIGON_ARCHIVE_TRACE_DATA:-soneium-miniato-sepolia-op-erigon-archive-trace}:/root/.local/share/erigon - ${SONEIUM_MINATO_SEPOLIA_OP_ERIGON_ARCHIVE_TRACE_DATA:-soneium-minato-sepolia-op-erigon-archive-trace}:/root/.local/share/erigon
- .jwtsecret:/jwtsecret:ro - .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk - /slowdisk:/slowdisk
logging: *logging-defaults logging: *logging-defaults
@@ -96,41 +96,41 @@ services:
- prometheus-scrape.port=6060 - prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus - prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.soneium-miniato-sepolia-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/soneium-miniato-sepolia-op-erigon - traefik.http.middlewares.soneium-minato-sepolia-op-erigon-archive-trace-stripprefix.stripprefix.prefixes=/soneium-minato-sepolia-op-erigon
- traefik.http.services.soneium-miniato-sepolia-op-erigon-archive-trace.loadbalancer.server.port=8545 - traefik.http.services.soneium-minato-sepolia-op-erigon-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-erigon-archive-trace.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-erigon-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-erigon-archive-trace.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-erigon-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/soneium-miniato-sepolia-op-erigon`) || Path(`/soneium-miniato-sepolia-op-erigon/`))} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-erigon-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/soneium-minato-sepolia-op-erigon`) || Path(`/soneium-minato-sepolia-op-erigon/`))}
- ${NO_SSL:+traefik.http.routers.soneium-miniato-sepolia-op-erigon-archive-trace.rule=Path(`/soneium-miniato-sepolia-op-erigon`) || Path(`/soneium-miniato-sepolia-op-erigon/`)} - ${NO_SSL:+traefik.http.routers.soneium-minato-sepolia-op-erigon-archive-trace.rule=Path(`/soneium-minato-sepolia-op-erigon`) || Path(`/soneium-minato-sepolia-op-erigon/`)}
- traefik.http.routers.soneium-miniato-sepolia-op-erigon-archive-trace.middlewares=soneium-miniato-sepolia-op-erigon-archive-trace-stripprefix, ipallowlist - traefik.http.routers.soneium-minato-sepolia-op-erigon-archive-trace.middlewares=soneium-minato-sepolia-op-erigon-archive-trace-stripprefix, ipallowlist
shm_size: 2gb shm_size: 2gb
soneium-miniato-sepolia-op-erigon-node: soneium-minato-sepolia-op-erigon-node:
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINIATO_SEPOLIA_NODE_VERSION:-v1.19.2} image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINATO_SEPOLIA_NODE_VERSION:-v1.19.2}
ports: ports:
- 19735:19735 - 17283:17283
- 19735:19735/udp - 17283:17283/udp
environment: environment:
- OP_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST} - OP_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_SEPOLIA_BEACON_ARCHIVER} - OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_SEPOLIA_BEACON_ARCHIVER}
- OP_NODE_L1_ETH_RPC=${SONEIUM_MINIATO_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}} - OP_NODE_L1_ETH_RPC=${SONEIUM_MINATO_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- OP_NODE_L1_RPC_KIND=${ETHEREUM_SEPOLIA_EXECUTION_KIND:-standard} - OP_NODE_L1_RPC_KIND=${ETHEREUM_SEPOLIA_EXECUTION_KIND:-standard}
- OP_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false} - OP_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- OP_NODE_L2_ENGINE_AUTH=/jwtsecret - OP_NODE_L2_ENGINE_AUTH=/jwtsecret
- OP_NODE_L2_ENGINE_KIND=erigon - OP_NODE_L2_ENGINE_KIND=erigon
- OP_NODE_L2_ENGINE_RPC=http://soneium-miniato-sepolia-op-erigon:8551 - OP_NODE_L2_ENGINE_RPC=http://soneium-minato-sepolia-op-erigon:8551
- OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s - OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s
- OP_NODE_L2_SKIP_SYNC_START_CHECK=true - OP_NODE_L2_SKIP_SYNC_START_CHECK=true
- OP_NODE_LOG_LEVEL=info - OP_NODE_LOG_LEVEL=info
- OP_NODE_METRICS_ADDR=0.0.0.0 - OP_NODE_METRICS_ADDR=0.0.0.0
- OP_NODE_METRICS_ENABLED=true - OP_NODE_METRICS_ENABLED=true
- OP_NODE_METRICS_PORT=7300 - OP_NODE_METRICS_PORT=7300
- OP_NODE_NETWORK=soneium-miniato-sepolia - OP_NODE_NETWORK=soneium-minato-sepolia
- OP_NODE_OVERRIDE_PECTRABLOBSCHEDULE=1742486400 - OP_NODE_OVERRIDE_PECTRABLOBSCHEDULE=1742486400
- OP_NODE_P2P_ADVERTISE_IP=${IP} - OP_NODE_P2P_ADVERTISE_IP=${IP}
- OP_NODE_P2P_LISTEN_IP=0.0.0.0 - OP_NODE_P2P_LISTEN_IP=0.0.0.0
- OP_NODE_P2P_LISTEN_TCP_PORT=19735 - OP_NODE_P2P_LISTEN_TCP_PORT=17283
- OP_NODE_P2P_LISTEN_UDP_PORT=19735 - OP_NODE_P2P_LISTEN_UDP_PORT=17283
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true - OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
- OP_NODE_RPC_ADDR=0.0.0.0 - OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545 - OP_NODE_RPC_PORT=9545
@@ -140,7 +140,7 @@ services:
entrypoint: [op-node] entrypoint: [op-node]
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
soneium-miniato-sepolia-op-erigon: soneium-minato-sepolia-op-erigon:
condition: service_started condition: service_started
restart: true restart: true
networks: networks:
@@ -153,16 +153,16 @@ services:
- prometheus-scrape.port=7300 - prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics - prometheus-scrape.path=/metrics
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.soneium-miniato-sepolia-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/soneium-miniato-sepolia-op-erigon/node - traefik.http.middlewares.soneium-minato-sepolia-op-erigon-archive-trace-node-stripprefix.stripprefix.prefixes=/soneium-minato-sepolia-op-erigon/node
- traefik.http.services.soneium-miniato-sepolia-op-erigon-archive-trace-node.loadbalancer.server.port=9545 - traefik.http.services.soneium-minato-sepolia-op-erigon-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-erigon-archive-trace-node.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-erigon-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-erigon-archive-trace-node.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-erigon-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/soneium-miniato-sepolia-op-erigon/node`)} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-erigon-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/soneium-minato-sepolia-op-erigon/node`)}
- ${NO_SSL:+traefik.http.routers.soneium-miniato-sepolia-op-erigon-archive-trace-node.rule=PathPrefix(`/soneium-miniato-sepolia-op-erigon/node`)} - ${NO_SSL:+traefik.http.routers.soneium-minato-sepolia-op-erigon-archive-trace-node.rule=PathPrefix(`/soneium-minato-sepolia-op-erigon/node`)}
- traefik.http.routers.soneium-miniato-sepolia-op-erigon-archive-trace-node.middlewares=soneium-miniato-sepolia-op-erigon-archive-trace-node-stripprefix, ipallowlist - traefik.http.routers.soneium-minato-sepolia-op-erigon-archive-trace-node.middlewares=soneium-minato-sepolia-op-erigon-archive-trace-node-stripprefix, ipallowlist
volumes: volumes:
soneium-miniato-sepolia-op-erigon-archive-trace: soneium-minato-sepolia-op-erigon-archive-trace:
x-upstreams: x-upstreams:
- id: $${ID} - id: $${ID}
@@ -176,7 +176,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: soneium chain: soneium-minato
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -267,7 +267,7 @@ services:
- EIGENDA_PROXY_S3_CREDENTIAL_TYPE=public - EIGENDA_PROXY_S3_CREDENTIAL_TYPE=public
- EIGENDA_PROXY_S3_ENDPOINT=storage.googleapis.com - EIGENDA_PROXY_S3_ENDPOINT=storage.googleapis.com
- EIGENDA_PROXY_S3_PATH=blobs/ - EIGENDA_PROXY_S3_PATH=blobs/
- EIGENDA_PROXY_STORAGE_BACKENDS_TO_ENABLE=V1,V2 - EIGENDA_PROXY_STORAGE_BACKENDS_TO_ENABLE=V2
- EIGENDA_PROXY_STORAGE_FALLBACK_TARGETS=s3 - EIGENDA_PROXY_STORAGE_FALLBACK_TARGETS=s3
restart: unless-stopped restart: unless-stopped
networks: networks:

View File

@@ -266,7 +266,7 @@ services:
- EIGENDA_PROXY_S3_CREDENTIAL_TYPE=public - EIGENDA_PROXY_S3_CREDENTIAL_TYPE=public
- EIGENDA_PROXY_S3_ENDPOINT=storage.googleapis.com - EIGENDA_PROXY_S3_ENDPOINT=storage.googleapis.com
- EIGENDA_PROXY_S3_PATH=blobs/ - EIGENDA_PROXY_S3_PATH=blobs/
- EIGENDA_PROXY_STORAGE_BACKENDS_TO_ENABLE=V1,V2 - EIGENDA_PROXY_STORAGE_BACKENDS_TO_ENABLE=V2
- EIGENDA_PROXY_STORAGE_FALLBACK_TARGETS=s3 - EIGENDA_PROXY_STORAGE_FALLBACK_TARGETS=s3
restart: unless-stopped restart: unless-stopped
networks: networks:

View File

@@ -264,7 +264,7 @@ services:
- EIGENDA_PROXY_S3_CREDENTIAL_TYPE=public - EIGENDA_PROXY_S3_CREDENTIAL_TYPE=public
- EIGENDA_PROXY_S3_ENDPOINT=storage.googleapis.com - EIGENDA_PROXY_S3_ENDPOINT=storage.googleapis.com
- EIGENDA_PROXY_S3_PATH=blobs/ - EIGENDA_PROXY_S3_PATH=blobs/
- EIGENDA_PROXY_STORAGE_BACKENDS_TO_ENABLE=V1,V2 - EIGENDA_PROXY_STORAGE_BACKENDS_TO_ENABLE=V2
- EIGENDA_PROXY_STORAGE_FALLBACK_TARGETS=s3 - EIGENDA_PROXY_STORAGE_FALLBACK_TARGETS=s3
restart: unless-stopped restart: unless-stopped
networks: networks:

View File

@@ -264,7 +264,7 @@ services:
- EIGENDA_PROXY_S3_CREDENTIAL_TYPE=public - EIGENDA_PROXY_S3_CREDENTIAL_TYPE=public
- EIGENDA_PROXY_S3_ENDPOINT=storage.googleapis.com - EIGENDA_PROXY_S3_ENDPOINT=storage.googleapis.com
- EIGENDA_PROXY_S3_PATH=blobs/ - EIGENDA_PROXY_S3_PATH=blobs/
- EIGENDA_PROXY_STORAGE_BACKENDS_TO_ENABLE=V1,V2 - EIGENDA_PROXY_STORAGE_BACKENDS_TO_ENABLE=V2
- EIGENDA_PROXY_STORAGE_FALLBACK_TARGETS=s3 - EIGENDA_PROXY_STORAGE_FALLBACK_TARGETS=s3
restart: unless-stopped restart: unless-stopped
networks: networks:

View File

@@ -45,9 +45,6 @@ services:
ulimits: ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections) nofile: 1048576 # Max open files (for RPC/WS connections)
user: root user: root
ports:
- 13290:13290
- 13290:13290/udp
expose: expose:
- 8545 - 8545
- 6060 - 6060
@@ -64,7 +61,6 @@ services:
- GETH_ROLLUP_SEQUENCERHTTP=https://rpc.mainnet.frax.com - GETH_ROLLUP_SEQUENCERHTTP=https://rpc.mainnet.frax.com
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=leveldb --gcmode=archive --datadir /data init --state.scheme=hash /config/genesis.json; [ -f /config/static-nodes.json ] && cp -f /config/static-nodes.json /data/static-nodes.json; exec geth "$@"' -- entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=leveldb --gcmode=archive --datadir /data init --state.scheme=hash /config/genesis.json; [ -f /config/static-nodes.json ] && cp -f /config/static-nodes.json /data/static-nodes.json; exec geth "$@"' --
command: command:
- --bootnodes=enr:-J24QI8QR7VIgvQFuvLl09b9ocugoQ1WkS_AOMWKFgNX48-4P1hjgDKGeMFXZmKtfjYA2aEehxKT066riaktnxhh92OGAY5Sw_QsgmlkgnY0gmlwhCztZu2Hb3BzdGFja4P8AQCJc2VjcDI1NmsxoQM2KM0mkdH97Ze8AqwxLeqc934PKj8-xoKsyP6mAptWwIN0Y3CCdl2DdWRwgnZd,enr:-J24QGD1J-g2EPY9b7XiuwLhIoGocVp2qx2gWSfDI_CdftiPSHlgi7G6LtzkQlDskuSvRj4OXTg3vXLISubphXNNhqyGAY5Sw8GxgmlkgnY0gmlwhCzW_iGHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQPvMYlJHJUsEyciuJCTkKHLE2ogZ6cs2xuPI28CGq0CTIN0Y3CCdl2DdWRwgnZd,enr:-J24QCA5I3xroUXt7Ge_Kf04VCRBnI-GbZeyBxOkkpIDGGLrVsonrbngQG1hAEnufRb1TgS6sNFCGtaZ2ZpRx7AgciGGAY5SxEy0gmlkgnY0gmlwhCLzRQyHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQOaHzrtPQWYcwAcFJWFrbGlbNUsBC0VEhCcH02RbgEIwIN0Y3CCdl2DdWRwgnZd
- --datadir=/data - --datadir=/data
- --db.engine=leveldb - --db.engine=leveldb
- --gcmode=archive - --gcmode=archive
@@ -72,9 +68,8 @@ services:
- --metrics - --metrics
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP}
- --networkid=252 - --networkid=252
- --port=13290 - --nodiscover
- --rpc.gascap=600000000 - --rpc.gascap=600000000
- --rpc.txfeecap=0 - --rpc.txfeecap=0
- --state.scheme=hash - --state.scheme=hash
@@ -145,7 +140,7 @@ services:
- OP_NODE_RPC_ADDR=0.0.0.0 - OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545 - OP_NODE_RPC_PORT=9545
- OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log - OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log
- OP_NODE_SYNCMODE=execution-layer - OP_NODE_SYNCMODE=consensus-layer
- OP_NODE_VERIFIER_L1_CONFS=0 - OP_NODE_VERIFIER_L1_CONFS=0
entrypoint: [op-node] entrypoint: [op-node]
restart: unless-stopped restart: unless-stopped

View File

@@ -45,9 +45,6 @@ services:
ulimits: ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections) nofile: 1048576 # Max open files (for RPC/WS connections)
user: root user: root
ports:
- 10282:10282
- 10282:10282/udp
expose: expose:
- 8545 - 8545
- 6060 - 6060
@@ -64,7 +61,6 @@ services:
- GETH_ROLLUP_SEQUENCERHTTP=https://rpc.mainnet.frax.com - GETH_ROLLUP_SEQUENCERHTTP=https://rpc.mainnet.frax.com
entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=full --datadir /data init --state.scheme=path /config/genesis.json; [ -f /config/static-nodes.json ] && cp -f /config/static-nodes.json /data/static-nodes.json; exec geth "$@"' -- entrypoint: /bin/sh -c '[ -f /config/genesis.json ] && geth --db.engine=pebble --gcmode=full --datadir /data init --state.scheme=path /config/genesis.json; [ -f /config/static-nodes.json ] && cp -f /config/static-nodes.json /data/static-nodes.json; exec geth "$@"' --
command: command:
- --bootnodes=enr:-J24QI8QR7VIgvQFuvLl09b9ocugoQ1WkS_AOMWKFgNX48-4P1hjgDKGeMFXZmKtfjYA2aEehxKT066riaktnxhh92OGAY5Sw_QsgmlkgnY0gmlwhCztZu2Hb3BzdGFja4P8AQCJc2VjcDI1NmsxoQM2KM0mkdH97Ze8AqwxLeqc934PKj8-xoKsyP6mAptWwIN0Y3CCdl2DdWRwgnZd,enr:-J24QGD1J-g2EPY9b7XiuwLhIoGocVp2qx2gWSfDI_CdftiPSHlgi7G6LtzkQlDskuSvRj4OXTg3vXLISubphXNNhqyGAY5Sw8GxgmlkgnY0gmlwhCzW_iGHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQPvMYlJHJUsEyciuJCTkKHLE2ogZ6cs2xuPI28CGq0CTIN0Y3CCdl2DdWRwgnZd,enr:-J24QCA5I3xroUXt7Ge_Kf04VCRBnI-GbZeyBxOkkpIDGGLrVsonrbngQG1hAEnufRb1TgS6sNFCGtaZ2ZpRx7AgciGGAY5SxEy0gmlkgnY0gmlwhCLzRQyHb3BzdGFja4P8AQCJc2VjcDI1NmsxoQOaHzrtPQWYcwAcFJWFrbGlbNUsBC0VEhCcH02RbgEIwIN0Y3CCdl2DdWRwgnZd
- --datadir=/data - --datadir=/data
- --db.engine=pebble - --db.engine=pebble
- --gcmode=full - --gcmode=full
@@ -72,13 +68,12 @@ services:
- --metrics - --metrics
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP}
- --networkid=252 - --networkid=252
- --port=10282 - --nodiscover
- --rpc.gascap=600000000 - --rpc.gascap=600000000
- --rpc.txfeecap=0 - --rpc.txfeecap=0
- --state.scheme=path - --state.scheme=path
- --syncmode=snap - --syncmode=full
- --http - --http
- --http.addr=0.0.0.0 - --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine - --http.api=eth,net,web3,debug,admin,txpool,engine
@@ -145,7 +140,7 @@ services:
- OP_NODE_RPC_ADDR=0.0.0.0 - OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545 - OP_NODE_RPC_PORT=9545
- OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log - OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log
- OP_NODE_SYNCMODE=execution-layer - OP_NODE_SYNCMODE=consensus-layer
- OP_NODE_VERIFIER_L1_CONFS=0 - OP_NODE_VERIFIER_L1_CONFS=0
entrypoint: [op-node] entrypoint: [op-node]
restart: unless-stopped restart: unless-stopped

View File

@@ -20,17 +20,17 @@ x-logging-defaults: &logging-defaults
# ... # ...
# IP=$(curl ipinfo.io/ip) # IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me # DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/soneium-miniato-sepolia-op-geth-archive-leveldb-hash.yml # COMPOSE_FILE=base.yml:rpc.yml:op/geth/soneium-minato-sepolia-op-geth-archive-leveldb-hash.yml
# #
# docker compose up -d # docker compose up -d
# #
# curl -X POST https://${IP}.traefik.me/soneium-miniato-sepolia-archive \ # curl -X POST https://${IP}.traefik.me/soneium-minato-sepolia-archive \
# -H "Content-Type: application/json" \ # -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' # --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services: services:
soneium-miniato-sepolia-archive: soneium-minato-sepolia-archive:
image: ${SONEIUM_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${SONEIUM_MINIATO_SEPOLIA_GETH_VERSION:-v1.101702.2} image: ${SONEIUM_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${SONEIUM_MINATO_SEPOLIA_GETH_VERSION:-v1.101702.2}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -46,16 +46,16 @@ services:
nofile: 1048576 # Max open files (for RPC/WS connections) nofile: 1048576 # Max open files (for RPC/WS connections)
user: root user: root
ports: ports:
- 13664:13664 - 11279:11279
- 13664:13664/udp - 11279:11279/udp
expose: expose:
- 8545 - 8545
- 6060 - 6060
- 8551 - 8551
environment: environment:
- GETH_OP_NETWORK=soneium-miniato-sepolia - GETH_OP_NETWORK=soneium-minato-sepolia
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true - GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://rpc.soneium.org - GETH_ROLLUP_SEQUENCERHTTP=https://rpc.minato.soneium.org
entrypoint: /bin/sh -c 'exec geth "$@"' -- entrypoint: /bin/sh -c 'exec geth "$@"' --
command: command:
- --datadir=/data - --datadir=/data
@@ -66,7 +66,7 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --port=13664 - --port=11279
- --rpc.gascap=600000000 - --rpc.gascap=600000000
- --rpc.txfeecap=0 - --rpc.txfeecap=0
- --state.scheme=hash - --state.scheme=hash
@@ -89,7 +89,7 @@ services:
networks: networks:
- chains - chains
volumes: volumes:
- ${SONEIUM_MINIATO_SEPOLIA_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-soneium-miniato-sepolia-op-geth-archive-leveldb-hash}:/data - ${SONEIUM_MINATO_SEPOLIA_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-soneium-minato-sepolia-op-geth-archive-leveldb-hash}:/data
- .jwtsecret:/jwtsecret:ro - .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk - /slowdisk:/slowdisk
logging: *logging-defaults logging: *logging-defaults
@@ -98,39 +98,39 @@ services:
- prometheus-scrape.port=6060 - prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus - prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.soneium-miniato-sepolia-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/soneium-miniato-sepolia-archive - traefik.http.middlewares.soneium-minato-sepolia-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/soneium-minato-sepolia-archive
- traefik.http.services.soneium-miniato-sepolia-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545 - traefik.http.services.soneium-minato-sepolia-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-archive-leveldb-hash.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-archive-leveldb-hash.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/soneium-miniato-sepolia-archive`) || Path(`/soneium-miniato-sepolia-archive/`))} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/soneium-minato-sepolia-archive`) || Path(`/soneium-minato-sepolia-archive/`))}
- ${NO_SSL:+traefik.http.routers.soneium-miniato-sepolia-op-geth-archive-leveldb-hash.rule=Path(`/soneium-miniato-sepolia-archive`) || Path(`/soneium-miniato-sepolia-archive/`)} - ${NO_SSL:+traefik.http.routers.soneium-minato-sepolia-op-geth-archive-leveldb-hash.rule=Path(`/soneium-minato-sepolia-archive`) || Path(`/soneium-minato-sepolia-archive/`)}
- traefik.http.routers.soneium-miniato-sepolia-op-geth-archive-leveldb-hash.middlewares=soneium-miniato-sepolia-op-geth-archive-leveldb-hash-stripprefix, ipallowlist - traefik.http.routers.soneium-minato-sepolia-op-geth-archive-leveldb-hash.middlewares=soneium-minato-sepolia-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
soneium-miniato-sepolia-archive-node: soneium-minato-sepolia-archive-node:
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINIATO_SEPOLIA_NODE_VERSION:-v1.19.2} image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINATO_SEPOLIA_NODE_VERSION:-v1.19.2}
ports: ports:
- 18664:18664 - 16279:16279
- 18664:18664/udp - 16279:16279/udp
environment: environment:
- OP_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST} - OP_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_SEPOLIA_BEACON_ARCHIVER} - OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_SEPOLIA_BEACON_ARCHIVER}
- OP_NODE_L1_ETH_RPC=${SONEIUM_MINIATO_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}} - OP_NODE_L1_ETH_RPC=${SONEIUM_MINATO_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- OP_NODE_L1_RPC_KIND=${ETHEREUM_SEPOLIA_EXECUTION_KIND:-standard} - OP_NODE_L1_RPC_KIND=${ETHEREUM_SEPOLIA_EXECUTION_KIND:-standard}
- OP_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false} - OP_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- OP_NODE_L2_ENGINE_AUTH=/jwtsecret - OP_NODE_L2_ENGINE_AUTH=/jwtsecret
- OP_NODE_L2_ENGINE_RPC=http://soneium-miniato-sepolia-archive:8551 - OP_NODE_L2_ENGINE_RPC=http://soneium-minato-sepolia-archive:8551
- OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s - OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s
- OP_NODE_L2_SKIP_SYNC_START_CHECK=true - OP_NODE_L2_SKIP_SYNC_START_CHECK=true
- OP_NODE_LOG_LEVEL=info - OP_NODE_LOG_LEVEL=info
- OP_NODE_METRICS_ADDR=0.0.0.0 - OP_NODE_METRICS_ADDR=0.0.0.0
- OP_NODE_METRICS_ENABLED=true - OP_NODE_METRICS_ENABLED=true
- OP_NODE_METRICS_PORT=7300 - OP_NODE_METRICS_PORT=7300
- OP_NODE_NETWORK=soneium-miniato-sepolia - OP_NODE_NETWORK=soneium-minato-sepolia
- OP_NODE_OVERRIDE_PECTRABLOBSCHEDULE=1742486400 - OP_NODE_OVERRIDE_PECTRABLOBSCHEDULE=1742486400
- OP_NODE_P2P_ADVERTISE_IP=${IP} - OP_NODE_P2P_ADVERTISE_IP=${IP}
- OP_NODE_P2P_LISTEN_IP=0.0.0.0 - OP_NODE_P2P_LISTEN_IP=0.0.0.0
- OP_NODE_P2P_LISTEN_TCP_PORT=18664 - OP_NODE_P2P_LISTEN_TCP_PORT=16279
- OP_NODE_P2P_LISTEN_UDP_PORT=18664 - OP_NODE_P2P_LISTEN_UDP_PORT=16279
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true - OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
- OP_NODE_RPC_ADDR=0.0.0.0 - OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545 - OP_NODE_RPC_PORT=9545
@@ -140,7 +140,7 @@ services:
entrypoint: [op-node] entrypoint: [op-node]
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
soneium-miniato-sepolia-archive: soneium-minato-sepolia-archive:
condition: service_started condition: service_started
restart: true restart: true
networks: networks:
@@ -153,16 +153,16 @@ services:
- prometheus-scrape.port=7300 - prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics - prometheus-scrape.path=/metrics
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.soneium-miniato-sepolia-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/soneium-miniato-sepolia-archive/node - traefik.http.middlewares.soneium-minato-sepolia-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/soneium-minato-sepolia-archive/node
- traefik.http.services.soneium-miniato-sepolia-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545 - traefik.http.services.soneium-minato-sepolia-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-archive-leveldb-hash-node.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/soneium-miniato-sepolia-archive/node`)} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/soneium-minato-sepolia-archive/node`)}
- ${NO_SSL:+traefik.http.routers.soneium-miniato-sepolia-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/soneium-miniato-sepolia-archive/node`)} - ${NO_SSL:+traefik.http.routers.soneium-minato-sepolia-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/soneium-minato-sepolia-archive/node`)}
- traefik.http.routers.soneium-miniato-sepolia-op-geth-archive-leveldb-hash-node.middlewares=soneium-miniato-sepolia-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist - traefik.http.routers.soneium-minato-sepolia-op-geth-archive-leveldb-hash-node.middlewares=soneium-minato-sepolia-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes: volumes:
soneium-miniato-sepolia-op-geth-archive-leveldb-hash: soneium-minato-sepolia-op-geth-archive-leveldb-hash:
x-upstreams: x-upstreams:
- id: $${ID} - id: $${ID}
@@ -176,7 +176,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: soneium chain: soneium-minato
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -20,17 +20,17 @@ x-logging-defaults: &logging-defaults
# ... # ...
# IP=$(curl ipinfo.io/ip) # IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me # DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/soneium-miniato-sepolia-op-geth-pruned-pebble-path.yml # COMPOSE_FILE=base.yml:rpc.yml:op/geth/soneium-minato-sepolia-op-geth-pruned-pebble-path.yml
# #
# docker compose up -d # docker compose up -d
# #
# curl -X POST https://${IP}.traefik.me/soneium-miniato-sepolia \ # curl -X POST https://${IP}.traefik.me/soneium-minato-sepolia \
# -H "Content-Type: application/json" \ # -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' # --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services: services:
soneium-miniato-sepolia: soneium-minato-sepolia:
image: ${SONEIUM_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${SONEIUM_MINIATO_SEPOLIA_GETH_VERSION:-v1.101702.2} image: ${SONEIUM_GETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth}:${SONEIUM_MINATO_SEPOLIA_GETH_VERSION:-v1.101702.2}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -46,16 +46,16 @@ services:
nofile: 1048576 # Max open files (for RPC/WS connections) nofile: 1048576 # Max open files (for RPC/WS connections)
user: root user: root
ports: ports:
- 14827:14827 - 12166:12166
- 14827:14827/udp - 12166:12166/udp
expose: expose:
- 8545 - 8545
- 6060 - 6060
- 8551 - 8551
environment: environment:
- GETH_OP_NETWORK=soneium-miniato-sepolia - GETH_OP_NETWORK=soneium-minato-sepolia
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true - GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://rpc.soneium.org - GETH_ROLLUP_SEQUENCERHTTP=https://rpc.minato.soneium.org
entrypoint: /bin/sh -c 'exec geth "$@"' -- entrypoint: /bin/sh -c 'exec geth "$@"' --
command: command:
- --datadir=/data - --datadir=/data
@@ -66,7 +66,7 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --port=14827 - --port=12166
- --rpc.gascap=600000000 - --rpc.gascap=600000000
- --rpc.txfeecap=0 - --rpc.txfeecap=0
- --state.scheme=path - --state.scheme=path
@@ -89,7 +89,7 @@ services:
networks: networks:
- chains - chains
volumes: volumes:
- ${SONEIUM_MINIATO_SEPOLIA_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-soneium-miniato-sepolia-op-geth-pruned-pebble-path}:/data - ${SONEIUM_MINATO_SEPOLIA_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-soneium-minato-sepolia-op-geth-pruned-pebble-path}:/data
- .jwtsecret:/jwtsecret:ro - .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk - /slowdisk:/slowdisk
logging: *logging-defaults logging: *logging-defaults
@@ -98,39 +98,39 @@ services:
- prometheus-scrape.port=6060 - prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus - prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.soneium-miniato-sepolia-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/soneium-miniato-sepolia - traefik.http.middlewares.soneium-minato-sepolia-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/soneium-minato-sepolia
- traefik.http.services.soneium-miniato-sepolia-op-geth-pruned-pebble-path.loadbalancer.server.port=8545 - traefik.http.services.soneium-minato-sepolia-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-pruned-pebble-path.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-pruned-pebble-path.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/soneium-miniato-sepolia`) || Path(`/soneium-miniato-sepolia/`))} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/soneium-minato-sepolia`) || Path(`/soneium-minato-sepolia/`))}
- ${NO_SSL:+traefik.http.routers.soneium-miniato-sepolia-op-geth-pruned-pebble-path.rule=Path(`/soneium-miniato-sepolia`) || Path(`/soneium-miniato-sepolia/`)} - ${NO_SSL:+traefik.http.routers.soneium-minato-sepolia-op-geth-pruned-pebble-path.rule=Path(`/soneium-minato-sepolia`) || Path(`/soneium-minato-sepolia/`)}
- traefik.http.routers.soneium-miniato-sepolia-op-geth-pruned-pebble-path.middlewares=soneium-miniato-sepolia-op-geth-pruned-pebble-path-stripprefix, ipallowlist - traefik.http.routers.soneium-minato-sepolia-op-geth-pruned-pebble-path.middlewares=soneium-minato-sepolia-op-geth-pruned-pebble-path-stripprefix, ipallowlist
soneium-miniato-sepolia-node: soneium-minato-sepolia-node:
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINIATO_SEPOLIA_NODE_VERSION:-v1.19.2} image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINATO_SEPOLIA_NODE_VERSION:-v1.19.2}
ports: ports:
- 19827:19827 - 17166:17166
- 19827:19827/udp - 17166:17166/udp
environment: environment:
- OP_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST} - OP_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_SEPOLIA_BEACON_ARCHIVER} - OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_SEPOLIA_BEACON_ARCHIVER}
- OP_NODE_L1_ETH_RPC=${SONEIUM_MINIATO_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}} - OP_NODE_L1_ETH_RPC=${SONEIUM_MINATO_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- OP_NODE_L1_RPC_KIND=${ETHEREUM_SEPOLIA_EXECUTION_KIND:-standard} - OP_NODE_L1_RPC_KIND=${ETHEREUM_SEPOLIA_EXECUTION_KIND:-standard}
- OP_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false} - OP_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- OP_NODE_L2_ENGINE_AUTH=/jwtsecret - OP_NODE_L2_ENGINE_AUTH=/jwtsecret
- OP_NODE_L2_ENGINE_RPC=http://soneium-miniato-sepolia:8551 - OP_NODE_L2_ENGINE_RPC=http://soneium-minato-sepolia:8551
- OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s - OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s
- OP_NODE_L2_SKIP_SYNC_START_CHECK=true - OP_NODE_L2_SKIP_SYNC_START_CHECK=true
- OP_NODE_LOG_LEVEL=info - OP_NODE_LOG_LEVEL=info
- OP_NODE_METRICS_ADDR=0.0.0.0 - OP_NODE_METRICS_ADDR=0.0.0.0
- OP_NODE_METRICS_ENABLED=true - OP_NODE_METRICS_ENABLED=true
- OP_NODE_METRICS_PORT=7300 - OP_NODE_METRICS_PORT=7300
- OP_NODE_NETWORK=soneium-miniato-sepolia - OP_NODE_NETWORK=soneium-minato-sepolia
- OP_NODE_OVERRIDE_PECTRABLOBSCHEDULE=1742486400 - OP_NODE_OVERRIDE_PECTRABLOBSCHEDULE=1742486400
- OP_NODE_P2P_ADVERTISE_IP=${IP} - OP_NODE_P2P_ADVERTISE_IP=${IP}
- OP_NODE_P2P_LISTEN_IP=0.0.0.0 - OP_NODE_P2P_LISTEN_IP=0.0.0.0
- OP_NODE_P2P_LISTEN_TCP_PORT=19827 - OP_NODE_P2P_LISTEN_TCP_PORT=17166
- OP_NODE_P2P_LISTEN_UDP_PORT=19827 - OP_NODE_P2P_LISTEN_UDP_PORT=17166
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true - OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
- OP_NODE_RPC_ADDR=0.0.0.0 - OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545 - OP_NODE_RPC_PORT=9545
@@ -140,7 +140,7 @@ services:
entrypoint: [op-node] entrypoint: [op-node]
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
soneium-miniato-sepolia: soneium-minato-sepolia:
condition: service_started condition: service_started
restart: true restart: true
networks: networks:
@@ -153,16 +153,16 @@ services:
- prometheus-scrape.port=7300 - prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics - prometheus-scrape.path=/metrics
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.soneium-miniato-sepolia-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/soneium-miniato-sepolia/node - traefik.http.middlewares.soneium-minato-sepolia-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/soneium-minato-sepolia/node
- traefik.http.services.soneium-miniato-sepolia-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545 - traefik.http.services.soneium-minato-sepolia-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-pruned-pebble-path-node.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/soneium-miniato-sepolia/node`)} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/soneium-minato-sepolia/node`)}
- ${NO_SSL:+traefik.http.routers.soneium-miniato-sepolia-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/soneium-miniato-sepolia/node`)} - ${NO_SSL:+traefik.http.routers.soneium-minato-sepolia-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/soneium-minato-sepolia/node`)}
- traefik.http.routers.soneium-miniato-sepolia-op-geth-pruned-pebble-path-node.middlewares=soneium-miniato-sepolia-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist - traefik.http.routers.soneium-minato-sepolia-op-geth-pruned-pebble-path-node.middlewares=soneium-minato-sepolia-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes: volumes:
soneium-miniato-sepolia-op-geth-pruned-pebble-path: soneium-minato-sepolia-op-geth-pruned-pebble-path:
x-upstreams: x-upstreams:
- id: $${ID} - id: $${ID}
@@ -176,7 +176,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: soneium chain: soneium-minato
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -1,214 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/zircuit-mainnet-op-geth-archive-leveldb-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/zircuit-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
zircuit-mainnet-archive:
image: ${ZIRCUIT_GETH_IMAGE:-zircuit1/l2-geth}:${ZIRCUIT_MAINNET_GETH_VERSION:-v1.138.8}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_CONFIG=/config/gethconfig.toml
- GETH_ETHSTATS=d${DOMAIN}:${ZIRCUIT_MAINNET_WS_SECRET}@${ZIRCUIT_MAINNET_ETH_STATS_SERVER}:${ZIRCUIT_MAINNET_ETH_STATS_SERVER_PORT}
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://proxyd-ingress-eu.mainnet.zircuit.com/?token=drpcvATEn3gsYCLyLw7ztFLCBwQNoDJr2QjpcsNNkksu
- GETH_TXPOOL_GLOBALQUEUE=1024
- ZIRCUIT_NETWORK=mainnet
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=leveldb
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --network=mainnet
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ZIRCUIT_MAINNET_OP_GETH_ARCHIVE_LEVELDB_HASH_DATA:-zircuit-mainnet-op-geth-archive-leveldb-hash}:/data
- ./op/zircuit/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.zircuit-mainnet-op-geth-archive-leveldb-hash-stripprefix.stripprefix.prefixes=/zircuit-mainnet-archive
- traefik.http.services.zircuit-mainnet-op-geth-archive-leveldb-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-leveldb-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-leveldb-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-leveldb-hash.rule=Host(`$DOMAIN`) && (Path(`/zircuit-mainnet-archive`) || Path(`/zircuit-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.zircuit-mainnet-op-geth-archive-leveldb-hash.rule=Path(`/zircuit-mainnet-archive`) || Path(`/zircuit-mainnet-archive/`)}
- traefik.http.routers.zircuit-mainnet-op-geth-archive-leveldb-hash.middlewares=zircuit-mainnet-op-geth-archive-leveldb-hash-stripprefix, ipallowlist
zircuit-mainnet-archive-node:
image: ${ZIRCUIT_NODE_IMAGE:-zircuit1/op-node}:${MAINNET_NODE_VERSION:-v1.138.8}
user: root
ports:
- 19463:19463
- 19463:19463/udp
environment:
- OP_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_MAINNET_BEACON_ARCHIVER}
- OP_NODE_L1_ETH_RPC=${MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- OP_NODE_L1_RPC_KIND=${ETHEREUM_MAINNET_EXECUTION_KIND:-standard}
- OP_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- OP_NODE_L2_ENGINE_AUTH=/jwtsecret
- OP_NODE_L2_ENGINE_RPC=http://zircuit-mainnet-archive:8551
- OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s
- OP_NODE_L2_SKIP_SYNC_START_CHECK=true
- OP_NODE_LOG_LEVEL=info
- OP_NODE_METRICS_ADDR=0.0.0.0
- OP_NODE_METRICS_ENABLED=true
- OP_NODE_METRICS_PORT=7300
- OP_NODE_NETWORK=mainnet
- OP_NODE_P2P_ADVERTISE_IP=${IP}
- OP_NODE_P2P_LISTEN_IP=0.0.0.0
- OP_NODE_P2P_LISTEN_TCP_PORT=19463
- OP_NODE_P2P_LISTEN_UDP_PORT=19463
- OP_NODE_P2P_STATIC=/dns4/node1-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAm5Uxn3E8RXEM2e5YsR9VNM8uKoPmZzwQjqp7r64ZLspd5,/dns4/node2-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAmPoLg64PL2X2oLrUSmYaqAbkATPAMNRxLCZTBavUP8UEB,/dns4/node3-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAmB9iZKfv9RPRZj6JwcwjbwZWECFwJ67b1LJMHrczTnbjf
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
- OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545
- OP_NODE_SEQUENCER_ENABLED=false
- OP_NODE_SEQUENCER_L1_CONFS=0
- OP_NODE_SEQUENCER_MAX_SAFE_LAG=0
- OP_NODE_SEQUENCER_STOPPED=false
- OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log
- OP_NODE_SYNCMODE=consensus-layer
- OP_NODE_VERIFIER_L1_CONFS=0
entrypoint: [op-node]
restart: unless-stopped
depends_on:
zircuit-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/zircuit/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.zircuit-mainnet-op-geth-archive-leveldb-hash-node-stripprefix.stripprefix.prefixes=/zircuit-mainnet-archive/node
- traefik.http.services.zircuit-mainnet-op-geth-archive-leveldb-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-leveldb-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-leveldb-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-leveldb-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/zircuit-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.zircuit-mainnet-op-geth-archive-leveldb-hash-node.rule=PathPrefix(`/zircuit-mainnet-archive/node`)}
- traefik.http.routers.zircuit-mainnet-op-geth-archive-leveldb-hash-node.middlewares=zircuit-mainnet-op-geth-archive-leveldb-hash-node-stripprefix, ipallowlist
volumes:
zircuit-mainnet-op-geth-archive-leveldb-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: zircuit-mainnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
- name: zirc_getQuarantineHistory
- name: zirc_getQuarantined
- name: zirc_isQuarantined
...

View File

@@ -1,214 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/zircuit-mainnet-op-geth-archive-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/zircuit-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
zircuit-mainnet-archive:
image: ${ZIRCUIT_GETH_IMAGE:-zircuit1/l2-geth}:${ZIRCUIT_MAINNET_GETH_VERSION:-v1.138.8}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_CONFIG=/config/gethconfig.toml
- GETH_ETHSTATS=d${DOMAIN}:${ZIRCUIT_MAINNET_WS_SECRET}@${ZIRCUIT_MAINNET_ETH_STATS_SERVER}:${ZIRCUIT_MAINNET_ETH_STATS_SERVER_PORT}
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://proxyd-ingress-eu.mainnet.zircuit.com/?token=drpcvATEn3gsYCLyLw7ztFLCBwQNoDJr2QjpcsNNkksu
- GETH_TXPOOL_GLOBALQUEUE=1024
- ZIRCUIT_NETWORK=mainnet
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=archive
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --network=mainnet
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ZIRCUIT_MAINNET_OP_GETH_ARCHIVE_PEBBLE_HASH_DATA:-zircuit-mainnet-op-geth-archive-pebble-hash}:/data
- ./op/zircuit/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.zircuit-mainnet-op-geth-archive-pebble-hash-stripprefix.stripprefix.prefixes=/zircuit-mainnet-archive
- traefik.http.services.zircuit-mainnet-op-geth-archive-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/zircuit-mainnet-archive`) || Path(`/zircuit-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.zircuit-mainnet-op-geth-archive-pebble-hash.rule=Path(`/zircuit-mainnet-archive`) || Path(`/zircuit-mainnet-archive/`)}
- traefik.http.routers.zircuit-mainnet-op-geth-archive-pebble-hash.middlewares=zircuit-mainnet-op-geth-archive-pebble-hash-stripprefix, ipallowlist
zircuit-mainnet-archive-node:
image: ${ZIRCUIT_NODE_IMAGE:-zircuit1/op-node}:${MAINNET_NODE_VERSION:-v1.138.8}
user: root
ports:
- 15588:15588
- 15588:15588/udp
environment:
- OP_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_MAINNET_BEACON_ARCHIVER}
- OP_NODE_L1_ETH_RPC=${MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- OP_NODE_L1_RPC_KIND=${ETHEREUM_MAINNET_EXECUTION_KIND:-standard}
- OP_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- OP_NODE_L2_ENGINE_AUTH=/jwtsecret
- OP_NODE_L2_ENGINE_RPC=http://zircuit-mainnet-archive:8551
- OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s
- OP_NODE_L2_SKIP_SYNC_START_CHECK=true
- OP_NODE_LOG_LEVEL=info
- OP_NODE_METRICS_ADDR=0.0.0.0
- OP_NODE_METRICS_ENABLED=true
- OP_NODE_METRICS_PORT=7300
- OP_NODE_NETWORK=mainnet
- OP_NODE_P2P_ADVERTISE_IP=${IP}
- OP_NODE_P2P_LISTEN_IP=0.0.0.0
- OP_NODE_P2P_LISTEN_TCP_PORT=15588
- OP_NODE_P2P_LISTEN_UDP_PORT=15588
- OP_NODE_P2P_STATIC=/dns4/node1-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAm5Uxn3E8RXEM2e5YsR9VNM8uKoPmZzwQjqp7r64ZLspd5,/dns4/node2-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAmPoLg64PL2X2oLrUSmYaqAbkATPAMNRxLCZTBavUP8UEB,/dns4/node3-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAmB9iZKfv9RPRZj6JwcwjbwZWECFwJ67b1LJMHrczTnbjf
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
- OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545
- OP_NODE_SEQUENCER_ENABLED=false
- OP_NODE_SEQUENCER_L1_CONFS=0
- OP_NODE_SEQUENCER_MAX_SAFE_LAG=0
- OP_NODE_SEQUENCER_STOPPED=false
- OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log
- OP_NODE_SYNCMODE=consensus-layer
- OP_NODE_VERIFIER_L1_CONFS=0
entrypoint: [op-node]
restart: unless-stopped
depends_on:
zircuit-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/zircuit/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.zircuit-mainnet-op-geth-archive-pebble-hash-node-stripprefix.stripprefix.prefixes=/zircuit-mainnet-archive/node
- traefik.http.services.zircuit-mainnet-op-geth-archive-pebble-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-pebble-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-pebble-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-archive-pebble-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/zircuit-mainnet-archive/node`)}
- ${NO_SSL:+traefik.http.routers.zircuit-mainnet-op-geth-archive-pebble-hash-node.rule=PathPrefix(`/zircuit-mainnet-archive/node`)}
- traefik.http.routers.zircuit-mainnet-op-geth-archive-pebble-hash-node.middlewares=zircuit-mainnet-op-geth-archive-pebble-hash-node-stripprefix, ipallowlist
volumes:
zircuit-mainnet-op-geth-archive-pebble-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: zircuit-mainnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
- name: zirc_getQuarantineHistory
- name: zirc_getQuarantined
- name: zirc_isQuarantined
...

View File

@@ -1,214 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/zircuit-mainnet-op-geth-pruned-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/zircuit-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
zircuit-mainnet:
image: ${ZIRCUIT_GETH_IMAGE:-zircuit1/l2-geth}:${ZIRCUIT_MAINNET_GETH_VERSION:-v1.138.8}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_CONFIG=/config/gethconfig.toml
- GETH_ETHSTATS=d${DOMAIN}:${ZIRCUIT_MAINNET_WS_SECRET}@${ZIRCUIT_MAINNET_ETH_STATS_SERVER}:${ZIRCUIT_MAINNET_ETH_STATS_SERVER_PORT}
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://proxyd-ingress-eu.mainnet.zircuit.com/?token=drpcvATEn3gsYCLyLw7ztFLCBwQNoDJr2QjpcsNNkksu
- GETH_TXPOOL_GLOBALQUEUE=1024
- ZIRCUIT_NETWORK=mainnet
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --network=mainnet
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=hash
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ZIRCUIT_MAINNET_OP_GETH_PRUNED_PEBBLE_HASH_DATA:-zircuit-mainnet-op-geth-pruned-pebble-hash}:/data
- ./op/zircuit/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.zircuit-mainnet-op-geth-pruned-pebble-hash-stripprefix.stripprefix.prefixes=/zircuit-mainnet
- traefik.http.services.zircuit-mainnet-op-geth-pruned-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/zircuit-mainnet`) || Path(`/zircuit-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-hash.rule=Path(`/zircuit-mainnet`) || Path(`/zircuit-mainnet/`)}
- traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-hash.middlewares=zircuit-mainnet-op-geth-pruned-pebble-hash-stripprefix, ipallowlist
zircuit-mainnet-node:
image: ${ZIRCUIT_NODE_IMAGE:-zircuit1/op-node}:${MAINNET_NODE_VERSION:-v1.138.8}
user: root
ports:
- 18688:18688
- 18688:18688/udp
environment:
- OP_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_MAINNET_BEACON_ARCHIVER}
- OP_NODE_L1_ETH_RPC=${MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- OP_NODE_L1_RPC_KIND=${ETHEREUM_MAINNET_EXECUTION_KIND:-standard}
- OP_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- OP_NODE_L2_ENGINE_AUTH=/jwtsecret
- OP_NODE_L2_ENGINE_RPC=http://zircuit-mainnet:8551
- OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s
- OP_NODE_L2_SKIP_SYNC_START_CHECK=true
- OP_NODE_LOG_LEVEL=info
- OP_NODE_METRICS_ADDR=0.0.0.0
- OP_NODE_METRICS_ENABLED=true
- OP_NODE_METRICS_PORT=7300
- OP_NODE_NETWORK=mainnet
- OP_NODE_P2P_ADVERTISE_IP=${IP}
- OP_NODE_P2P_LISTEN_IP=0.0.0.0
- OP_NODE_P2P_LISTEN_TCP_PORT=18688
- OP_NODE_P2P_LISTEN_UDP_PORT=18688
- OP_NODE_P2P_STATIC=/dns4/node1-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAm5Uxn3E8RXEM2e5YsR9VNM8uKoPmZzwQjqp7r64ZLspd5,/dns4/node2-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAmPoLg64PL2X2oLrUSmYaqAbkATPAMNRxLCZTBavUP8UEB,/dns4/node3-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAmB9iZKfv9RPRZj6JwcwjbwZWECFwJ67b1LJMHrczTnbjf
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
- OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545
- OP_NODE_SEQUENCER_ENABLED=false
- OP_NODE_SEQUENCER_L1_CONFS=0
- OP_NODE_SEQUENCER_MAX_SAFE_LAG=0
- OP_NODE_SEQUENCER_STOPPED=false
- OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log
- OP_NODE_SYNCMODE=consensus-layer
- OP_NODE_VERIFIER_L1_CONFS=0
entrypoint: [op-node]
restart: unless-stopped
depends_on:
zircuit-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/zircuit/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.zircuit-mainnet-op-geth-pruned-pebble-hash-node-stripprefix.stripprefix.prefixes=/zircuit-mainnet/node
- traefik.http.services.zircuit-mainnet-op-geth-pruned-pebble-hash-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-hash-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-hash-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-hash-node.rule=Host(`$DOMAIN`) && PathPrefix(`/zircuit-mainnet/node`)}
- ${NO_SSL:+traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-hash-node.rule=PathPrefix(`/zircuit-mainnet/node`)}
- traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-hash-node.middlewares=zircuit-mainnet-op-geth-pruned-pebble-hash-node-stripprefix, ipallowlist
volumes:
zircuit-mainnet-op-geth-pruned-pebble-hash:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: zircuit-mainnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
- name: zirc_getQuarantineHistory
- name: zirc_getQuarantined
- name: zirc_isQuarantined
...

View File

@@ -1,216 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/geth/zircuit-mainnet-op-geth-pruned-pebble-path.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/zircuit-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
zircuit-mainnet:
image: ${ZIRCUIT_GETH_IMAGE:-zircuit1/l2-geth}:${ZIRCUIT_MAINNET_GETH_VERSION:-v1.138.8}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
expose:
- 8545
- 6060
- 8551
environment:
- GETH_CONFIG=/config/gethconfig.toml
- GETH_ETHSTATS=d${DOMAIN}:${ZIRCUIT_MAINNET_WS_SECRET}@${ZIRCUIT_MAINNET_ETH_STATS_SERVER}:${ZIRCUIT_MAINNET_ETH_STATS_SERVER_PORT}
- GETH_ROLLUP_DISABLETXPOOLGOSSIP=true
- GETH_ROLLUP_SEQUENCERHTTP=https://proxyd-ingress-eu.mainnet.zircuit.com/?token=drpcvATEn3gsYCLyLw7ztFLCBwQNoDJr2QjpcsNNkksu
- GETH_TXPOOL_GLOBALQUEUE=1024
- ZIRCUIT_NETWORK=mainnet
entrypoint: /bin/sh -c 'exec geth "$@"' --
command:
- --datadir=/data
- --db.engine=pebble
- --gcmode=full
- --maxpeers=50
- --metrics
- --metrics.addr=0.0.0.0
- --metrics.port=6060
- --network=mainnet
- --nodiscover
- --rpc.gascap=600000000
- --rpc.txfeecap=0
- --state.scheme=path
- --syncmode=full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,debug,admin,txpool,engine
- --http.port=8545
- --http.vhosts=*
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3,debug,admin,txpool,engine
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
- --authrpc.vhosts=*
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ZIRCUIT_MAINNET_OP_GETH_PRUNED_PEBBLE_PATH_DATA:-zircuit-mainnet-op-geth-pruned-pebble-path}:/data
- ./op/zircuit/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6060
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.zircuit-mainnet-op-geth-pruned-pebble-path-stripprefix.stripprefix.prefixes=/zircuit-mainnet
- traefik.http.services.zircuit-mainnet-op-geth-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/zircuit-mainnet`) || Path(`/zircuit-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-path.rule=Path(`/zircuit-mainnet`) || Path(`/zircuit-mainnet/`)}
- traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-path.middlewares=zircuit-mainnet-op-geth-pruned-pebble-path-stripprefix, ipallowlist
zircuit-mainnet-node:
image: ${ZIRCUIT_NODE_IMAGE:-zircuit1/op-node}:${MAINNET_NODE_VERSION:-v1.138.8}
user: root
ports:
- 18359:18359
- 18359:18359/udp
environment:
- OP_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_MAINNET_BEACON_ARCHIVER}
- OP_NODE_L1_ETH_RPC=${MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- OP_NODE_L1_RPC_KIND=${ETHEREUM_MAINNET_EXECUTION_KIND:-standard}
- OP_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- OP_NODE_L2_ENGINE_AUTH=/jwtsecret
- OP_NODE_L2_ENGINE_RPC=http://zircuit-mainnet:8551
- OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s
- OP_NODE_L2_SKIP_SYNC_START_CHECK=true
- OP_NODE_LOG_LEVEL=info
- OP_NODE_METRICS_ADDR=0.0.0.0
- OP_NODE_METRICS_ENABLED=true
- OP_NODE_METRICS_PORT=7300
- OP_NODE_NETWORK=mainnet
- OP_NODE_P2P_ADVERTISE_IP=${IP}
- OP_NODE_P2P_LISTEN_IP=0.0.0.0
- OP_NODE_P2P_LISTEN_TCP_PORT=18359
- OP_NODE_P2P_LISTEN_UDP_PORT=18359
- OP_NODE_P2P_STATIC=/dns4/node1-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAm5Uxn3E8RXEM2e5YsR9VNM8uKoPmZzwQjqp7r64ZLspd5,/dns4/node2-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAmPoLg64PL2X2oLrUSmYaqAbkATPAMNRxLCZTBavUP8UEB,/dns4/node3-eu-p2p.mainnet.zircuit.com/tcp/9003/p2p/16Uiu2HAmB9iZKfv9RPRZj6JwcwjbwZWECFwJ67b1LJMHrczTnbjf
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
- OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545
- OP_NODE_SEQUENCER_ENABLED=false
- OP_NODE_SEQUENCER_L1_CONFS=0
- OP_NODE_SEQUENCER_MAX_SAFE_LAG=0
- OP_NODE_SEQUENCER_STOPPED=false
- OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log
- OP_NODE_SYNCMODE=consensus-layer
- OP_NODE_VERIFIER_L1_CONFS=0
entrypoint: [op-node]
restart: unless-stopped
depends_on:
zircuit-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/zircuit/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.zircuit-mainnet-op-geth-pruned-pebble-path-node-stripprefix.stripprefix.prefixes=/zircuit-mainnet/node
- traefik.http.services.zircuit-mainnet-op-geth-pruned-pebble-path-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-path-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-path-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-path-node.rule=Host(`$DOMAIN`) && PathPrefix(`/zircuit-mainnet/node`)}
- ${NO_SSL:+traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-path-node.rule=PathPrefix(`/zircuit-mainnet/node`)}
- traefik.http.routers.zircuit-mainnet-op-geth-pruned-pebble-path-node.middlewares=zircuit-mainnet-op-geth-pruned-pebble-path-node-stripprefix, ipallowlist
volumes:
zircuit-mainnet-op-geth-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: zircuit-mainnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
- name: zirc_getQuarantineHistory
- name: zirc_getQuarantined
- name: zirc_isQuarantined
...

View File

@@ -20,17 +20,17 @@ x-logging-defaults: &logging-defaults
# ... # ...
# IP=$(curl ipinfo.io/ip) # IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me # DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/reth/soneium-miniato-sepolia-op-reth-archive-trace.yml # COMPOSE_FILE=base.yml:rpc.yml:op/reth/soneium-minato-sepolia-op-reth-archive-trace.yml
# #
# docker compose up -d # docker compose up -d
# #
# curl -X POST https://${IP}.traefik.me/soneium-miniato-sepolia-op-reth \ # curl -X POST https://${IP}.traefik.me/soneium-minato-sepolia-op-reth \
# -H "Content-Type: application/json" \ # -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' # --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services: services:
soneium-miniato-sepolia-op-reth: soneium-minato-sepolia-op-reth:
image: ${SONEIUM_RETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-reth}:${SONEIUM_MINIATO_SEPOLIA_RETH_VERSION:-v2.3.3} image: ${SONEIUM_RETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-reth}:${SONEIUM_MINATO_SEPOLIA_RETH_VERSION:-v2.3.3}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -47,27 +47,27 @@ services:
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX) memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root user: root
ports: ports:
- 11940:11940 - 14829:14829
- 11940:11940/udp - 14829:14829/udp
expose: expose:
- 8545 - 8545
- 9001 - 9001
- 8551 - 8551
entrypoint: [op-reth, node] entrypoint: [op-reth, node]
command: command:
- --chain=soneium-miniato-sepolia - --chain=soneium-minato-sepolia
- --datadir=/root/.local/share/reth - --datadir=/root/.local/share/reth
- --discovery.addr=0.0.0.0 - --discovery.addr=0.0.0.0
- --discovery.port=11940 - --discovery.port=14829
- --discovery.v5.addr=0.0.0.0 - --discovery.v5.addr=0.0.0.0
- --discovery.v5.port=11940 - --discovery.v5.port=14829
- --engine.cross-block-cache-size=${SONEIUM_MINIATO_SEPOLIA_RETH_STATE_CACHE:-4096} - --engine.cross-block-cache-size=${SONEIUM_MINATO_SEPOLIA_RETH_STATE_CACHE:-4096}
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001
- --nat=extip:${IP} - --nat=extip:${IP}
- --port=11940 - --port=14829
- --rollup.sequencer-http=https://rpc.soneium.org - --rollup.sequencer-http=https://rpc.minato.soneium.org
- --rpc-cache.max-blocks=10000 - --rpc-cache.max-blocks=10000
- --rpc-cache.max-concurrent-db-requests=2048 - --rpc-cache.max-concurrent-db-requests=2048
- --rpc.gascap=600000000 - --rpc.gascap=600000000
@@ -92,7 +92,7 @@ services:
networks: networks:
- chains - chains
volumes: volumes:
- ${SONEIUM_MINIATO_SEPOLIA_OP_RETH_ARCHIVE_TRACE_DATA:-soneium-miniato-sepolia-op-reth-archive-trace}:/root/.local/share/reth - ${SONEIUM_MINATO_SEPOLIA_OP_RETH_ARCHIVE_TRACE_DATA:-soneium-minato-sepolia-op-reth-archive-trace}:/root/.local/share/reth
- .jwtsecret:/jwtsecret:ro - .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk - /slowdisk:/slowdisk
logging: *logging-defaults logging: *logging-defaults
@@ -101,41 +101,41 @@ services:
- prometheus-scrape.port=9001 - prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics - prometheus-scrape.path=/metrics
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.soneium-miniato-sepolia-op-reth-archive-trace-stripprefix.stripprefix.prefixes=/soneium-miniato-sepolia-op-reth - traefik.http.middlewares.soneium-minato-sepolia-op-reth-archive-trace-stripprefix.stripprefix.prefixes=/soneium-minato-sepolia-op-reth
- traefik.http.services.soneium-miniato-sepolia-op-reth-archive-trace.loadbalancer.server.port=8545 - traefik.http.services.soneium-minato-sepolia-op-reth-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-archive-trace.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-archive-trace.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/soneium-miniato-sepolia-op-reth`) || Path(`/soneium-miniato-sepolia-op-reth/`))} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/soneium-minato-sepolia-op-reth`) || Path(`/soneium-minato-sepolia-op-reth/`))}
- ${NO_SSL:+traefik.http.routers.soneium-miniato-sepolia-op-reth-archive-trace.rule=Path(`/soneium-miniato-sepolia-op-reth`) || Path(`/soneium-miniato-sepolia-op-reth/`)} - ${NO_SSL:+traefik.http.routers.soneium-minato-sepolia-op-reth-archive-trace.rule=Path(`/soneium-minato-sepolia-op-reth`) || Path(`/soneium-minato-sepolia-op-reth/`)}
- traefik.http.routers.soneium-miniato-sepolia-op-reth-archive-trace.middlewares=soneium-miniato-sepolia-op-reth-archive-trace-stripprefix, ipallowlist - traefik.http.routers.soneium-minato-sepolia-op-reth-archive-trace.middlewares=soneium-minato-sepolia-op-reth-archive-trace-stripprefix, ipallowlist
shm_size: 2gb shm_size: 2gb
soneium-miniato-sepolia-op-reth-node: soneium-minato-sepolia-op-reth-node:
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINIATO_SEPOLIA_NODE_VERSION:-v1.19.2} image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINATO_SEPOLIA_NODE_VERSION:-v1.19.2}
ports: ports:
- 16940:16940 - 19829:19829
- 16940:16940/udp - 19829:19829/udp
environment: environment:
- OP_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST} - OP_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_SEPOLIA_BEACON_ARCHIVER} - OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_SEPOLIA_BEACON_ARCHIVER}
- OP_NODE_L1_ETH_RPC=${SONEIUM_MINIATO_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}} - OP_NODE_L1_ETH_RPC=${SONEIUM_MINATO_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- OP_NODE_L1_RPC_KIND=${ETHEREUM_SEPOLIA_EXECUTION_KIND:-standard} - OP_NODE_L1_RPC_KIND=${ETHEREUM_SEPOLIA_EXECUTION_KIND:-standard}
- OP_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false} - OP_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- OP_NODE_L2_ENGINE_AUTH=/jwtsecret - OP_NODE_L2_ENGINE_AUTH=/jwtsecret
- OP_NODE_L2_ENGINE_KIND=reth - OP_NODE_L2_ENGINE_KIND=reth
- OP_NODE_L2_ENGINE_RPC=http://soneium-miniato-sepolia-op-reth:8551 - OP_NODE_L2_ENGINE_RPC=http://soneium-minato-sepolia-op-reth:8551
- OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s - OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s
- OP_NODE_L2_SKIP_SYNC_START_CHECK=true - OP_NODE_L2_SKIP_SYNC_START_CHECK=true
- OP_NODE_LOG_LEVEL=info - OP_NODE_LOG_LEVEL=info
- OP_NODE_METRICS_ADDR=0.0.0.0 - OP_NODE_METRICS_ADDR=0.0.0.0
- OP_NODE_METRICS_ENABLED=true - OP_NODE_METRICS_ENABLED=true
- OP_NODE_METRICS_PORT=7300 - OP_NODE_METRICS_PORT=7300
- OP_NODE_NETWORK=soneium-miniato-sepolia - OP_NODE_NETWORK=soneium-minato-sepolia
- OP_NODE_OVERRIDE_PECTRABLOBSCHEDULE=1742486400 - OP_NODE_OVERRIDE_PECTRABLOBSCHEDULE=1742486400
- OP_NODE_P2P_ADVERTISE_IP=${IP} - OP_NODE_P2P_ADVERTISE_IP=${IP}
- OP_NODE_P2P_LISTEN_IP=0.0.0.0 - OP_NODE_P2P_LISTEN_IP=0.0.0.0
- OP_NODE_P2P_LISTEN_TCP_PORT=16940 - OP_NODE_P2P_LISTEN_TCP_PORT=19829
- OP_NODE_P2P_LISTEN_UDP_PORT=16940 - OP_NODE_P2P_LISTEN_UDP_PORT=19829
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true - OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
- OP_NODE_RPC_ADDR=0.0.0.0 - OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545 - OP_NODE_RPC_PORT=9545
@@ -145,7 +145,7 @@ services:
entrypoint: [op-node] entrypoint: [op-node]
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
soneium-miniato-sepolia-op-reth: soneium-minato-sepolia-op-reth:
condition: service_started condition: service_started
restart: true restart: true
networks: networks:
@@ -158,16 +158,16 @@ services:
- prometheus-scrape.port=7300 - prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics - prometheus-scrape.path=/metrics
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.soneium-miniato-sepolia-op-reth-archive-trace-node-stripprefix.stripprefix.prefixes=/soneium-miniato-sepolia-op-reth/node - traefik.http.middlewares.soneium-minato-sepolia-op-reth-archive-trace-node-stripprefix.stripprefix.prefixes=/soneium-minato-sepolia-op-reth/node
- traefik.http.services.soneium-miniato-sepolia-op-reth-archive-trace-node.loadbalancer.server.port=9545 - traefik.http.services.soneium-minato-sepolia-op-reth-archive-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-archive-trace-node.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-archive-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-archive-trace-node.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-archive-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/soneium-miniato-sepolia-op-reth/node`)} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-archive-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/soneium-minato-sepolia-op-reth/node`)}
- ${NO_SSL:+traefik.http.routers.soneium-miniato-sepolia-op-reth-archive-trace-node.rule=PathPrefix(`/soneium-miniato-sepolia-op-reth/node`)} - ${NO_SSL:+traefik.http.routers.soneium-minato-sepolia-op-reth-archive-trace-node.rule=PathPrefix(`/soneium-minato-sepolia-op-reth/node`)}
- traefik.http.routers.soneium-miniato-sepolia-op-reth-archive-trace-node.middlewares=soneium-miniato-sepolia-op-reth-archive-trace-node-stripprefix, ipallowlist - traefik.http.routers.soneium-minato-sepolia-op-reth-archive-trace-node.middlewares=soneium-minato-sepolia-op-reth-archive-trace-node-stripprefix, ipallowlist
volumes: volumes:
soneium-miniato-sepolia-op-reth-archive-trace: soneium-minato-sepolia-op-reth-archive-trace:
x-upstreams: x-upstreams:
- id: $${ID} - id: $${ID}
@@ -181,7 +181,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: soneium chain: soneium-minato
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -20,17 +20,17 @@ x-logging-defaults: &logging-defaults
# ... # ...
# IP=$(curl ipinfo.io/ip) # IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me # DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/reth/soneium-miniato-sepolia-op-reth-pruned-trace.yml # COMPOSE_FILE=base.yml:rpc.yml:op/reth/soneium-minato-sepolia-op-reth-pruned-trace.yml
# #
# docker compose up -d # docker compose up -d
# #
# curl -X POST https://${IP}.traefik.me/soneium-miniato-sepolia-op-reth-pruned \ # curl -X POST https://${IP}.traefik.me/soneium-minato-sepolia-op-reth-pruned \
# -H "Content-Type: application/json" \ # -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' # --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services: services:
soneium-miniato-sepolia-op-reth-pruned: soneium-minato-sepolia-op-reth-pruned:
image: ${SONEIUM_RETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-reth}:${SONEIUM_MINIATO_SEPOLIA_RETH_VERSION:-v2.3.3} image: ${SONEIUM_RETH_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-reth}:${SONEIUM_MINATO_SEPOLIA_RETH_VERSION:-v2.3.3}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -47,28 +47,28 @@ services:
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX) memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root user: root
ports: ports:
- 11094:11094 - 13724:13724
- 11094:11094/udp - 13724:13724/udp
expose: expose:
- 8545 - 8545
- 9001 - 9001
- 8551 - 8551
entrypoint: [op-reth, node] entrypoint: [op-reth, node]
command: command:
- --chain=soneium-miniato-sepolia - --chain=soneium-minato-sepolia
- --datadir=/root/.local/share/reth - --datadir=/root/.local/share/reth
- --discovery.addr=0.0.0.0 - --discovery.addr=0.0.0.0
- --discovery.port=11094 - --discovery.port=13724
- --discovery.v5.addr=0.0.0.0 - --discovery.v5.addr=0.0.0.0
- --discovery.v5.port=11094 - --discovery.v5.port=13724
- --engine.cross-block-cache-size=${SONEIUM_MINIATO_SEPOLIA_RETH_STATE_CACHE:-4096} - --engine.cross-block-cache-size=${SONEIUM_MINATO_SEPOLIA_RETH_STATE_CACHE:-4096}
- --full - --full
- --max-inbound-peers=50 - --max-inbound-peers=50
- --max-outbound-peers=50 - --max-outbound-peers=50
- --metrics=0.0.0.0:9001 - --metrics=0.0.0.0:9001
- --nat=extip:${IP} - --nat=extip:${IP}
- --port=11094 - --port=13724
- --rollup.sequencer-http=https://rpc.soneium.org - --rollup.sequencer-http=https://rpc.minato.soneium.org
- --rpc-cache.max-blocks=10000 - --rpc-cache.max-blocks=10000
- --rpc-cache.max-concurrent-db-requests=2048 - --rpc-cache.max-concurrent-db-requests=2048
- --rpc.gascap=600000000 - --rpc.gascap=600000000
@@ -93,7 +93,7 @@ services:
networks: networks:
- chains - chains
volumes: volumes:
- ${SONEIUM_MINIATO_SEPOLIA_OP_RETH_PRUNED_TRACE_DATA:-soneium-miniato-sepolia-op-reth-pruned-trace}:/root/.local/share/reth - ${SONEIUM_MINATO_SEPOLIA_OP_RETH_PRUNED_TRACE_DATA:-soneium-minato-sepolia-op-reth-pruned-trace}:/root/.local/share/reth
- .jwtsecret:/jwtsecret:ro - .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk - /slowdisk:/slowdisk
logging: *logging-defaults logging: *logging-defaults
@@ -102,41 +102,41 @@ services:
- prometheus-scrape.port=9001 - prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics - prometheus-scrape.path=/metrics
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.soneium-miniato-sepolia-op-reth-pruned-trace-stripprefix.stripprefix.prefixes=/soneium-miniato-sepolia-op-reth-pruned - traefik.http.middlewares.soneium-minato-sepolia-op-reth-pruned-trace-stripprefix.stripprefix.prefixes=/soneium-minato-sepolia-op-reth-pruned
- traefik.http.services.soneium-miniato-sepolia-op-reth-pruned-trace.loadbalancer.server.port=8545 - traefik.http.services.soneium-minato-sepolia-op-reth-pruned-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-pruned-trace.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-pruned-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-pruned-trace.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-pruned-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/soneium-miniato-sepolia-op-reth-pruned`) || Path(`/soneium-miniato-sepolia-op-reth-pruned/`))} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/soneium-minato-sepolia-op-reth-pruned`) || Path(`/soneium-minato-sepolia-op-reth-pruned/`))}
- ${NO_SSL:+traefik.http.routers.soneium-miniato-sepolia-op-reth-pruned-trace.rule=Path(`/soneium-miniato-sepolia-op-reth-pruned`) || Path(`/soneium-miniato-sepolia-op-reth-pruned/`)} - ${NO_SSL:+traefik.http.routers.soneium-minato-sepolia-op-reth-pruned-trace.rule=Path(`/soneium-minato-sepolia-op-reth-pruned`) || Path(`/soneium-minato-sepolia-op-reth-pruned/`)}
- traefik.http.routers.soneium-miniato-sepolia-op-reth-pruned-trace.middlewares=soneium-miniato-sepolia-op-reth-pruned-trace-stripprefix, ipallowlist - traefik.http.routers.soneium-minato-sepolia-op-reth-pruned-trace.middlewares=soneium-minato-sepolia-op-reth-pruned-trace-stripprefix, ipallowlist
shm_size: 2gb shm_size: 2gb
soneium-miniato-sepolia-op-reth-pruned-node: soneium-minato-sepolia-op-reth-pruned-node:
image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINIATO_SEPOLIA_NODE_VERSION:-v1.19.2} image: ${SONEIUM_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${SONEIUM_MINATO_SEPOLIA_NODE_VERSION:-v1.19.2}
ports: ports:
- 16094:16094 - 18724:18724
- 16094:16094/udp - 18724:18724/udp
environment: environment:
- OP_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST} - OP_NODE_L1_BEACON=${ETHEREUM_SEPOLIA_BEACON_REST}
- OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_SEPOLIA_BEACON_ARCHIVER} - OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_SEPOLIA_BEACON_ARCHIVER}
- OP_NODE_L1_ETH_RPC=${SONEIUM_MINIATO_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}} - OP_NODE_L1_ETH_RPC=${SONEIUM_MINATO_SEPOLIA_L1_EXECUTION_RPC:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
- OP_NODE_L1_RPC_KIND=${ETHEREUM_SEPOLIA_EXECUTION_KIND:-standard} - OP_NODE_L1_RPC_KIND=${ETHEREUM_SEPOLIA_EXECUTION_KIND:-standard}
- OP_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false} - OP_NODE_L1_TRUST_RPC=${ETHEREUM_SEPOLIA_EXECUTION_TRUST:-false}
- OP_NODE_L2_ENGINE_AUTH=/jwtsecret - OP_NODE_L2_ENGINE_AUTH=/jwtsecret
- OP_NODE_L2_ENGINE_KIND=reth - OP_NODE_L2_ENGINE_KIND=reth
- OP_NODE_L2_ENGINE_RPC=http://soneium-miniato-sepolia-op-reth-pruned:8551 - OP_NODE_L2_ENGINE_RPC=http://soneium-minato-sepolia-op-reth-pruned:8551
- OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s - OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s
- OP_NODE_L2_SKIP_SYNC_START_CHECK=true - OP_NODE_L2_SKIP_SYNC_START_CHECK=true
- OP_NODE_LOG_LEVEL=info - OP_NODE_LOG_LEVEL=info
- OP_NODE_METRICS_ADDR=0.0.0.0 - OP_NODE_METRICS_ADDR=0.0.0.0
- OP_NODE_METRICS_ENABLED=true - OP_NODE_METRICS_ENABLED=true
- OP_NODE_METRICS_PORT=7300 - OP_NODE_METRICS_PORT=7300
- OP_NODE_NETWORK=soneium-miniato-sepolia - OP_NODE_NETWORK=soneium-minato-sepolia
- OP_NODE_OVERRIDE_PECTRABLOBSCHEDULE=1742486400 - OP_NODE_OVERRIDE_PECTRABLOBSCHEDULE=1742486400
- OP_NODE_P2P_ADVERTISE_IP=${IP} - OP_NODE_P2P_ADVERTISE_IP=${IP}
- OP_NODE_P2P_LISTEN_IP=0.0.0.0 - OP_NODE_P2P_LISTEN_IP=0.0.0.0
- OP_NODE_P2P_LISTEN_TCP_PORT=16094 - OP_NODE_P2P_LISTEN_TCP_PORT=18724
- OP_NODE_P2P_LISTEN_UDP_PORT=16094 - OP_NODE_P2P_LISTEN_UDP_PORT=18724
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true - OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
- OP_NODE_RPC_ADDR=0.0.0.0 - OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545 - OP_NODE_RPC_PORT=9545
@@ -146,7 +146,7 @@ services:
entrypoint: [op-node] entrypoint: [op-node]
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
soneium-miniato-sepolia-op-reth-pruned: soneium-minato-sepolia-op-reth-pruned:
condition: service_started condition: service_started
restart: true restart: true
networks: networks:
@@ -159,16 +159,16 @@ services:
- prometheus-scrape.port=7300 - prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics - prometheus-scrape.path=/metrics
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.soneium-miniato-sepolia-op-reth-pruned-trace-node-stripprefix.stripprefix.prefixes=/soneium-miniato-sepolia-op-reth-pruned/node - traefik.http.middlewares.soneium-minato-sepolia-op-reth-pruned-trace-node-stripprefix.stripprefix.prefixes=/soneium-minato-sepolia-op-reth-pruned/node
- traefik.http.services.soneium-miniato-sepolia-op-reth-pruned-trace-node.loadbalancer.server.port=9545 - traefik.http.services.soneium-minato-sepolia-op-reth-pruned-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-pruned-trace-node.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-pruned-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-pruned-trace-node.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-pruned-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.soneium-miniato-sepolia-op-reth-pruned-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/soneium-miniato-sepolia-op-reth-pruned/node`)} - ${NO_SSL:-traefik.http.routers.soneium-minato-sepolia-op-reth-pruned-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/soneium-minato-sepolia-op-reth-pruned/node`)}
- ${NO_SSL:+traefik.http.routers.soneium-miniato-sepolia-op-reth-pruned-trace-node.rule=PathPrefix(`/soneium-miniato-sepolia-op-reth-pruned/node`)} - ${NO_SSL:+traefik.http.routers.soneium-minato-sepolia-op-reth-pruned-trace-node.rule=PathPrefix(`/soneium-minato-sepolia-op-reth-pruned/node`)}
- traefik.http.routers.soneium-miniato-sepolia-op-reth-pruned-trace-node.middlewares=soneium-miniato-sepolia-op-reth-pruned-trace-node-stripprefix, ipallowlist - traefik.http.routers.soneium-minato-sepolia-op-reth-pruned-trace-node.middlewares=soneium-minato-sepolia-op-reth-pruned-trace-node-stripprefix, ipallowlist
volumes: volumes:
soneium-miniato-sepolia-op-reth-pruned-trace: soneium-minato-sepolia-op-reth-pruned-trace:
x-upstreams: x-upstreams:
- id: $${ID} - id: $${ID}
@@ -182,7 +182,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: soneium chain: soneium-minato
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -184,7 +184,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: zircuit-testnet chain: zircuit-garfield-testnet
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -0,0 +1,200 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:op/reth/zircuit-mainnet-op-reth-pruned-trace.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/zircuit-mainnet-op-reth-pruned \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
zircuit-mainnet-op-reth-pruned:
image: ${ZIRCUIT_RETH_IMAGE:-ghcr.io/conduitxyz/conduit-op-reth}:${ZIRCUIT_MAINNET_RETH_VERSION:-v2.1.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: root
expose:
- 8545
- 9001
- 8551
entrypoint: [op-reth, node]
command:
- --chain=/config/genesis.json
- --config=/config/reth/reth.toml
- --datadir=/root/.local/share/reth
- --disable-discovery
- --engine.cross-block-cache-size=${ZIRCUIT_MAINNET_RETH_STATE_CACHE:-4096}
- --full
- --max-inbound-peers=50
- --max-outbound-peers=50
- --metrics=0.0.0.0:9001
- --rollup.sequencer-http=https://proxyd-ingress-eu.mainnet.zircuit.com/?token=drpcvATEn3gsYCLyLw7ztFLCBwQNoDJr2QjpcsNNkksu
- --rpc-cache.max-blocks=10000
- --rpc-cache.max-concurrent-db-requests=2048
- --rpc.gascap=600000000
- --rpc.max-blocks-per-filter=0
- --rpc.max-connections=50000
- --rpc.max-logs-per-response=0
- --rpc.max-trace-filter-blocks=10000
- --http
- --http.addr=0.0.0.0
- --http.api=admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,mev
- --http.corsdomain=*
- --http.port=8545
- --ws
- --ws.addr=0.0.0.0
- --ws.api=admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,mev
- --ws.origins=*
- --ws.port=8545
- --authrpc.addr=0.0.0.0
- --authrpc.jwtsecret=/jwtsecret
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ZIRCUIT_MAINNET_OP_RETH_PRUNED_TRACE_DATA:-zircuit-mainnet-op-reth-pruned-trace}:/root/.local/share/reth
- ./op/zircuit/mainnet:/config
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.zircuit-mainnet-op-reth-pruned-trace-stripprefix.stripprefix.prefixes=/zircuit-mainnet-op-reth-pruned
- traefik.http.services.zircuit-mainnet-op-reth-pruned-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-reth-pruned-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-reth-pruned-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/zircuit-mainnet-op-reth-pruned`) || Path(`/zircuit-mainnet-op-reth-pruned/`))}
- ${NO_SSL:+traefik.http.routers.zircuit-mainnet-op-reth-pruned-trace.rule=Path(`/zircuit-mainnet-op-reth-pruned`) || Path(`/zircuit-mainnet-op-reth-pruned/`)}
- traefik.http.routers.zircuit-mainnet-op-reth-pruned-trace.middlewares=zircuit-mainnet-op-reth-pruned-trace-stripprefix, ipallowlist
shm_size: 2gb
zircuit-mainnet-op-reth-pruned-node:
image: ${ZIRCUIT_NODE_IMAGE:-us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node}:${MAINNET_NODE_VERSION:-v1.19.3}
user: root
ports:
- 17481:17481
- 17481:17481/udp
environment:
- OP_NODE_L1_BEACON=${ETHEREUM_MAINNET_BEACON_REST}
- OP_NODE_L1_BEACON_ARCHIVER=${ETHEREUM_MAINNET_BEACON_ARCHIVER}
- OP_NODE_L1_ETH_RPC=${MAINNET_L1_EXECUTION_RPC:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
- OP_NODE_L1_RPC_KIND=${ETHEREUM_MAINNET_EXECUTION_KIND:-standard}
- OP_NODE_L1_TRUST_RPC=${ETHEREUM_MAINNET_EXECUTION_TRUST:-false}
- OP_NODE_L2_ENGINE_AUTH=/jwtsecret
- OP_NODE_L2_ENGINE_KIND=reth
- OP_NODE_L2_ENGINE_RPC=http://zircuit-mainnet-op-reth-pruned:8551
- OP_NODE_L2_ENGINE_RPC_TIMEOUT=120s
- OP_NODE_L2_SKIP_SYNC_START_CHECK=true
- OP_NODE_LOG_LEVEL=info
- OP_NODE_METRICS_ADDR=0.0.0.0
- OP_NODE_METRICS_ENABLED=true
- OP_NODE_METRICS_PORT=7300
- OP_NODE_P2P_ADVERTISE_IP=${IP}
- OP_NODE_P2P_BOOTNODES=enode://de9f4784612b7523dc029a38091139aafae293c2f7d17c11bce8579f6246782216a7d61599fb001c38042e8e6ac6a0cdafd1a26d37743e5439bc3d4d6680f7df@35.185.208.192:9222?discport=30301,enode://d25ce99435982b04d60c4b41ba256b84b888626db7bee45a9419382300fbe907359ae5ef250346785bff8d3b9d07cd3e017a27e2ee3cfda3bcbb0ba762ac9674@bootnode.conduit.xyz:0?discport=30301,enode://2d4e7e9d48f4dd4efe9342706dd1b0024681bd4c3300d021f86fc75eab7865d4e0cbec6fbc883f011cfd6a57423e7e2f6e104baad2b744c3cafaec6bc7dc92c1@34.65.43.171:0?discport=30305,enode://9d7a3efefe442351217e73b3a593bcb8efffb55b4807699972145324eab5e6b382152f8d24f6301baebbfb5ecd4127bd3faab2842c04cd432bdf50ba092f6645@34.65.109.126:0?discport=30305
- OP_NODE_P2P_LISTEN_IP=0.0.0.0
- OP_NODE_P2P_LISTEN_TCP_PORT=17481
- OP_NODE_P2P_LISTEN_UDP_PORT=17481
- OP_NODE_P2P_STATIC=/ip4/35.185.208.192/tcp/9222/p2p/16Uiu2HAmTe1j7ubQUanCiUSQs7K7SzkWxdrfDUP9GifkMoC2osLm
- OP_NODE_ROLLUP_CONFIG=/config/rollup.json
- OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
- OP_NODE_RPC_ADDR=0.0.0.0
- OP_NODE_RPC_PORT=9545
- OP_NODE_SEQUENCER_ENABLED=false
- OP_NODE_SEQUENCER_L1_CONFS=0
- OP_NODE_SEQUENCER_MAX_SAFE_LAG=0
- OP_NODE_SEQUENCER_STOPPED=false
- OP_NODE_SNAPSHOT_LOG=/tmp/op-node-snapshot-log
- OP_NODE_SYNCMODE=consensus-layer
- OP_NODE_VERIFIER_L1_CONFS=0
entrypoint: [op-node]
restart: unless-stopped
depends_on:
zircuit-mainnet-op-reth-pruned:
condition: service_started
restart: true
networks:
- chains
volumes:
- ./op/zircuit/mainnet:/config
- .jwtsecret:/jwtsecret:ro
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=7300
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.zircuit-mainnet-op-reth-pruned-trace-node-stripprefix.stripprefix.prefixes=/zircuit-mainnet-op-reth-pruned/node
- traefik.http.services.zircuit-mainnet-op-reth-pruned-trace-node.loadbalancer.server.port=9545
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-reth-pruned-trace-node.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-reth-pruned-trace-node.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.zircuit-mainnet-op-reth-pruned-trace-node.rule=Host(`$DOMAIN`) && PathPrefix(`/zircuit-mainnet-op-reth-pruned/node`)}
- ${NO_SSL:+traefik.http.routers.zircuit-mainnet-op-reth-pruned-trace-node.rule=PathPrefix(`/zircuit-mainnet-op-reth-pruned/node`)}
- traefik.http.routers.zircuit-mainnet-op-reth-pruned-trace-node.middlewares=zircuit-mainnet-op-reth-pruned-trace-node-stripprefix, ipallowlist
volumes:
zircuit-mainnet-op-reth-pruned-trace:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: zircuit-mainnet
method-groups:
enabled:
- debug
- filter
- trace
methods:
disabled:
- name: eth_maxPriorityFeePerGas
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
- name: zirc_getQuarantineHistory
- name: zirc_getQuarantined
- name: zirc_isQuarantined
...

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,44 @@
{
"genesis": {
"l1": {
"hash": "0xf03d3d2e16e6d3512472719b04087404b9d229fd9319df354de978f9eac4b782",
"number": 25681768
},
"l2": {
"hash": "0x739969caccf91d17020409893e4ba2bb25957a1f80c8821322a2136eea0709b5",
"number": 32956468
},
"l2_time": 1785849151,
"system_config": {
"batcherAddr": "0xcf8225801df6ef90ad3bc86808f574403a309de8",
"overhead": "0x0000000000000000000000000000000000000000000000000000000000000000",
"scalar": "0x010000000000000000000000000000000000000000000000000d273000001db0",
"gasLimit": 30000000,
"eip1559Params": "0x0000000000000000",
"operatorFeeParams": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
},
"block_time": 2,
"max_sequencer_drift": 1800,
"seq_window_size": 3600,
"channel_timeout": 300,
"l1_chain_id": 1,
"l2_chain_id": 48900,
"regolith_time": 0,
"canyon_time": 0,
"delta_time": 0,
"ecotone_time": 0,
"fjord_time": 0,
"granite_time": 0,
"holocene_time": 0,
"isthmus_time": 0,
"batch_inbox_address": "0xff00000000000000000000000000000000048900",
"deposit_contract_address": "0x17bfafa932d2e23bd9b909fd5b4d2e2a27043fb1",
"l1_system_config_address": "0x30f82a1ca89226e8b8815d6ebb728e3b18a428ff",
"protocol_versions_address": "0x0000000000000000000000000000000000000000",
"chain_op_config": {
"eip1559Elasticity": 6,
"eip1559Denominator": 50,
"eip1559DenominatorCanyon": 250
}
}

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
polygon-amoy-archive: polygon-amoy-archive:
image: ${POLYGON_BOR_IMAGE:-0xpolygon/bor}:${POLYGON_AMOY_BOR_VERSION:-2.9.0} image: ${POLYGON_BOR_IMAGE:-0xpolygon/bor}:${POLYGON_AMOY_BOR_VERSION:-2.10.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
polygon-amoy: polygon-amoy:
image: ${POLYGON_BOR_IMAGE:-0xpolygon/bor}:${POLYGON_AMOY_BOR_VERSION:-2.9.0} image: ${POLYGON_BOR_IMAGE:-0xpolygon/bor}:${POLYGON_AMOY_BOR_VERSION:-2.10.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
polygon-mainnet-archive: polygon-mainnet-archive:
image: ${POLYGON_BOR_IMAGE:-0xpolygon/bor}:${POLYGON_MAINNET_BOR_VERSION:-2.9.0} image: ${POLYGON_BOR_IMAGE:-0xpolygon/bor}:${POLYGON_MAINNET_BOR_VERSION:-2.10.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services: services:
polygon-mainnet: polygon-mainnet:
image: ${POLYGON_BOR_IMAGE:-0xpolygon/bor}:${POLYGON_MAINNET_BOR_VERSION:-2.9.0} image: ${POLYGON_BOR_IMAGE:-0xpolygon/bor}:${POLYGON_MAINNET_BOR_VERSION:-2.10.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -143,7 +143,8 @@
"urls": [ "urls": [
"https://rpc-amoy.polygon.technology", "https://rpc-amoy.polygon.technology",
"https://polygon-amoy-bor-rpc.publicnode.com", "https://polygon-amoy-bor-rpc.publicnode.com",
"https://polygon-amoy.drpc.org" "https://polygon-amoy.drpc.org",
"https://rpc.satelink.network/rpc/amoy"
] ]
}, },
"arbitrum": { "arbitrum": {
@@ -157,6 +158,7 @@
"https://arb1.arbitrum.io/rpc", "https://arb1.arbitrum.io/rpc",
"https://arbitrum-one-rpc.publicnode.com", "https://arbitrum-one-rpc.publicnode.com",
"https://rpcfree.com/arbitrum-rpc", "https://rpcfree.com/arbitrum-rpc",
"https://rpc.satelink.network/rpc/arbitrum",
"https://arbitrum.drpc.org" "https://arbitrum.drpc.org"
] ]
}, },
@@ -216,6 +218,7 @@
"https://bsc-dataseed3.ninicoin.io", "https://bsc-dataseed3.ninicoin.io",
"https://bsc-dataseed4.ninicoin.io", "https://bsc-dataseed4.ninicoin.io",
"https://bsc-rpc.publicnode.com", "https://bsc-rpc.publicnode.com",
"https://bsc-rpc-public.chainpulse.cc",
"https://bsc.drpc.org" "https://bsc.drpc.org"
] ]
}, },
@@ -233,6 +236,7 @@
"https://data-seed-prebsc-1-s3.bnbchain.org:8545", "https://data-seed-prebsc-1-s3.bnbchain.org:8545",
"https://data-seed-prebsc-2-s3.bnbchain.org:8545", "https://data-seed-prebsc-2-s3.bnbchain.org:8545",
"https://bsc-testnet-rpc.publicnode.com", "https://bsc-testnet-rpc.publicnode.com",
"https://bsc-rpc-public.chainpulse.cc/testnet",
"https://bsc-testnet.drpc.org" "https://bsc-testnet.drpc.org"
] ]
}, },
@@ -305,6 +309,7 @@
"https://base-rpc.publicnode.com", "https://base-rpc.publicnode.com",
"https://rpcfree.com/base-rpc", "https://rpcfree.com/base-rpc",
"https://rpc.baseazul.dev", "https://rpc.baseazul.dev",
"https://rpc.satelink.network/rpc/base",
"https://base.drpc.org" "https://base.drpc.org"
] ]
}, },
@@ -3366,6 +3371,16 @@
"https://mova.drpc.org" "https://mova.drpc.org"
] ]
}, },
"mova-mainnet-v2": {
"protocol": "eth",
"id": 61901,
"block_time_ms": 2000,
"lagging_lag": 10,
"syncing_lag": 20,
"urls": [
"https://mova-mainnet-v2.drpc.org"
]
},
"mova-testnet": { "mova-testnet": {
"protocol": "eth", "protocol": "eth",
"id": 10323, "id": 10323,
@@ -3426,6 +3441,7 @@
"syncing_lag": 40, "syncing_lag": 40,
"urls": [ "urls": [
"https://rpc.testnet.chain.robinhood.com/rpc", "https://rpc.testnet.chain.robinhood.com/rpc",
"https://robinhood-sepolia-rpc.publicnode.com",
"https://robinhood-testnet.drpc.org" "https://robinhood-testnet.drpc.org"
] ]
}, },
@@ -3635,6 +3651,7 @@
"lagging_lag": 10, "lagging_lag": 10,
"syncing_lag": 20, "syncing_lag": 20,
"urls": [ "urls": [
"https://rpc.pharos.xyz",
"https://pharos.drpc.org" "https://pharos.drpc.org"
] ]
}, },
@@ -3720,6 +3737,7 @@
"lagging_lag": 20, "lagging_lag": 20,
"syncing_lag": 40, "syncing_lag": 40,
"urls": [ "urls": [
"https://humanity-main.g.alchemy.com/public",
"https://humanity.drpc.org" "https://humanity.drpc.org"
] ]
}, },
@@ -3818,6 +3836,60 @@
"https://neo-x-testnet.drpc.org" "https://neo-x-testnet.drpc.org"
] ]
}, },
"stellar": {
"protocol": "stellar",
"block_time_ms": 5000,
"lagging_lag": 10,
"syncing_lag": 20,
"urls": [
"https://stellar.drpc.org"
]
},
"stellar-testnet": {
"protocol": "stellar",
"block_time_ms": 5000,
"lagging_lag": 10,
"syncing_lag": 20,
"urls": [
"https://stellar-testnet.drpc.org"
]
},
"celestia": {
"protocol": "celestia",
"block_time_ms": 6000,
"lagging_lag": 5,
"syncing_lag": 10,
"urls": [
"https://celestia.drpc.org"
]
},
"celestia-mocha": {
"protocol": "celestia",
"block_time_ms": 6000,
"lagging_lag": 5,
"syncing_lag": 10,
"urls": [
"https://celestia-mocha.drpc.org"
]
},
"sui": {
"protocol": "sui",
"block_time_ms": 250,
"lagging_lag": 20,
"syncing_lag": 40,
"urls": [
"https://sui.drpc.org"
]
},
"sui-testnet": {
"protocol": "sui",
"block_time_ms": 250,
"lagging_lag": 20,
"syncing_lag": 40,
"urls": [
"https://sui-testnet.drpc.org"
]
},
"core-pigeon": { "core-pigeon": {
"id": 1114, "id": 1114,
"urls": [ "urls": [

View File

@@ -5,6 +5,137 @@
# survive every configure-drpc regeneration. See apply-dshackle-overrides.py. # survive every configure-drpc regeneration. See apply-dshackle-overrides.py.
[ -f /root/rpc/apply-dshackle-overrides.py ] && python3 /root/rpc/apply-dshackle-overrides.py [ -f /root/rpc/apply-dshackle-overrides.py ] && python3 /root/rpc/apply-dshackle-overrides.py
# --- Snapshot-based conditional gateway reconnect ---
# Operator ruling (2026-08-27): NEVER force a reconnect on a routine reload/rpc-update run.
# Only upstream REMOVALS or new disabled-method ADDITIONS require a gateway reconnect.
#
# For each dshackle container, we snapshot the advertised set:
# (a) upstream ids present in rendered yaml configs
# (b) disabled-method entries (from methods.disabled across all upstreams)
# into a persisted file: /root/rpc/.dshackle-adv-<container>.snapshot
#
# On each run:
# - Read current config state from disk
# - If previous snapshot exists, compare: drop connections ONLY IF
# * an upstream id disappeared (was in snapshot, not in current), OR
# * a new disabled-method entry appeared (in current, not in snapshot)
# - Pure additions or no change: reload only, no drop
# - First run with no prior snapshot: do NOT drop, just write snapshot after reload
# - Always rewrite snapshot after successful reload (for next run to compare against)
# - All snapshot/compare operations are best-effort; failures never fail the script
# Helper: extract the host config directory path for a dshackle container.
# dshackle containers mount their config at /etc/dshackle; we find the source of that mount.
get_config_dir() {
local cid="$1"
local mount
mount=$(docker inspect -f '{{range .Mounts}}{{if eq .Destination "/etc/dshackle"}}{{.Source}}{{end}}{{end}}' "$cid" 2>/dev/null) || true
[ -n "$mount" ] && echo "$mount" && return 0
# Fallback: try common locations (best-effort)
for d in /root/rpc/main_configs /root/rpc/free_configs; do
[ -d "$d" ] && echo "$d" && return 0
done
return 1
}
# Helper: extract advertised set (upstream ids + disabled methods) from config directory.
# Outputs two lines to stdout:
# upstream_ids (space-separated, sorted)
# disabled_methods (space-separated, sorted)
get_advertised_set() {
local config_dir="$1"
local upstream_ids=""
local disabled_methods=""
[ -d "$config_dir" ] || return 1
# Use python3 to parse YAML (available on host). Best-effort: if python fails, return empty.
python3 -c "
import yaml, glob, sys, os
config_dir = sys.argv[1]
upstream_ids = set()
disabled_methods = set()
for path in glob.glob(os.path.join(config_dir, '*.yaml')):
try:
with open(path) as f:
doc = yaml.safe_load(f)
if not isinstance(doc, dict):
continue
for up in doc.get('upstreams') or []:
if not isinstance(up, dict):
continue
uid = up.get('id')
if uid:
upstream_ids.add(uid)
methods = up.get('methods', {})
if isinstance(methods, dict):
for m in methods.get('disabled') or []:
if isinstance(m, dict):
name = m.get('name')
if name:
disabled_methods.add(name)
elif isinstance(m, str):
disabled_methods.add(m)
except Exception:
pass
print(' '.join(sorted(upstream_ids)))
print(' '.join(sorted(disabled_methods)))
" "$config_dir" 2>/dev/null
return 0
}
# Helper: read snapshot file. Returns upstream_ids and disabled_methods.
read_snapshot() {
local snapshot_file="$1"
[ -f "$snapshot_file" ] || return 1
local line1 line2
line1=$(head -1 "$snapshot_file" 2>/dev/null) || true
line2=$(tail -1 "$snapshot_file" 2>/dev/null) || true
[ -n "$line1" ] && echo "$line1"
[ -n "$line2" ] && echo "$line2"
return 0
}
# Helper: write snapshot file.
write_snapshot() {
local snapshot_file="$1"
local upstream_ids="$2"
local disabled_methods="$3"
echo "$upstream_ids" > "$snapshot_file" 2>/dev/null || true
echo "$disabled_methods" >> "$snapshot_file" 2>/dev/null || true
}
# Helper: check if drop is needed.
# Args: old_upstream_ids, old_disabled_methods, new_upstream_ids, new_disabled_methods
# Returns 0 (true) if drop is needed, 1 (false) otherwise.
drop_needed() {
local old_ids="$1" new_ids="$3"
local old_methods="$2" new_methods="$4"
# Check if any upstream id disappeared (in old, not in new)
for uid in $old_ids; do
[ -z "$uid" ] && continue
# Check if uid is NOT in new_ids
found=0
for nuid in $new_ids; do
[ "$uid" = "$nuid" ] && found=1 && break
done
[ "$found" = 0 ] && return 0 # drop needed
done
# Check if any new disabled method appeared (in new, not in old)
for meth in $new_methods; do
[ -z "$meth" ] && continue
found=0
for ometh in $old_methods; do
[ "$meth" = "$ometh" ] && found=1 && break
done
[ "$found" = 0 ] && return 0 # drop needed
done
return 1 # no drop needed
}
# 1:1 invariant (2026-07-15): refuse to ACTIVATE a dshackle config routing >1 node for the same # 1:1 invariant (2026-07-15): refuse to ACTIVATE a dshackle config routing >1 node for the same
# chain — we can't attribute traffic to multiple nodes behind one proxy (no per-upstream request # chain — we can't attribute traffic to multiple nodes behind one proxy (no per-upstream request
# metric; conn-seconds biases it), and the attribution model + planner assume 1:1. The validator # metric; conn-seconds biases it), and the attribution model + planner assume 1:1. The validator
@@ -37,6 +168,40 @@ RC=0
for CID in $(docker ps -q -f "name=dshackle"); do for CID in $(docker ps -q -f "name=dshackle"); do
NAME=$(docker inspect -f '{{.Name}}' "$CID" 2>/dev/null | sed 's|^/||') NAME=$(docker inspect -f '{{.Name}}' "$CID" 2>/dev/null | sed 's|^/||')
[ -n "$NAME" ] || NAME="$CID" [ -n "$NAME" ] || NAME="$CID"
# --- Snapshot-based conditional gateway reconnect ---
# Determine config directory and snapshot file for this container.
CONFIG_DIR=$(get_config_dir "$CID") || true
# Sanitize name for use in snapshot filename: replace / with -, remove leading -
SANITIZED_NAME=$(echo "$NAME" | tr '/' '-' | sed 's/^-//')
SNAPSHOT_FILE="/root/rpc/.dshackle-adv-${SANITIZED_NAME}.snapshot"
# Read current advertised set from the (new) on-disk config.
CURRENT_SET=$(get_advertised_set "$CONFIG_DIR") || true
CURRENT_UPSTREAMS=$(echo "$CURRENT_SET" | head -1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
CURRENT_METHODS=$(echo "$CURRENT_SET" | tail -1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
# Read previous snapshot if it exists.
PREVIOUS_UPSTREAMS=""
PREVIOUS_METHODS=""
HAS_PREVIOUS_SNAPSHOT=0
if [ -f "$SNAPSHOT_FILE" ]; then
PREVIOUS_SET=$(read_snapshot "$SNAPSHOT_FILE") || true
PREVIOUS_UPSTREAMS=$(echo "$PREVIOUS_SET" | head -1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
PREVIOUS_METHODS=$(echo "$PREVIOUS_SET" | tail -1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
HAS_PREVIOUS_SNAPSHOT=1
fi
# Decide if we need to drop connections: only if there were removals.
NEED_DROP=0
if [ "$HAS_PREVIOUS_SNAPSHOT" -eq 1 ]; then
# Has previous snapshot: check for removals
if drop_needed "$PREVIOUS_UPSTREAMS" "$PREVIOUS_METHODS" "$CURRENT_UPSTREAMS" "$CURRENT_METHODS"; then
NEED_DROP=1
fi
fi
# If no previous snapshot, NEED_DROP stays 0 (first run: do NOT drop)
T0=$(date +%s) T0=$(date +%s)
if ! docker kill --signal=HUP "$CID" >/dev/null 2>&1; then if ! docker kill --signal=HUP "$CID" >/dev/null 2>&1; then
echo "reload_dshackle: WARNING: failed to SIGHUP $NAME" >&2 echo "reload_dshackle: WARNING: failed to SIGHUP $NAME" >&2
@@ -51,7 +216,20 @@ for CID in $(docker ps -q -f "name=dshackle"); do
elif echo "$LOGS" | grep -qF "$DROP_MARK"; then elif echo "$LOGS" | grep -qF "$DROP_MARK"; then
REASON="concurrent HUP dropped (reload skipped)" REASON="concurrent HUP dropped (reload skipped)"
fi fi
[ -z "$REASON" ] && continue # SIGHUP applied the config — done [ -z "$REASON" ] && {
# Reload succeeded. Always rewrite snapshot for next run.
write_snapshot "$SNAPSHOT_FILE" "$CURRENT_UPSTREAMS" "$CURRENT_METHODS"
# Drop established gateway gRPC connections ONLY if removals were detected.
if [ "$NEED_DROP" -eq 1 ]; then
PID=$(docker inspect -f '{{.State.Pid}}' "$CID" 2>/dev/null) && \
nsenter -t "$PID" -n ss -K state established '( sport = :2449 )' >/dev/null 2>&1
echo "reload_dshackle: $NAME reload applied, gateway connections dropped (removals detected)" >&2
else
echo "reload_dshackle: $NAME reload applied, no removals — gateway connections kept" >&2
fi
continue
}
echo "reload_dshackle: $NAME reload did NOT apply ($REASON) — restarting to load config fresh" >&2 echo "reload_dshackle: $NAME reload did NOT apply ($REASON) — restarting to load config fresh" >&2
if ! docker restart "$CID" >/dev/null 2>&1; then if ! docker restart "$CID" >/dev/null 2>&1; then
echo "reload_dshackle: ERROR: restart failed for $NAME — config NOT applied, manual intervention" >&2 echo "reload_dshackle: ERROR: restart failed for $NAME — config NOT applied, manual intervention" >&2
@@ -64,7 +242,15 @@ for CID in $(docker ps -q -f "name=dshackle"); do
sleep 2 sleep 2
done done
if [ -n "$UP" ]; then if [ -n "$UP" ]; then
# Restart succeeded. Always rewrite snapshot for next run.
write_snapshot "$SNAPSHOT_FILE" "$CURRENT_UPSTREAMS" "$CURRENT_METHODS"
echo "reload_dshackle: $NAME restarted, config applied on clean start" >&2 echo "reload_dshackle: $NAME restarted, config applied on clean start" >&2
# On restart, the config is freshly loaded, so we need to drop if removals were detected.
if [ "$NEED_DROP" -eq 1 ]; then
PID=$(docker inspect -f '{{.State.Pid}}' "$CID" 2>/dev/null) && \
nsenter -t "$PID" -n ss -K state established '( sport = :2449 )' >/dev/null 2>&1
echo "reload_dshackle: $NAME restart applied, gateway connections dropped (removals detected)" >&2
fi
else else
echo "reload_dshackle: ERROR: $NAME not running after restart — manual intervention" >&2 echo "reload_dshackle: ERROR: $NAME not running after restart — manual intervention" >&2
RC=1 RC=1

View File

@@ -56,7 +56,7 @@ services:
- DEPLOYMENT=test - DEPLOYMENT=test
- ETHSTATS_ENDPOINT=d${DOMAIN}:WSyDMrhRBe111@ronin-stats-ws.roninchain.com:443 - ETHSTATS_ENDPOINT=d${DOMAIN}:WSyDMrhRBe111@ronin-stats-ws.roninchain.com:443
- MINE=false - MINE=false
- NETWORK_ID=2021 - NETWORK_ID=202601
- NETWORK_PORT=12612 - NETWORK_PORT=12612
- PASSWORD=stupidpassword - PASSWORD=stupidpassword
- STATE_SCHEME=hash - STATE_SCHEME=hash
@@ -110,7 +110,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: chain: ronin-saigon
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -56,7 +56,7 @@ services:
- DEPLOYMENT=test - DEPLOYMENT=test
- ETHSTATS_ENDPOINT=d${DOMAIN}:WSyDMrhRBe111@ronin-stats-ws.roninchain.com:443 - ETHSTATS_ENDPOINT=d${DOMAIN}:WSyDMrhRBe111@ronin-stats-ws.roninchain.com:443
- MINE=false - MINE=false
- NETWORK_ID=2021 - NETWORK_ID=202601
- NETWORK_PORT=10493 - NETWORK_PORT=10493
- PASSWORD=stupidpassword - PASSWORD=stupidpassword
- STATE_SCHEME=hash - STATE_SCHEME=hash
@@ -110,7 +110,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: chain: ronin-saigon
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -56,7 +56,7 @@ services:
- DEPLOYMENT=test - DEPLOYMENT=test
- ETHSTATS_ENDPOINT=d${DOMAIN}:WSyDMrhRBe111@ronin-stats-ws.roninchain.com:443 - ETHSTATS_ENDPOINT=d${DOMAIN}:WSyDMrhRBe111@ronin-stats-ws.roninchain.com:443
- MINE=false - MINE=false
- NETWORK_ID=2021 - NETWORK_ID=202601
- NETWORK_PORT=13559 - NETWORK_PORT=13559
- PASSWORD=stupidpassword - PASSWORD=stupidpassword
- STATE_SCHEME=path - STATE_SCHEME=path
@@ -110,7 +110,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: chain: ronin-saigon
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -126,7 +126,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: sonic-testnet chain: sonic-testnet-v2
method-groups: method-groups:
enabled: enabled:
- debug - debug

View File

@@ -126,7 +126,7 @@ x-upstreams:
frameSize: 20Mb frameSize: 20Mb
msgSize: 50Mb msgSize: 50Mb
url: $${WS_URL} url: $${WS_URL}
chain: sonic-testnet chain: sonic-testnet-v2
method-groups: method-groups:
enabled: enabled:
- debug - debug

15
tac/scripts/init.sh Executable file → Normal file
View File

@@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
# tacchaind entrypoint — TAC (Cosmos-SDK + embedded EVM). Genesis replay is impractical # tacchaind entrypoint — TAC (Cosmos-SDK + embedded EVM). EVM JSON-RPC :8545/:8546
# (5 gov upgrades), so fresh nodes statesync near head via cometbft-common.sh. # is the dshackle/traefik upstream; CometBFT :26657 / gRPC :9090 / REST :1317 are NOT
# publicly exposed. Genesis replay is impractical (5 gov upgrades), so fresh nodes
# statesync near head via cometbft-common.sh.
set -e set -e
. /usr/local/bin/cometbft-common.sh . /usr/local/bin/cometbft-common.sh
@@ -12,6 +14,8 @@ STATESYNC_RPC="${STATESYNC_RPC:-https://tacchain-rpc.polkachu.com:443}"
MIN_GAS="${MIN_GAS:-25000000000utac}" MIN_GAS="${MIN_GAS:-25000000000utac}"
API="${API:-eth,net,web3,txpool,debug}" API="${API:-eth,net,web3,txpool,debug}"
MONIKER="${MONIKER:-rpc-node}" MONIKER="${MONIKER:-rpc-node}"
# Pruning mode: set to "nothing" for archive nodes, "default" for pruned nodes.
PRUNING="${PRUNING:-default}"
ct_apk curl jq ct_apk curl jq
@@ -24,7 +28,10 @@ else
ct_log "already initialized, continuing" ct_log "already initialized, continuing"
fi fi
# Serve CometBFT RPC on all interfaces (dshackle/traefik upstream); default is 127.0.0.1. # Set pruning mode in app.toml (nothing for archive, default for pruned).
sed -i -e "s/^pruning *=.*/pruning = \"$PRUNING\"/" "$CONFIG_DIR/app.toml"
# Serve CometBFT RPC on all interfaces (internal only); default is 127.0.0.1.
sed -i '/^\[rpc\]/,/^\[/{s|^laddr = .*|laddr = "tcp://0.0.0.0:26657"|}' "$CONFIG_DIR/config.toml" sed -i '/^\[rpc\]/,/^\[/{s|^laddr = .*|laddr = "tcp://0.0.0.0:26657"|}' "$CONFIG_DIR/config.toml"
ct_patch_p2p "$CONFIG_DIR/config.toml" "$IP" "${P2P_PORT:-26656}" ct_patch_p2p "$CONFIG_DIR/config.toml" "$IP" "${P2P_PORT:-26656}"
@@ -41,4 +48,4 @@ sed -i "/^\[json-rpc\]/,/^\[/{s|^api = .*|api = \"$API\"|}" "$CONFIG_DIR/app.tom
ct_seed_priv_validator_state "$HOME_DIR" ct_seed_priv_validator_state "$HOME_DIR"
exec tacchaind start --chain-id="$CHAIN_ID" --pruning=default --json-rpc.enable --home "$HOME_DIR" "$@" exec tacchaind start --chain-id="$CHAIN_ID" --json-rpc.enable --home "$HOME_DIR" "$@"

View File

@@ -1,38 +1,43 @@
# tacchaind — source build mirroring upstream TacBuild/tacchain Dockerfile (v1.6.0). # tacchaind — binary download from GitHub releases (v1.6.0).
# Downloads pre-built linux-amd64 binary and verifies against checksums.txt.
ARG VERSION=v1.6.0 ARG VERSION=v1.6.0
FROM golang:1.23.8-alpine3.21 AS go-builder
ARG VERSION
RUN apk add --no-cache \
ca-certificates \
build-base \
git \
libusb-dev \
linux-headers \
eudev-dev
WORKDIR /code
RUN git clone https://github.com/TacBuild/tacchain.git /code && \
cd /code && \
git checkout "${VERSION}" && \
LEDGER_ENABLED=true make build
FROM alpine:3.21 FROM alpine:3.21
RUN apk upgrade --no-cache && \ RUN apk upgrade --no-cache && \
apk add --no-cache \ apk add --no-cache \
ca-certificates \ ca-certificates \
libusb curl \
libusb \
sed
# Download binary and checksums
ARG VERSION
RUN set -eux; \
BINARY_URL="https://github.com/TacBuild/tacchain/releases/download/${VERSION}/tacchaind-linux-amd64" && \
CHECKSUMS_URL="https://github.com/TacBuild/tacchain/releases/download/${VERSION}/checksums.txt" && \
curl -sL -o /tmp/tacchaind "${BINARY_URL}" && \
curl -sL -o /tmp/checksums.txt "${CHECKSUMS_URL}" && \
# Verify the binary against checksums.txt (sha256sum format: <hash> <filename>)
cd /tmp && \
ExpectedHash=$(grep "tacchaind-linux-amd64$" checksums.txt | awk '{print $1}') && \
ActualHash=$(sha256sum tacchaind | awk '{print $1}') && \
if [ "$ExpectedHash" != "$ActualHash" ]; then \
echo "ERROR: checksum mismatch for tacchaind-linux-amd64" >&2; \
echo " Expected: $ExpectedHash" >&2; \
echo " Actual: $ActualHash" >&2; \
exit 1; \
fi && \
chmod +x /tmp/tacchaind && \
mv /tmp/tacchaind /usr/bin/tacchaind && \
rm -f /tmp/checksums.txt
COPY --from=go-builder /code/build/tacchaind /usr/bin/tacchaind
COPY ./scripts/cometbft-common.sh /usr/local/bin/cometbft-common.sh COPY ./scripts/cometbft-common.sh /usr/local/bin/cometbft-common.sh
COPY ./scripts/init.sh /usr/local/bin/init.sh COPY ./scripts/init.sh /usr/local/bin/init.sh
RUN chmod +x /usr/local/bin/init.sh /usr/local/bin/cometbft-common.sh RUN chmod +x /usr/local/bin/init.sh /usr/local/bin/cometbft-common.sh
WORKDIR /opt WORKDIR /opt
EXPOSE 1317 26656 26657 EXPOSE 1317 26656 26657 8545 8546
ENTRYPOINT ["init.sh"] ENTRYPOINT ["init.sh"]

View File

@@ -0,0 +1,130 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:tac/tacchaind/tac-mainnet-tacchaind-archive.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/tac-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
tac-mainnet-archive:
build:
context: ./tac
dockerfile: tacchaind.Dockerfile
args:
VERSION: ${TAC_MAINNET_TACCHAIND_VERSION:-v1.6.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 11030:11030
- 11030:11030/udp
expose:
- 8545
- 8546
- 6065
environment:
- API=eth,net,web3,txpool,debug
- CHAIN_ID=tacchain_239-1
- GENESIS_URL=https://raw.githubusercontent.com/TacBuild/tacchain/refs/heads/main/networks/tacchain_239-1/genesis.json
- IP=${IP}
- MIN_GAS=25000000000utac
- MONIKER=d${DOMAIN:-local}
- P2P_PORT=11030
- PERSISTENT_PEERS=68b409519dea2a057d93ab6df436f6d519f13cb8@65.109.61.125:32156,54646e966938882d244a7dfd5aa90deb0cbae102@46.37.123.228:26656,d957eca9e06978956bca65a74d5df13ca858b3ec@209.192.185.53:26656,61bcffa521f20daea439e1560a282a6c6d13382a@136.243.54.160:26656,6224e4d06ace6591af55ffc9e033c1fd8492acf7@40.160.23.137:26656,4594eda1e728c1499801346fd99198e2f7c076dc@3.37.85.69:26656
- PRUNING=nothing
- SEEDS=68b409519dea2a057d93ab6df436f6d519f13cb8@65.109.61.125:32156,54646e966938882d244a7dfd5aa90deb0cbae102@46.37.123.228:26656,d957eca9e06978956bca65a74d5df13ca858b3ec@209.192.185.53:26656,61bcffa521f20daea439e1560a282a6c6d13382a@136.243.54.160:26656,6224e4d06ace6591af55ffc9e033c1fd8492acf7@40.160.23.137:26656,4594eda1e728c1499801346fd99198e2f7c076dc@3.37.85.69:26656
- STATESYNC_RPC=https://tacchain-rpc.polkachu.com:443
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${TAC_MAINNET_TACCHAIND_ARCHIVE_DATA:-tac-mainnet-tacchaind-archive}:/root/.tacchaind/data
- /slowdisk:/slowdisk
- tac-mainnet-tacchaind-archive_config:/root/.tacchaind/config
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6065
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.tac-mainnet-tacchaind-archive-stripprefix.stripprefix.prefixes=/tac-mainnet-archive
- traefik.http.services.tac-mainnet-tacchaind-archive.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-archive.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-archive.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-archive.rule=Host(`$DOMAIN`) && (Path(`/tac-mainnet-archive`) || Path(`/tac-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.tac-mainnet-tacchaind-archive.rule=Path(`/tac-mainnet-archive`) || Path(`/tac-mainnet-archive/`)}
- traefik.http.routers.tac-mainnet-tacchaind-archive.middlewares=tac-mainnet-tacchaind-archive-stripprefix, ipallowlist
- traefik.http.routers.tac-mainnet-tacchaind-archive.priority=50 # gets any request that is not GET with UPGRADE header
- traefik.http.routers.tac-mainnet-tacchaind-archive-ws.priority=100 # answers GET requests first
- traefik.http.middlewares.tac-mainnet-tacchaind-archive-set-ws-path.replacepath.path=/websocket
- traefik.http.services.tac-mainnet-tacchaind-archive-ws.loadbalancer.server.port=8546
- traefik.http.routers.tac-mainnet-tacchaind-archive-ws.service=tac-mainnet-tacchaind-archive-ws
- traefik.http.routers.tac-mainnet-tacchaind-archive.service=tac-mainnet-tacchaind-archive
- ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-archive-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-archive-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-archive-ws.rule=Host(`$DOMAIN`) && (Path(`/tac-mainnet-archive`) || Path(`/tac-mainnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.tac-mainnet-tacchaind-archive-ws.rule=(Path(`/tac-mainnet-archive`) || Path(`/tac-mainnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.tac-mainnet-tacchaind-archive-ws.middlewares=tac-mainnet-tacchaind-archive-stripprefix, tac-mainnet-tacchaind-archive-set-ws-path, ipallowlist
volumes:
tac-mainnet-tacchaind-archive:
tac-mainnet-tacchaind-archive_config:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: tac
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -53,7 +53,8 @@ services:
- 10283:10283 - 10283:10283
- 10283:10283/udp - 10283:10283/udp
expose: expose:
- 26657 - 8545
- 8546
- 6065 - 6065
environment: environment:
- API=eth,net,web3,txpool,debug - API=eth,net,web3,txpool,debug
@@ -63,8 +64,9 @@ services:
- MIN_GAS=25000000000utac - MIN_GAS=25000000000utac
- MONIKER=d${DOMAIN:-local} - MONIKER=d${DOMAIN:-local}
- P2P_PORT=10283 - P2P_PORT=10283
- PERSISTENT_PEERS=68b409519dea2a057d93ab6df436f6d519f13cb8@65.109.61.125:32156,186e207d2c95e94a44ff613770aa269dac876013@65.108.201.240:32156,c4410e765acead36188500ed75d5666aa209c93d@65.108.205.121:32156 - PERSISTENT_PEERS=68b409519dea2a057d93ab6df436f6d519f13cb8@65.109.61.125:32156,54646e966938882d244a7dfd5aa90deb0cbae102@46.37.123.228:26656,d957eca9e06978956bca65a74d5df13ca858b3ec@209.192.185.53:26656,61bcffa521f20daea439e1560a282a6c6d13382a@136.243.54.160:26656,6224e4d06ace6591af55ffc9e033c1fd8492acf7@40.160.23.137:26656,4594eda1e728c1499801346fd99198e2f7c076dc@3.37.85.69:26656
- SEEDS=68b409519dea2a057d93ab6df436f6d519f13cb8@65.109.61.125:32156 - PRUNING=default
- SEEDS=68b409519dea2a057d93ab6df436f6d519f13cb8@65.109.61.125:32156,54646e966938882d244a7dfd5aa90deb0cbae102@46.37.123.228:26656,d957eca9e06978956bca65a74d5df13ca858b3ec@209.192.185.53:26656,61bcffa521f20daea439e1560a282a6c6d13382a@136.243.54.160:26656,6224e4d06ace6591af55ffc9e033c1fd8492acf7@40.160.23.137:26656,4594eda1e728c1499801346fd99198e2f7c076dc@3.37.85.69:26656
- STATESYNC_RPC=https://tacchain-rpc.polkachu.com:443 - STATESYNC_RPC=https://tacchain-rpc.polkachu.com:443
restart: unless-stopped restart: unless-stopped
stop_grace_period: 5m stop_grace_period: 5m
@@ -81,7 +83,7 @@ services:
- prometheus-scrape.path=/metrics - prometheus-scrape.path=/metrics
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.tac-mainnet-tacchaind-pruned-stripprefix.stripprefix.prefixes=/tac-mainnet - traefik.http.middlewares.tac-mainnet-tacchaind-pruned-stripprefix.stripprefix.prefixes=/tac-mainnet
- traefik.http.services.tac-mainnet-tacchaind-pruned.loadbalancer.server.port=26657 - traefik.http.services.tac-mainnet-tacchaind-pruned.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-pruned.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-pruned.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-pruned.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-pruned.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-pruned.rule=Host(`$DOMAIN`) && (Path(`/tac-mainnet`) || Path(`/tac-mainnet/`))} - ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-pruned.rule=Host(`$DOMAIN`) && (Path(`/tac-mainnet`) || Path(`/tac-mainnet/`))}
@@ -90,7 +92,7 @@ services:
- traefik.http.routers.tac-mainnet-tacchaind-pruned.priority=50 # gets any request that is not GET with UPGRADE header - traefik.http.routers.tac-mainnet-tacchaind-pruned.priority=50 # gets any request that is not GET with UPGRADE header
- traefik.http.routers.tac-mainnet-tacchaind-pruned-ws.priority=100 # answers GET requests first - traefik.http.routers.tac-mainnet-tacchaind-pruned-ws.priority=100 # answers GET requests first
- traefik.http.middlewares.tac-mainnet-tacchaind-pruned-set-ws-path.replacepath.path=/websocket - traefik.http.middlewares.tac-mainnet-tacchaind-pruned-set-ws-path.replacepath.path=/websocket
- traefik.http.services.tac-mainnet-tacchaind-pruned-ws.loadbalancer.server.port=26657 - traefik.http.services.tac-mainnet-tacchaind-pruned-ws.loadbalancer.server.port=8546
- traefik.http.routers.tac-mainnet-tacchaind-pruned-ws.service=tac-mainnet-tacchaind-pruned-ws - traefik.http.routers.tac-mainnet-tacchaind-pruned-ws.service=tac-mainnet-tacchaind-pruned-ws
- traefik.http.routers.tac-mainnet-tacchaind-pruned.service=tac-mainnet-tacchaind-pruned - traefik.http.routers.tac-mainnet-tacchaind-pruned.service=tac-mainnet-tacchaind-pruned
- ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-pruned-ws.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.tac-mainnet-tacchaind-pruned-ws.entrypoints=websecure}

View File

@@ -0,0 +1,129 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Usage:
#
# mkdir rpc && cd rpc
#
# git init
# git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git
# git fetch origin vibe
# git checkout origin/vibe
#
# docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret
#
# env
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:tac/tacchaind/tac-spb-tacchaind-archive.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/tac-spb-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
tac-spb-archive:
build:
context: ./tac
dockerfile: tacchaind.Dockerfile
args:
VERSION: ${TAC_SPB_TACCHAIND_VERSION:-v1.6.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 11180:11180
- 11180:11180/udp
expose:
- 8545
- 8546
- 6065
environment:
- API=eth,net,web3,txpool,debug
- CHAIN_ID=tacchain_2391-1
- GENESIS_URL=https://raw.githubusercontent.com/TacBuild/tacchain/refs/heads/main/networks/tacchain_2391-1/genesis.json
- IP=${IP}
- MIN_GAS=25000000000utac
- MONIKER=d${DOMAIN:-local}
- P2P_PORT=11180
- PERSISTENT_PEERS=9c32b3b959a2427bd2aa064f8c9a8efebdad4c23@206.217.210.164:45130,04a2152eed9f73dc44779387a870ea6480c41fe7@206.217.210.164:45140,5aaaf8140262d7416ac53abe4e0bd13b0f582168@23.92.177.41:45110,ddb3e8b8f4d051e914686302dafc2a73adf9b0d2@23.92.177.41:45120
- PRUNING=nothing
- STATESYNC_RPC=https://spb.tendermint.rpc.tac.build
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${TAC_SPB_TACCHAIND_ARCHIVE_DATA:-tac-spb-tacchaind-archive}:/root/.tacchaind/data
- /slowdisk:/slowdisk
- tac-spb-tacchaind-archive_config:/root/.tacchaind/config
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6065
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.tac-spb-tacchaind-archive-stripprefix.stripprefix.prefixes=/tac-spb-archive
- traefik.http.services.tac-spb-tacchaind-archive.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-archive.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-archive.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-archive.rule=Host(`$DOMAIN`) && (Path(`/tac-spb-archive`) || Path(`/tac-spb-archive/`))}
- ${NO_SSL:+traefik.http.routers.tac-spb-tacchaind-archive.rule=Path(`/tac-spb-archive`) || Path(`/tac-spb-archive/`)}
- traefik.http.routers.tac-spb-tacchaind-archive.middlewares=tac-spb-tacchaind-archive-stripprefix, ipallowlist
- traefik.http.routers.tac-spb-tacchaind-archive.priority=50 # gets any request that is not GET with UPGRADE header
- traefik.http.routers.tac-spb-tacchaind-archive-ws.priority=100 # answers GET requests first
- traefik.http.middlewares.tac-spb-tacchaind-archive-set-ws-path.replacepath.path=/websocket
- traefik.http.services.tac-spb-tacchaind-archive-ws.loadbalancer.server.port=8546
- traefik.http.routers.tac-spb-tacchaind-archive-ws.service=tac-spb-tacchaind-archive-ws
- traefik.http.routers.tac-spb-tacchaind-archive.service=tac-spb-tacchaind-archive
- ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-archive-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-archive-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-archive-ws.rule=Host(`$DOMAIN`) && (Path(`/tac-spb-archive`) || Path(`/tac-spb-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.tac-spb-tacchaind-archive-ws.rule=(Path(`/tac-spb-archive`) || Path(`/tac-spb-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.tac-spb-tacchaind-archive-ws.middlewares=tac-spb-tacchaind-archive-stripprefix, tac-spb-tacchaind-archive-set-ws-path, ipallowlist
volumes:
tac-spb-tacchaind-archive:
tac-spb-tacchaind-archive_config:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: tac-spb
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -53,7 +53,8 @@ services:
- 14331:14331 - 14331:14331
- 14331:14331/udp - 14331:14331/udp
expose: expose:
- 26657 - 8545
- 8546
- 6065 - 6065
environment: environment:
- API=eth,net,web3,txpool,debug - API=eth,net,web3,txpool,debug
@@ -64,6 +65,7 @@ services:
- MONIKER=d${DOMAIN:-local} - MONIKER=d${DOMAIN:-local}
- P2P_PORT=14331 - P2P_PORT=14331
- PERSISTENT_PEERS=9c32b3b959a2427bd2aa064f8c9a8efebdad4c23@206.217.210.164:45130,04a2152eed9f73dc44779387a870ea6480c41fe7@206.217.210.164:45140,5aaaf8140262d7416ac53abe4e0bd13b0f582168@23.92.177.41:45110,ddb3e8b8f4d051e914686302dafc2a73adf9b0d2@23.92.177.41:45120 - PERSISTENT_PEERS=9c32b3b959a2427bd2aa064f8c9a8efebdad4c23@206.217.210.164:45130,04a2152eed9f73dc44779387a870ea6480c41fe7@206.217.210.164:45140,5aaaf8140262d7416ac53abe4e0bd13b0f582168@23.92.177.41:45110,ddb3e8b8f4d051e914686302dafc2a73adf9b0d2@23.92.177.41:45120
- PRUNING=default
- STATESYNC_RPC=https://spb.tendermint.rpc.tac.build - STATESYNC_RPC=https://spb.tendermint.rpc.tac.build
restart: unless-stopped restart: unless-stopped
stop_grace_period: 5m stop_grace_period: 5m
@@ -80,7 +82,7 @@ services:
- prometheus-scrape.path=/metrics - prometheus-scrape.path=/metrics
- traefik.enable=true - traefik.enable=true
- traefik.http.middlewares.tac-spb-tacchaind-pruned-stripprefix.stripprefix.prefixes=/tac-spb - traefik.http.middlewares.tac-spb-tacchaind-pruned-stripprefix.stripprefix.prefixes=/tac-spb
- traefik.http.services.tac-spb-tacchaind-pruned.loadbalancer.server.port=26657 - traefik.http.services.tac-spb-tacchaind-pruned.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-pruned.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-pruned.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-pruned.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-pruned.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-pruned.rule=Host(`$DOMAIN`) && (Path(`/tac-spb`) || Path(`/tac-spb/`))} - ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-pruned.rule=Host(`$DOMAIN`) && (Path(`/tac-spb`) || Path(`/tac-spb/`))}
@@ -89,7 +91,7 @@ services:
- traefik.http.routers.tac-spb-tacchaind-pruned.priority=50 # gets any request that is not GET with UPGRADE header - traefik.http.routers.tac-spb-tacchaind-pruned.priority=50 # gets any request that is not GET with UPGRADE header
- traefik.http.routers.tac-spb-tacchaind-pruned-ws.priority=100 # answers GET requests first - traefik.http.routers.tac-spb-tacchaind-pruned-ws.priority=100 # answers GET requests first
- traefik.http.middlewares.tac-spb-tacchaind-pruned-set-ws-path.replacepath.path=/websocket - traefik.http.middlewares.tac-spb-tacchaind-pruned-set-ws-path.replacepath.path=/websocket
- traefik.http.services.tac-spb-tacchaind-pruned-ws.loadbalancer.server.port=26657 - traefik.http.services.tac-spb-tacchaind-pruned-ws.loadbalancer.server.port=8546
- traefik.http.routers.tac-spb-tacchaind-pruned-ws.service=tac-spb-tacchaind-pruned-ws - traefik.http.routers.tac-spb-tacchaind-pruned-ws.service=tac-spb-tacchaind-pruned-ws
- traefik.http.routers.tac-spb-tacchaind-pruned.service=tac-spb-tacchaind-pruned - traefik.http.routers.tac-spb-tacchaind-pruned.service=tac-spb-tacchaind-pruned
- ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-pruned-ws.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.tac-spb-tacchaind-pruned-ws.entrypoints=websecure}

View File

@@ -32,7 +32,7 @@ x-logging-defaults: &logging-defaults
services: services:
tempo-mainnet-reth-init: tempo-mainnet-reth-init:
image: ${TEMPO_RETH_IMAGE:-ghcr.io/tempoxyz/tempo}:${TEMPO_CONSENSUS_KEYGEN_VERSION:-1.10.2} image: ${TEMPO_RETH_IMAGE:-ghcr.io/tempoxyz/tempo}:${TEMPO_CONSENSUS_KEYGEN_VERSION:-1.12.0}
entrypoint: [/bin/sh, -c] entrypoint: [/bin/sh, -c]
command: command:
- if [ ! -f /secrets/validator_key.json ]; then tempo consensus generate-signing-key --output /secrets/validator_key.json; fi - if [ ! -f /secrets/validator_key.json ]; then tempo consensus generate-signing-key --output /secrets/validator_key.json; fi
@@ -44,7 +44,7 @@ services:
logging: *logging-defaults logging: *logging-defaults
tempo-mainnet-reth: tempo-mainnet-reth:
image: ${TEMPO_RETH_IMAGE:-ghcr.io/tempoxyz/tempo}:${TEMPO_MAINNET_RETH_VERSION:-1.10.2} image: ${TEMPO_RETH_IMAGE:-ghcr.io/tempoxyz/tempo}:${TEMPO_MAINNET_RETH_VERSION:-1.12.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -32,7 +32,7 @@ x-logging-defaults: &logging-defaults
services: services:
tempo-mainnet-reth-pruned-init: tempo-mainnet-reth-pruned-init:
image: ${TEMPO_RETH_IMAGE:-ghcr.io/tempoxyz/tempo}:${TEMPO_CONSENSUS_KEYGEN_VERSION:-1.10.2} image: ${TEMPO_RETH_IMAGE:-ghcr.io/tempoxyz/tempo}:${TEMPO_CONSENSUS_KEYGEN_VERSION:-1.12.0}
entrypoint: [/bin/sh, -c] entrypoint: [/bin/sh, -c]
command: command:
- if [ ! -f /secrets/validator_key.json ]; then tempo consensus generate-signing-key --output /secrets/validator_key.json; fi - if [ ! -f /secrets/validator_key.json ]; then tempo consensus generate-signing-key --output /secrets/validator_key.json; fi
@@ -44,7 +44,7 @@ services:
logging: *logging-defaults logging: *logging-defaults
tempo-mainnet-reth-pruned: tempo-mainnet-reth-pruned:
image: ${TEMPO_RETH_IMAGE:-ghcr.io/tempoxyz/tempo}:${TEMPO_MAINNET_RETH_VERSION:-1.10.2} image: ${TEMPO_RETH_IMAGE:-ghcr.io/tempoxyz/tempo}:${TEMPO_MAINNET_RETH_VERSION:-1.12.0}
sysctls: sysctls:
# TCP Performance # TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -35,7 +35,7 @@ services:
context: ./zero-gravity context: ./zero-gravity
dockerfile: zerog.Dockerfile dockerfile: zerog.Dockerfile
args: args:
ZERO_GRAVITY_VERSION: ${ZERO_GRAVITY_ARISTOTLE_ZEROG_VERSION:-3.0.3} ZERO_GRAVITY_VERSION: ${ZERO_GRAVITY_ARISTOTLE_ZEROG_VERSION:-1.0.6}
ZERO_GRAVITY_CHAIN_SPEC: aristotle ZERO_GRAVITY_CHAIN_SPEC: aristotle
sysctls: sysctls:
# TCP Performance # TCP Performance
@@ -118,7 +118,7 @@ services:
context: ./zero-gravity context: ./zero-gravity
dockerfile: zerog.Dockerfile dockerfile: zerog.Dockerfile
args: args:
ZERO_GRAVITY_VERSION: ${ZERO_GRAVITY_ARISTOTLE_ZEROG_VERSION:-3.0.3} ZERO_GRAVITY_VERSION: ${ZERO_GRAVITY_ARISTOTLE_ZEROG_VERSION:-1.0.6}
ZERO_GRAVITY_CHAIN_SPEC: aristotle ZERO_GRAVITY_CHAIN_SPEC: aristotle
ports: ports:
- 19914:19914 - 19914:19914

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults x-logging-defaults: &logging-defaults
driver: json-file driver: json-file
options: options:
max-size: "10m" max-size: "512m"
max-file: "3" max-file: "2"
# this snapshots works https://services.shachopra.com/zero-gravity-galileo-testnet/0g-validator-snapshot # this snapshots works https://services.shachopra.com/zero-gravity-galileo-testnet/0g-validator-snapshot
# Usage: # Usage:
@@ -35,7 +35,7 @@ services:
context: ./zero-gravity context: ./zero-gravity
dockerfile: zerog.Dockerfile dockerfile: zerog.Dockerfile
args: args:
ZERO_GRAVITY_VERSION: ${ZERO_GRAVITY_GALILEO_ZEROG_VERSION:-3.0.3} ZERO_GRAVITY_VERSION: ${ZERO_GRAVITY_GALILEO_ZEROG_VERSION:-3.0.8}
ZERO_GRAVITY_CHAIN_SPEC: galileo ZERO_GRAVITY_CHAIN_SPEC: galileo
sysctls: sysctls:
# TCP Performance # TCP Performance
@@ -62,7 +62,7 @@ services:
- CHAIN_NAME=galileo - CHAIN_NAME=galileo
entrypoint: [/usr/local/bin/init.sh, geth] entrypoint: [/usr/local/bin/init.sh, geth]
command: command:
- --bootnodes=enode://de7b86d8ac452b1413983049c20eafa2ea0851a3219c2cc12649b971c1677bd83fe24c5331e078471e52a94d95e8cde84cb9d866574fec957124e57ac6056699@8.218.88.60:30303 - --bootnodes=enode://4c94b9ab893ee17f58505b48b53d6c02d52bd5567e5fc6c028a29ad25ce1d553286a7fe3a6c051ba18c466b196762ab0e92695d6abbaf7f70afcca2e165bca8c@34.82.252.10:30303
- --config /0g/geth-config.toml - --config /0g/geth-config.toml
- --datadir=/root/.ethereum - --datadir=/root/.ethereum
- --db.engine=pebble - --db.engine=pebble
@@ -72,7 +72,7 @@ services:
- --metrics.addr=0.0.0.0 - --metrics.addr=0.0.0.0
- --metrics.port=6060 - --metrics.port=6060
- --nat=extip:${IP} - --nat=extip:${IP}
- --networkid=16601 - --networkid=16602
- --port=11172 - --port=11172
- --rpc.gascap=600000000 - --rpc.gascap=600000000
- --rpc.txfeecap=0 - --rpc.txfeecap=0
@@ -118,7 +118,7 @@ services:
context: ./zero-gravity context: ./zero-gravity
dockerfile: zerog.Dockerfile dockerfile: zerog.Dockerfile
args: args:
ZERO_GRAVITY_VERSION: ${ZERO_GRAVITY_GALILEO_ZEROG_VERSION:-3.0.3} ZERO_GRAVITY_VERSION: ${ZERO_GRAVITY_GALILEO_ZEROG_VERSION:-3.0.8}
ZERO_GRAVITY_CHAIN_SPEC: galileo ZERO_GRAVITY_CHAIN_SPEC: galileo
ports: ports:
- 16172:16172 - 16172:16172
@@ -140,7 +140,7 @@ services:
- --chaincfg.node-api.logging - --chaincfg.node-api.logging
- --home=/root/.0g - --home=/root/.0g
- --p2p.external_address=${IP}:16172 - --p2p.external_address=${IP}:16172
- --p2p.seeds=${ZERO_GRAVITY_GALILEO_ZEROG_SEEDS:-85a9b9a1b7fa0969704db2bc37f7c100855a75d9@8.218.88.60:26656} - --p2p.seeds=${ZERO_GRAVITY_GALILEO_ZEROG_SEEDS:-e0750abc061d276894a593c7b671913c14aa4ecc@34.82.252.10:26656}
- --pruning=default - --pruning=default
- --rpc.laddr=tcp://0.0.0.0:16172 - --rpc.laddr=tcp://0.0.0.0:16172
restart: unless-stopped restart: unless-stopped

View File

@@ -61,23 +61,41 @@ env
# seems to be the same for all the 0g chains # seems to be the same for all the 0g chains
if [ ! -f "$DATA_DIR/priv_validator_state.json" ]; then # $DATA_DIR and $CONFIG_DIR are SEPARATE docker volumes (<node>_zerog and <node>_config),
echo "priv_validator_state.json not found in $HOME_DIR. Proceeding with initialization steps..." # so the presence of a file in one says nothing about the other. Guard on everything
# 0gchaind actually needs to boot, and write the copies so the LAST file written is the
# one that would make a re-run skip.
#
# The previous version guarded solely on $DATA_DIR/priv_validator_state.json and copied it
# BEFORE the two key files. An init interrupted between those copies therefore left the
# data volume with the guard file and the config volume without the keys, so every later
# start took the "Already initialized" branch, copied nothing, and 0gchaind panicked:
#
# panic: error calling provider ProvideBlsSigner (node-core/components/signer.go:46):
# key file does not exist at path: /root/.0g/config/priv_validator_key.json
#
# That state is unrecoverable by restarting - the node wedges permanently. Hit on
# aristotle @ rpc-de-32 on 2026-08-12 after repeated build failures interrupted its init.
if [ ! -f "$CONFIG_DIR/priv_validator_key.json" ] || \
[ ! -f "$CONFIG_DIR/node_key.json" ] || \
[ ! -f "$DATA_DIR/priv_validator_state.json" ]; then
echo "0g: node identity incomplete (config keys and/or priv_validator_state.json). Initializing..."
TMP_DIR=$(mktemp -d) TMP_DIR=$(mktemp -d)
# You can add any additional initialization logic here if needed # You can add any additional initialization logic here if needed
if /0g/bin/0gchaind init ${MONIKER} --chaincfg.chain-spec ${CHAIN_SPEC} --home $TMP_DIR; then if /0g/bin/0gchaind init ${MONIKER} --chaincfg.chain-spec ${CHAIN_SPEC} --home $TMP_DIR; then
cp -r /0g/0g-home/0gchaind-home/config/* $CONFIG_DIR cp -r /0g/0g-home/0gchaind-home/config/* $CONFIG_DIR
cp $TMP_DIR/data/priv_validator_state.json $DATA_DIR # Keys first, guard file last: if this is interrupted the next start re-runs
# initialization instead of latching into the wedged state described above.
cp $TMP_DIR/config/node_key.json $CONFIG_DIR cp $TMP_DIR/config/node_key.json $CONFIG_DIR
cp $TMP_DIR/config/priv_validator_key.json $CONFIG_DIR cp $TMP_DIR/config/priv_validator_key.json $CONFIG_DIR
cp $TMP_DIR/data/priv_validator_state.json $DATA_DIR
else else
echo "Already initialized, continuing!" >&2 echo "Already initialized, continuing!" >&2
fi fi
rm -rf $TMP_DIR # delete tmp dir rm -rf $TMP_DIR # delete tmp dir
else else
echo "priv_validator_state.json found in $HOME_DIR. Continuing!" >&2 echo "0g: node identity complete (config keys + priv_validator_state.json). Continuing!" >&2
echo "Already initialized, continuing!" >&2
fi fi
exec /0g/bin/0gchaind $@ exec /0g/bin/0gchaind $@

View File

@@ -8,22 +8,96 @@ RUN chmod +x /usr/local/bin/init.sh
ARG ZERO_GRAVITY_VERSION ARG ZERO_GRAVITY_VERSION
ARG ZERO_GRAVITY_CHAIN_SPEC ARG ZERO_GRAVITY_CHAIN_SPEC
RUN if [ "${ZERO_GRAVITY_CHAIN_SPEC}" = "aristotle" ]; then \
curl -sL https://github.com/0gfoundation/0gchain-Aristotle/releases/download/${ZERO_GRAVITY_VERSION}/${ZERO_GRAVITY_CHAIN_SPEC}-v${ZERO_GRAVITY_VERSION}.tar.gz -o /tmp/${ZERO_GRAVITY_CHAIN_SPEC}-v${ZERO_GRAVITY_VERSION}.tar.gz; \ # 0G publishes each network from a DIFFERENT repository, and the release-tag format is not
# consistent within either of them. The asset filename is always "<spec>-v<version>.tar.gz";
# only the tag varies:
#
# aristotle -> 0gchain-Aristotle 1.0.4 = "1.0.4" 1.0.6 = "v1.0.6"
# galileo -> 0gchain-NG 3.0.3 = "v3.0.3" 3.0.7 = "galileo-v3.0.7" 3.0.8 = "v3.0.8"
#
# So the tag cannot be hardcoded. Resolve it by trying the known forms in order and taking
# the first that actually yields the asset.
#
# curl uses -f (fail on HTTP error). Without it a 404 HTML body is written into the .tar.gz
# and the build dies several layers later at "tar: not in gzip format" -- an error that
# points nowhere near the real cause. That has cost three separate misdiagnoses.
#
# Strip leading 'v' from version if present, to avoid doubled-v (e.g., vv1.0.6 -> v1.0.6)
RUN set -eu; \
VERSION="${ZERO_GRAVITY_VERSION#v}"; \
ASSET="${ZERO_GRAVITY_CHAIN_SPEC}-v${VERSION}.tar.gz"; \
if [ "${ZERO_GRAVITY_CHAIN_SPEC}" = "aristotle" ]; then \
REPO="0gfoundation/0gchain-Aristotle"; \
TAGS="${VERSION} v${VERSION} ${ZERO_GRAVITY_CHAIN_SPEC}-v${VERSION}"; \
else \ else \
curl -sL https://github.com/0gfoundation/0gchain-NG/releases/download/v${ZERO_GRAVITY_VERSION}/${ZERO_GRAVITY_CHAIN_SPEC}-v${ZERO_GRAVITY_VERSION}.tar.gz -o /tmp/${ZERO_GRAVITY_CHAIN_SPEC}-v${ZERO_GRAVITY_VERSION}.tar.gz; \ REPO="0gfoundation/0gchain-NG"; \
fi TAGS="v${VERSION} ${ZERO_GRAVITY_CHAIN_SPEC}-v${VERSION} ${VERSION}"; \
RUN tar -xzf /tmp/${ZERO_GRAVITY_CHAIN_SPEC}-v${ZERO_GRAVITY_VERSION}.tar.gz -C /tmp fi; \
RUN if [ "${ZERO_GRAVITY_CHAIN_SPEC}" = "galileo" ]; then \ for TAG in ${TAGS}; do \
mv /tmp/${ZERO_GRAVITY_CHAIN_SPEC}-v${ZERO_GRAVITY_VERSION}/rpc /0g; \ URL="https://github.com/${REPO}/releases/download/${TAG}/${ASSET}"; \
else \ echo "0g: trying tag '${TAG}' -> ${URL}"; \
mkdir -p /0g && \ if curl -fsSL "${URL}" -o "/tmp/${ASSET}"; then \
cp -a /tmp/${ZERO_GRAVITY_CHAIN_SPEC}-v${ZERO_GRAVITY_VERSION}/* /0g/ 2>/dev/null || true; \ echo "0g: resolved ${ZERO_GRAVITY_CHAIN_SPEC} ${VERSION} from tag '${TAG}'"; \
cp -a /tmp/${ZERO_GRAVITY_CHAIN_SPEC}-v${ZERO_GRAVITY_VERSION}/.[^.]* /0g/ 2>/dev/null || true; \ break; \
rm -rf /tmp/${ZERO_GRAVITY_CHAIN_SPEC}-v${ZERO_GRAVITY_VERSION}; \ fi; \
rm -f "/tmp/${ASSET}"; \
done; \
if [ ! -s "/tmp/${ASSET}" ]; then \
echo "0g: FATAL - no release asset '${ASSET}' found in ${REPO} under any of: ${TAGS}" >&2; \
echo "0g: aristotle and galileo are SEPARATE repos on SEPARATE version lines" >&2; \
echo "0g: aristotle = 0gchain-Aristotle (1.0.x), galileo = 0gchain-NG (3.0.x)" >&2; \
echo "0g: check that version '${VERSION}' exists for '${ZERO_GRAVITY_CHAIN_SPEC}'" >&2; \
exit 1; \
fi fi
RUN chmod +x /0g/bin/0gchaind # Extract by DETECTING the layout rather than assuming one per chain. 0G has shipped
RUN chmod +x /0g/bin/geth # three shapes so far and changed between them without notice:
#
# galileo <= 3.0.3 <root>/{rpc,validator,archive,seed}/bin/ + configs (168 MB)
# -> binaries duplicated inside every profile dir
# galileo >= 3.0.8 <root>/bin/ shared, + <root>/{rpc,...}/ configs (69 MB)
# -> binaries DEDUPLICATED to the tarball root; rpc/ is configs-only
# aristotle 1.0.x <root>/bin/ + configs, no profile dirs at all
#
# So "does <root>/rpc exist" is NOT sufficient: 3.0.8 still has rpc/, it just no longer
# holds bin/. Take configs from the profile dir when present, then top the binaries up
# from the shared root bin/ if the profile dir didn't supply them.
#
# The old code hardcoded "galileo -> mv <root>/rpc /0g", so 3.0.8 yielded configs but no
# binaries and the build died two layers later at
# `chmod: cannot access '/0g/bin/0gchaind'` — an error naming neither the chain, the
# version, nor the layout. Assert on the binaries here so the NEXT upstream reshuffle
# reports itself at the point of failure instead.
RUN set -eu; \
VERSION="${ZERO_GRAVITY_VERSION#v}"; \
SRC="/tmp/${ZERO_GRAVITY_CHAIN_SPEC}-v${VERSION}"; \
tar -xzf "${SRC}.tar.gz" -C /tmp; \
mkdir -p /0g; \
if [ -d "${SRC}/rpc" ]; then \
echo "0g: profile dir found -> ${SRC}/rpc"; \
cp -a "${SRC}/rpc/." /0g/; \
else \
echo "0g: no profile dir -> using tarball root ${SRC}"; \
cp -a "${SRC}/." /0g/; \
fi; \
if [ ! -f /0g/bin/0gchaind ] && [ -d "${SRC}/bin" ]; then \
echo "0g: binaries not in the profile dir -> topping up from ${SRC}/bin"; \
cp -a "${SRC}/bin" /0g/; \
fi; \
rm -rf "${SRC}"; \
missing=""; \
for b in 0gchaind geth; do \
[ -f "/0g/bin/${b}" ] || missing="${missing} bin/${b}"; \
done; \
if [ -n "${missing}" ]; then \
echo "0g: FATAL - missing after extraction:${missing}" >&2; \
echo "0g: ${ZERO_GRAVITY_CHAIN_SPEC} v${VERSION} tarball layout not recognised." >&2; \
echo "0g: known layouts are '<root>/rpc/bin/' (per-profile) and '<root>/bin/' (flat)." >&2; \
echo "0g: contents of /0g were:" >&2; \
ls -la /0g >&2 || true; \
exit 1; \
fi; \
chmod +x /0g/bin/0gchaind /0g/bin/geth
ENTRYPOINT [ "init.sh" ] ENTRYPOINT [ "init.sh" ]