Compare commits

...

235 Commits

Author SHA1 Message Date
b062191754 deploy: regenerate compose from vibe-node main c16e40b68366 2026-09-11 10:27:10 +00:00
rob
eee8bc13de avalanche C-chain configs: select APIs via eth-apis (defaults + debug/debug-tracer/debug-file-tracer/debug-handler); the legacy *-api-enabled flags are ignored by avalanchego 1.14.2 (canary rpc-de-22: debug_trace* now served)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KjqejYycVyVvrxV9aTDhgX
2026-09-11 09:58:49 +00:00
rob
2960ac3480 avalanche C-chain configs: debug-api-enabled true (mainnet pruned/archive/firewood, fuji pruned/archive) so the advertised dshackle debug group is actually served (dRPC routed 110 debug_trace* calls/day into method-not-available)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KjqejYycVyVvrxV9aTDhgX
2026-09-11 09:34:36 +00:00
03eece850f deploy: regenerate compose from vibe-node main ad1b9236adf5 2026-09-11 09:31:12 +00:00
20618f9f56 deploy: regenerate compose from vibe-node main c113407f089d 2026-09-11 08:56:22 +00:00
be4c1a599f deploy: regenerate compose from vibe-node main 218bbb0b7615 2026-09-11 08:11:28 +00:00
a8a8986305 deploy: regenerate compose from vibe-node main 2c123e09150c 2026-09-11 07:16:37 +00:00
dd059dfa1e deploy: regenerate compose from vibe-node main 02930ac0a52b 2026-09-11 06:32:40 +00:00
75e92270c6 Merge pull request 'haqq: fix startup crash-loop by adding missing cometbft-common.sh' (#73) from issue-4373 into main 2026-09-10 14:25:53 +00:00
ecf3eea227 deploy: regenerate compose from vibe-node main 8d6970c716b7 2026-09-10 09:50:10 +00:00
bc81a514d3 deploy: regenerate compose from vibe-node main 588eabf061ef 2026-09-10 09:22:19 +00:00
4d0d4e84bd deploy: regenerate compose from vibe-node main 482841b9f702 2026-09-10 09:17:47 +00:00
rob
4daf21cb27 haqq: drop truncated dteam peer, stop feeding the Polkachu addrbook JSON to ct_merge_seeds; cometbft-common: validate peer entries
- haqq/scripts/init.sh: 7c153a83@peer.haqq.mainnet.dteam.tech:28656 is not a 40-hex node id;
  haqqd refuses to start with it in seeds/persistent_peers. Removed from both defaults.
- haqq/scripts/init.sh: ct_merge_seeds was given ADDRBOOK_URL (a JSON addrbook, hundreds of KB)
  as the official seed list; the resulting sed argument exceeded ARG_MAX on Alpine. The
  addrbook is already installed by ct_set_addrbook; pass no seeds URL.
- scripts/cometbft-common.sh (+ per-chain copies via update.sh sync): ct_valid_peers filters
  seeds and persistent_peers to <40-hex>@host:port and logs what it drops, so a bad upstream
  entry can never block startup again.

Replaces the runtime override /root/onsite-overrides/haqq-mainnet-skip-addrbook-as-seeds.yml
that the onsite agent left on rpc-de-31 on 2026-09-07.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KjqejYycVyVvrxV9aTDhgX
2026-09-09 06:43:08 +00:00
7006907548 bump apechain nitro version to apechain-3.9.9 and sync with current context
- Update apechain nitro node from v3.5.6 to 3.9.9 for ArbOS v33 support
- Sync ARC client versions (reth: 0.8.0 -> 0.7.2, consensus: 0.8.0 -> 0.7.2)
- Sync Linea besu client version (2.0.0-20260714 -> 2.2.0-20260821)
2026-09-08 20:57:08 +00:00
611b962db5 tac: bump tacchaind client version from v1.6.0 to v1.6.2-beta.2-manual for mainnet hardfork
TAC mainnet halted at block 24,671,475 on 2026-08-22 and RESUMED 2026-09-02 via
one-shot Aug-2026 state-recovery hardfork gated on chain-id tacchain_239-1 +
height 24,671,476. v1.6.0 lacks that migration and cannot cross the fork height.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-09-07 13:09:17 +00:00
73c9362f9f nethermind: bump client version from 1.39.1 to 1.39.2 2026-09-07 12:40:14 +00:00
9f7317dcd1 haqq: add missing cometbft-common.sh COPY to Dockerfile 2026-09-07 11:48:42 +00:00
3e126d424f core: bump core-chain client from 1.0.22 to 1.0.26 for mainnet hardfork
Mainnet hardfork activated 2026-09-03 13:00 UTC; nodes on v1.0.22 stuck at
block 38376796 ('Re-queue blocks' loop). GitHub release v1.0.26 published
2026-09-02 with mainnet hardfork support.

Applies to all core networks: mainnet (chain 1116), buffalo, pigeon.
Image-only change: ghcr.io/coredao-org/core-chain:1.0.26

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-09-05 09:45:38 +00:00
5415831756 Merge pull request 'reference-rpc-endpoint: new zircuit-garfield-testnet reference RPC' (#72) from garfield-reference-rpc into main 2026-09-05 09:15:32 +00:00
dbead7d8ab reference-rpc-endpoint: zircuit-garfield-testnet — replace dead garfield-testnet.zircuit.com with rpc.garfield-testnet.zircuit.com
https://garfield-testnet.zircuit.com/ no longer answers JSON-RPC (empty reply), and
zircuit-garfield-testnet.drpc.org returns 'chain is not available on free plan'
(code 35), so sync-status reports garfield as 'unverified (reference unreachable)'
on de-32/de-11. https://rpc.garfield-testnet.zircuit.com answers eth_blockNumber
(0x1703803 on 2026-09-05). drpc kept as second URL.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RzxemENdcZBCxdGrzXiFvS
2026-09-05 09:15:10 +00:00
561abcabac Merge pull request 'clone-backup: delete node identity keys on the destination after a successful restore' (#70) from fix-restore-delete-node-keys into main 2026-09-05 09:14:11 +00:00
4c86367c5f Merge pull request 'haqq: move CometBFT RPC laddr off 8545 to 26657 (EVM json-rpc never bound)' (#71) from haqq-init-cometbft-rpc-port into main 2026-09-05 08:41:49 +00:00
db7ef4c8cd haqq: fix CometBFT RPC port conflict - move [rpc] laddr from 8545 to 26657 2026-09-05 08:17:44 +00:00
45d3add2dd Add node identity key deletion after fast-path restore (fixes rpc-us-50 avalanche incident) 2026-09-04 09:21:21 +00:00
da5c600846 Merge pull request 'haqq: COPY cometbft-common.sh into the image (fix startup crash-loop)' (#69) from haqq-dockerfile-cometbft-common into main 2026-09-04 07:01:52 +00:00
833e7b2713 haqq: add missing cometbft-common.sh COPY to Dockerfile 2026-09-04 06:54:16 +00:00
b91f20a876 deploy: regenerate compose from vibe-node main 1b5ba9b72fe1 2026-09-04 03:57:52 +00:00
44fecc0269 Merge pull request 'zircuit: add Jovian + Karst fork times (garfield PAST since 2026-08-26; mainnet Sep 15 / Sep 23)' (#68) from zircuit-jovian-karst into main 2026-09-04 02:21:22 +00:00
0bac72abb4 zircuit: add jovian_time + karst_time (garfield PAST jovian 1787761801/karst 1788883201; mainnet jovian 1789489801/karst 1790179201) from live sequencers
garfield forked at Jovian (2026-08-26, ~block 23712660) on rpc-de-11 because rollup.json/genesis.json stopped at Isthmus; the de-32 bench copy restored from Conduit's snapshot cannot parse post-Jovian L1-info deposits (data is unexpected length: 178) for the same reason. mainnet activates Jovian 2026-09-15 and Karst 2026-09-23.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RzxemENdcZBCxdGrzXiFvS
2026-09-04 02:20:47 +00:00
e4bfd6e50e deploy: regenerate compose from vibe-node main 5712d6ff2ee2 2026-09-04 01:29:27 +00:00
78dc41bd7e deploy: regenerate compose from vibe-node main 7e17db3a2710 2026-09-04 01:01:56 +00:00
abd240821b deploy: regenerate compose from vibe-node main ace5146f8c1c 2026-09-03 07:57:10 +00:00
bf9bee1742 ronin: add Karst hardfork times (mainnet: 1791388801, saigon: 1788364801) 2026-09-03 07:21:59 +00:00
7fd209c1ba fraxtal-mainnet: add fjord/granite/holocene/isthmus fork times to genesis.json (check_fork_times --fix)
Source: FraxFinance/fraxtal-node master mainnet/rollup.json (published; RPCs refuse
optimism_rollupConfig). rollup.json already had them; genesis.json stopped at
ecotone so op-geth (geth init runs every start) never activated Fjord+.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RzxemENdcZBCxdGrzXiFvS
2026-09-03 03:54:17 +00:00
7c21ad95d8 Fix cronos port collision: remove hardcoded client_port 10521 from context.yml
cronos-mainnet now uses port 11552, cronos-testnet uses port 14547
to prevent Bind for 0.0.0.0:10521 port already allocated errors on rpc-de-35

cronosd supports custom P2P_PORT via ct_patch_p2p in init.sh, so auto-generated
ports are wired through correctly via P2P_PORT env var.
2026-09-03 03:52:38 +00:00
13e11730ec ethereum: replace beaconstate.ethstaker.cc with sync-mainnet.beaconcha.in for mainnet checkpoint-sync
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-09-03 03:32:53 +00:00
4340204c5c superseed-mainnet: add Jovian (1769065201) + Karst (1787673601) fork times to rollup.json and genesis.json
Live sequencer optimism_rollupConfig carries jovian_time/karst_time; our custom
configs stopped at Isthmus, so the de-32 bench sync diverged at block 21442759
(first Jovian block). Source: https://mainnet.superseed.xyz optimism_rollupConfig.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RzxemENdcZBCxdGrzXiFvS
2026-09-03 03:16:01 +00:00
d9cb8f144d Add methods.disabled to beacon-chain upstreams for expensive state dumps
Disable GET#/eth/v2/debug/beacon/states/*, GET#/eth/v1/beacon/states/*/committees,
GET#/eth/v1/beacon/states/*/validators, and POST#/eth/v1/beacon/states/*/validators
which produce multi-GB responses that timeout at the gateway.

These were applied live on hosts 2026-08-31 (rob, operator-approved) but existed
nowhere durable. Baking them in at the source prevents regeneration from
erasing them.

Affects all ethereum and gnosis beacon-chain upstreams.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-09-02 05:51:16 +00:00
cb144f7d06 Replace dead beaconstate.info checkpoint-sync domains
- mainnet.beaconstate.info -> beaconstate.ethstaker.cc
- sepolia.beaconstate.info -> checkpoint-sync.sepolia.ethpandaops.io
- Preserve holesky.beaconstate.info and beaconstate-hoodi.chainsafe.io (alive)

Fixes CL container crash-loops on fresh starts due to dead DNS.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-09-02 03:45:23 +00:00
cd65972c45 superseed-mainnet: add missing EL fork times (granite/holocene/isthmus) 2026-09-01 01:02:19 +00:00
503246f795 regenerate all nitro-client composes with secondary-beacon-url fallback
Adds --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_<L1>_BEACON_REST_FALLBACK}
to all nitro clients using ethereum L1 (non-arbitrum l1_network_name).
Chains with l1_network_name=arbitrum (apechain, opencampuscodex) remain unchanged
as the flag is inside the non-arbitrum guard.

Generated from templates/clients/nitro.yml + default.env changes in PR #4332.
2026-08-30 05:51:37 +00:00
08becee73e katana-mainnet: regenerate op-reth compose files with OP_NODE_L2_SKIP_SYNC_START_CHECK=false 2026-08-30 05:38:31 +00:00
361d93d1ad Fix arc version tag: remove v-prefix from v0.8.0 -> 0.8.0
The arc-network cloudsmith registry has NO v-prefix for 0.8.0.
Available tags are 0.8.0 and 0.8.0-66ad2d5a (the v-prefix existed
only for v0.7.3). Deploy of the previous change failed with
manifest-unknown for arc-consensus:v0.8.0.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-30 04:59:40 +00:00
c8cbd8a925 Add superseed mainnet op-reth pruned-trace profile
- Add new superseed-mainnet-op-reth-pruned-trace.yml compose file
- Update compose_registry.json with new entry
- Mirror sepolia op-reth profile structure with mainnet settings

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-30 04:39:47 +00:00
0f6e212d39 arc: upgrade to v0.8.0 with reth 2.2 Storage V2 support
- Bump execution client version from v0.7.3 to v0.8.0
- Bump consensus client version from v0.7.3 to v0.8.0
- Add --prune.block-interval=5000 to retain previous pruning schedule
- Supports reth Storage V2 (v0.8.0 binary runs V1 data without migration)
- Addresses breaking changes from arc-node v0.8.0 BREAKING_CHANGES.md

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-30 03:46:00 +00:00
3657fc49f2 Add Humanity chain node profile (arb/humanity)
- Add Arbitrum Orbit L2 chain Humanity with nitro client
- Mainnet chain-id: 13600000, testnet chain-id: 7080969
- Generate pruned-pebble-hash and pruned-pebble-hash.prune variants
- Use offchainlabs/nitro-node:v3.11.2-3599aca
- Parent chain: Arbitrum One (l1: one, l1_network_name: arbitrum)

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-29 12:47:12 +00:00
40a415cee8 avalanche: revert fuji profile to leveldb (remove firewood, restore leveldb)
The previous commit (b578bd85) incorrectly renamed fuji from leveldb to firewood.
On-disk verification on rpc-de-10 (64k *.ldb files, --db-type=leveldb flag,
startup log databaseConfig.name=leveldb) proves the avalanche-fuji node uses
LEVELDB. This commit restores the leveldb profiles and removes the firewood
variants for fuji.

- Restored: avalanche-fuji-go-pruned-leveldb.yml, .prune.yml, archive-leveldb.yml
- Removed: avalanche-fuji-go-pruned-firewood.yml, .prune.yml
- Updated: compose_registry.json

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-29 05:49:57 +00:00
b578bd8514 avalanche: fix fuji profile naming to use firewood db (remove pebbledb/leveldb profiles)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-29 05:43:20 +00:00
7b667fe049 avalanche: add firewood profile for mainnet (pruning-free merkle DB)
Add new avalanchego v1.14.2 profile with Firewood state database backend:
- state-scheme: firewood (with required populate-missing-tries:null, snapshot-cache:0)
- state-sync-enabled: true (confirmed supported in v1.14.2)
- chain-config-dir: /config/firewood
- db-type: firewood
- coreth-state-scheme: firewood

Generated compose: avalanche-mainnet-go-firewood-firewood.yml

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-29 05:29:45 +00:00
cf91b6f14d Merge pull request 'linea: reduce Maru engine API parallelism' (#49) from issue-2412 into main 2026-08-28 05:25:30 +00:00
529a91f0d7 Merge pull request 'show-status: exit code was always 0 — three compounding bugs' (#66) from fix-show-status-exit-code into main 2026-08-28 05:25:11 +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
502a75b2fd show-status: exit code was always 0 — three compounding bugs
show-status.sh could never report failure. The ansible task that wraps it
('Execute show-status.sh and fail on failure') therefore always passed, on every
host, regardless of node state. Three bugs, each masking the next:

1. $? read too late. `code=0` sits between the sync-status.sh call and
   `if [ $? -ne 0 ]`. A plain assignment succeeds and overwrites $? with 0, so
   the condition was ALWAYS false and the else branch always taken.

2. The else branch was inverted. It is the sync-status-SUCCEEDED path, yet it set
   `code=1; any_failure=true` — marking healthy nodes as failures.

3. any_failure could never propagate. check_sync_status runs backgrounded (`&`),
   i.e. in a subshell, so `any_failure=true` inside it is discarded; and the
   `wait "$pid"` loop threw away each job's exit status.

(3) hid (1) and (2): a script that believed every node had failed still exited 0,
so nobody saw it.

Fix: capture rc immediately; restore the intended logic (success => 0, syncing or
lagging => tolerated, anything else => failure); propagate failure in the PARENT
via `wait "$pid" || any_failure=true`, since the subshell cannot.

Verified with a stubbed sync-status.sh:

  scenario              before   after
  all online              0        0
  one syncing             0        0   (tolerated)
  one lagging             0        0   (tolerated)
  one ERROR               0        1
  ALL error               0        1

Behaviour for healthy fleets is unchanged; only genuine failures now surface.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-14 19:56:10 +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
7d27ff1918 fix list-restorable.sh process-substitution infinite loop in volume-keys read loop
Regression from d896378e: putting < <(...) on `read` re-runs the producer each iteration. Capture required volume keys once and feed via done<<<.
2026-08-04 16:23:48 +02:00
b23545e143 immutable-zkevm: bump geth v1.17.4→v1.17.5 (mainnet)
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-04 12:20:48 +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
3be855a681 fix soneium-minato→miniato typo + add drpc_chain to compose_registry.json
Add authoritative dRPC slug field (operator audit 2026-08-04):
- generate_registry.py: add drpc_chain field from x-upstreams[0].chain
- Fix soneium-minato-sepolia → soneium-miniato-sepolia typo in compose files
- drpc_chain is null for entries without x-upstreams (not dRPC-servable)

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-04 07:34:50 +00:00
d896378eb7 Add optional/ephemeral volume notation for restore resilience
Introduce x-optional-volumes for beacon sidecars (prysm, nimbus, lighthouse,
teku, lodestar) that are checkpoint-sync capable and rebuild state quickly.
Mark reth sockets volumes as ephemeral (runtime IPC artifacts).

Script changes:
- volume-utils.sh: add is_optional_volume_key() function
- restore-volumes.sh: tolerate missing optional/ephemeral volume archives
- clone-backup.sh: skip missing optional/ephemeral volumes gracefully
- list-restorable.sh: only require archives for non-optional persistent volumes

This fixes the de-25 ethereum prysm incident (entire 1.1T restore failed
due to missing prysm archive) and arc-testnet reth sockets restore loops.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-04 06:10:55 +00:00
d21f2669ae beacon x-upstreams: restore disable-validation: true for gnosis and ethereum nimbus beacon-chain upstreams
Restore the beacon x-upstream options.disable-validation: true that was
removed during regeneration. This prevents dshackle 0.79.10's beacon health
validator from timing out on the spec-compliant empty-body 200 that nimbus
returns, causing the upstream to flap UNAVAILABLE. Matches the established
ethereum-beacon pattern.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-03 06:58:50 +00:00
rob
3f3cedf625 Add Falkenstein/Hetzner edge prefix 168.119.195.0/24
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-03 06:48:53 +00:00
80b0e4253e linea/mainnet/maru: reduce blocks-parallelism 10→2 and blocks-batch-size 10→5 to reduce engine API saturation 2026-08-02 18:03:02 +00:00
c5f9e5000f linea: lower desync-tolerance from 100000 to 64 to allow range-sync mode 2026-08-02 14:51:49 +00:00
2779f359d6 polygon: remove bor minimal profile .prune.yml (prune-block incompatible with pebble+path freezer) 2026-08-02 03:10:47 +00:00
879ea1769f polygon: remove bor minimal profile (prune-block incompatible with pebble+path freezer) 2026-08-02 03:09:56 +00:00
rob
5d56334d3c polygon minimal prune: point --datadir.ancient at ancient/chain (freezer tables dir)
bor snapshot prune-block wants the directory holding the freezer tables
(bodies.*.cdat) - the modern layout splits ancient/ into chain/ + state/,
so ancient/ root fails with 'ancient chain segments already extracted' and
the prune container crash-loops (de-12, 2026-08-02). Matches BSC's
prune-block usage which targets .../ancient/chain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 02:25:40 +00:00
776aabd231 polygon minimal .prune: pass --datadir.ancient (bor nests chaindata under bor/; prune-block cannot derive the freezer path — crash-looped on de-12) 2026-08-02 02:10:59 +00:00
sebastian
e416e61f3d Merge pull request 'Bump erigon3 v3.5.2→v3.5.3 (Dockerfile asset)' (#47) from vupd/2284-erigon3-v3.5.3 into main
Reviewed-on: #47
2026-08-01 23:50:58 +00:00
399fe87f46 ethereum: bump erigon3 from v3.5.2 to v3.5.3
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-08-01 06:16:03 +00:00
7a3003cb63 avalanche: enable state-sync on C-chain pruned profile 2026-08-01 00:17:37 +00:00
9e1aaf6393 erigon3: bump Dockerfile VERSION to v3.5.3 2026-07-31 10:35:01 +00:00
302c663039 op.zircuit.garfield: bump op-node to v1.19.3
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-07-31 09:06:07 +00:00
30aa16e4e2 arc.mainnet: bump arc-execution (reth) and arc-consensus to v0.7.3
Mirror arc.testnet pins so mainnet EL/CL image defaults use v0.7.3.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 07:35:35 +00:00
59e432fa72 linea-mainnet: disable Maru [linea] finalization provider
Maru CL stuck behind tip was sending FCU with finalized ahead of EL head
(Besu -38002). Comment out [linea] until EL catches tip (no enabled flag).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 07:31:23 +00:00
rob
d8386e43be backup-node: torn-backup floor guards the main data volume only
A 0G sidecar volume (ronin eigenda-proxy) FATAL'd the whole backup before the
manifest was written - verify found no new backup and the refresh pipeline's
bench-retire escalated 4 cycles in a row, head-of-line blocking the single
refresh lane. Sidecars are legitimately tiny; the <1G fail-closed floor now
applies only to the main data volume (key == compose basename).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 06:55:48 +00:00
f68b541f58 ink-mainnet: bump op-reth to v2.4.0
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-31 04:34:06 +00:00
97482cffe1 polygon: add bor minimal profile + .prune compose (bor snapshot prune-block rotation, arb-style) 2026-07-31 01:16:15 +00:00
4806a8ad1b deploy: regenerate compose from vibe-node main 47bb3d78e3c1 2026-07-30 08:05:17 +00:00
7b05a14515 drpc: bump default dshackle image to 0.79.11-ss2
ss1 shipped without drpcorg public-submodule resources and crash-loops
at boot (compatible-clients.yaml missing); ss2 is the boot-verified fix.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 07:51:24 +00:00
bab834dcde drpc: default dshackle image to stakesquid fork 0.79.11-ss1
Fleet-wide default is now stakesquid/dshackle:0.79.11-ss1 (digest-pinned);
DSHACKLE_IMAGE env escape hatch retained for rollback to upstream.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 07:29:36 +00:00
76dfdfe2a2 drpc: allow per-host DSHACKLE_IMAGE override for canary fork rollout
Default remains drpcorg/dshackle:0.79.10; canary hosts can set
DSHACKLE_IMAGE via host_vars env_overrides without editing compose.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 07:25:54 +00:00
03b9aff1e9 deploy: regenerate compose from vibe-node main ed19fc13dd0f 2026-07-29 12:27:48 +00:00
rob
fa7ae58f6c hashkey mainnet genesis: add pragueTime = isthmusTime (fork-fix)
HSK's published mainnet genesis sets isthmusTime but omits pragueTime; op-geth's
OP-Stack validation rejects it ('PragueTime (<nil>) must equal IsthmusTime'), so
geth init aborts and the EL runs on a stale chainconfig. testnet genesis correctly
sets pragueTime=isthmusTime. Adding it here makes init pass. (Runtime fork activation
is handled by GETH_OVERRIDE_* in vibe-node geth.env; this fixes init + matches testnet.)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-29 12:24:54 +00:00
7b87130e4f deploy: regenerate compose from vibe-node main a319d697a820 2026-07-29 11:47:54 +00:00
fbf6963ca7 deploy: regenerate compose from vibe-node main 2c49f032cd65 2026-07-29 02:47:11 +00:00
sebastian
de0e7614a6 Merge pull request 'ink-mainnet: delete 9 orphaned compose files, keep single reth variant' (#46) from issue-2053 into main
Reviewed-on: #46
2026-07-29 02:41:48 +00:00
rob
d0529bb551 polygon/bor: regenerate with --cache and --cache.gomemlimit knobs
From vibe-node c6d5fed (bor.yml). Both empty/1024-default, no runtime
behavior change until a host sets an override.
2026-07-29 02:01:04 +00:00
580ece7b9c ink-mainnet: drop all compose variants except op-reth pruned-trace--kona
Orphaned op-geth files (already removed from config.yml) plus sibling
op-reth/op-erigon profiles still share Traefik service names/paths under
COMPOSE_FILE. Keep only ink-mainnet-op-reth-pruned-trace--kona.yml as the
single active /ink-mainnet route.
2026-07-28 11:49:27 +00:00
093ecb0d7a op.superseed.sepolia: bump conduit-op-reth v2.1.1 -> v2.1.2
Also regenerates digibyte-mainnet compose to match already-landed digibyted 9.26.5 pin.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-28 02:43:25 +00:00
c3ce5da911 bump bsc reth-bsc v0.1.0-fix -> v0.1.1 (Pasteur-ready)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-28 00:42:19 +00:00
81985dbc98 digibyte: bump digibyted Dockerfile 9.26.4 -> 9.26.5
Post-activation maintenance release; update VERSION and tarball SHA256.
2026-07-26 06:14:11 +00:00
c17c4bd35e berachain-bepolia: bump bera-reth v1.4.3 -> v1.4.3-rc.0 (Osaka1)
v1.4.3 does not exist on GHCR; v1.4.3-rc.0 is the Osaka1 hardfork fix.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-26 06:08:05 +00:00
6078c661dc deploy: regenerate compose from vibe-node main 2d213d3bd0ee 2026-07-26 04:43:23 +00:00
3737986e27 taiko-hoodi: bump nethermind 1.39.1 -> 1.39.2 (.NET CVE patch)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-26 04:37:06 +00:00
d56b3a414b zircuit-garfield: migrate testnet to Conduit (op-reth + op-node)
Replace the old op-geth + zircuit1/op-node garfield (holesky L1, built-in
OP_NODE_NETWORK=garfield) with the Conduit node template:
- EL: ghcr.io/conduitxyz/conduit-op-reth:v2.1.1 (--chain=/config/genesis.json)
- CL: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.19.0
      (OP_NODE_ROLLUP_CONFIG=/config/rollup.json)
- L1: Ethereum Sepolia (l1_chain_id 11155111)
- rollup.json/genesis.json from api.conduit.xyz (slug zircuit-garfield-testnet;
  regenesis 2026-07-06, bedrockBlock 0)
- Conduit P2P static peer + bootnodes
Remove the 4 now-orphaned op-geth garfield composes (none were deployed).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-25 03:45:22 +00:00
05066c20d0 berachain-bepolia: bump bera-reth v1.4.2 -> v1.4.3
EL/CL baseFee mismatch at block 22961752; CL crash-loops on
INVALID payload from post-v1.4.2 block format while beacon-kit
is on v1.4.1. Also regenerates ink-mainnet OPE P2P bootnodes
from parent a790c3e and refreshes reference-rpc-endpoint (mova).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 10:55:03 +00:00
60fa1dd047 deploy: regenerate compose from vibe-node main 98bd87d192f5 2026-07-23 07:13:30 +00:00
b02c0971ce deploy: regenerate compose from vibe-node main de243b1ca320 2026-07-23 03:14:03 +00:00
99664129aa deploy: regenerate compose from vibe-node main 4a45537ac06b 2026-07-22 23:25:05 +00:00
rob
511a3621f2 jwt volumes join secrets as no-backup-by-design: benign skip in clone-backup, exempt from list-restorable restorability
-jwt volumes (EL/CL shared secret) are regenerated at create-node and never
backed up, same as -secrets. Two fixes:

- clone-backup.sh: extend the fd8dd15b secrets skip to *-jwt (both paths)
- list-restorable.sh: exclude *-jwt/*-secrets from the all-volumes-required
  restorability check. Both plasma composes showed Restorable: 0 for days
  (mainnet 407G + testnet 98G+29G data backups present since 07-18/19)
  purely because rpc_plasma-*-jwt had no backup; this misled the 07-16
  plasma restore assessment ('de-32: NO plasma backup').

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 22:35:08 +00:00
rob
fd8dd15b40 clone-backup: missing *-secrets backup is a benign skip, not a failure
Secrets volumes are regenerated at create-node and generally have no
backup by design. Counting the skip as Failed (exit 1) false-failed
whole provisions whose data volumes transferred fine (tempo de-32->de-27,
job e9634e66: executor's broken-pipe guard reset the action and would
have re-cloned everything). Reported by claude@ (inbox 829bc624).

- no-backup on a *-secrets volume -> return 2 (skip), both nc and ssh paths
- rc=2 tracked as Skipped in the summary, excluded from the failure count
- exit status now keys on failed_volumes only

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 10:59:49 +00:00
d4d4091939 Bump cronos-zkevm external-node from v31.0.0 to v31.3.0
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-22 06:09:43 +00:00
ad4c7e5528 arc.testnet: bump arc-execution + arc-consensus 0.7.2 → v0.7.3 (EL+CL lockstep)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-22 01:06:36 +00:00
28232799c7 deploy: regenerate compose from vibe-node main daf770f1b20d 2026-07-22 00:25:03 +00:00
35aa9c9d1e gnosis: expose nimbus CL beacon REST via Traefik (mirror ethereum)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 23:56:57 +00:00
63736e47a3 tempo: drop removed --consensus.fee-recipient flag (1.10.2 crash-loop)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 12:26:19 +00:00
eb7c5f0e64 bsc: bump bsc client 1.7.3 → 1.7.6 (Pasteur hardfork)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 11:24:18 +00:00
rob
ea3a1d541f drpc-free: default GW_FREE_REDIS_RAM to 512MB (empty var made redis-free crash-loop on us-45)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 09:35:48 +00:00
0068e82f6b berachain.mainnet: bump bera-reth v1.4.1 → v1.4.2
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 04:04:28 +00:00
rob
c7b29693e2 op-node fleet-wide: OP_NODE_L2_SKIP_SYNC_START_CHECK=true (trust unsafe head on restart)
The false default forced every op-node restart to walk back to the finalized head
before driving the EL. On nodes whose derivation lags days behind their serving
gossip head (hashkey us-40: 510k blocks / 12 days), that froze the EL for hours
while dRPC de-routed the sole US provider. true resumes at the unsafe head in
minutes; safe/finalized still verify and catch up in the background. ronin
already ran true per-chain (same lesson); xlayer keeps its deliberate false pin.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 04:01:02 +00:00
7db90e75e4 deploy: regenerate compose from vibe-node main b0f2d7c6cc87 2026-07-21 03:04:31 +00:00
rob
ceefedf5ab hashkeychain: commit genesis assets + drop config-download init containers
Removes the alpine genesis/rollup init containers and their
service_completed_successfully gate for all hashkeychain variants. The gate
wedged us-40: a reconcile compose-up recreated the op-reth EL but not the
init-gated op-node CL -> fresh EL + stale CL -> 2h engine freeze -> sole-provider
market -> $0 (2026-07-21). genesis.json now committed beside the existing
rollup.json so render_templates auto-detects custom_genesis/custom_rollup and
binds the local files; CL now depends only on the EL (service_started,
restart:true), identical to op-mainnet/op-sepolia. No S3 on the boot path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 02:14:30 +00:00
fbc5af63e2 deploy: regenerate compose from vibe-node main 00e25d8393e3 2026-07-21 01:01:56 +00:00
093babb50f drpc: cap dshackle JVM heap with JAVA_OPTS=-Xms1g -Xmx4g
Image default is -Xms1024M with no -Xmx, so heap can grow unbounded (~30GiB).
us-41 was at 90% memory with no swap; -Xmx4g provides a safety limit.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-20 16:24:22 +00:00
477afc412a bitcoin-cash: bump bitcoind (bitcoin-abc) 0.33.7 -> 0.33.8
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-20 15:37:46 +00:00
53503bc6e5 deploy: regenerate compose from vibe-node main 73a2d943c297 2026-07-20 13:10:03 +00:00
rob
c83d685d87 Bump Linea maru consensus client to 1.3.0-20260714-ced387a.
Catch up from v1.2.1/1.0.1 pins so mainnet and sepolia followers track the current Consensys/maru release.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-19 09:43:33 +00:00
rob
9c6a4ab148 Dogfood public bootstrap peers as secondary reinject seed.
Add bootstrap-peers.sh and fall back to stakesquid.eu/bootstrap when local peerset capture is empty; optional --seed-bootstrap on connect-peers.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-19 08:56:52 +00:00
6a19dc91e1 deploy: regenerate compose from vibe-node main e1cb79cc7707 2026-07-19 08:52:47 +00:00
rob
bfdc6e21ec Make maru versions OCI-observable and fix metrics scrape path.
Re-label consensys/maru FROM tag into image OCI labels (upstream leaves
version/vcs-ref empty) and scrape /metrics on :9090 instead of the 404ing
/debug/metrics/prometheus path.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-19 08:32:54 +00:00
rob
2919960697 Peer persistence hooks: capture before stop, reinject after start
Clients (esp. discovery-disabled OP-stack EL) lose peers across recreate.
Generic peer-capture/peer-reinject hooks + force-recreate wiring restore
the peerset from local peer-state via in-network admin_addPeer.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-19 05:25:27 +00:00
db81e62c73 plasma: add testnet compose + assets (reth + plasma-consensus)
Canonicalize plasma-testnet so the tracked compose adopts the same
volume/service names as the de-32 hand-written override (rpc_plasma-
testnet-reth-pruned-trace-{execution,consensus,jwt}). Also refresh
mainnet observer sed to be chain-agnostic.
2026-07-19 04:15:45 +00:00
rob
95360bd238 fix: rewrite tar extract onto target volumes root when it is a cross-device symlink
Hosts like rpc-us-32 put /var/lib/docker (or volumes/) on another mount;
tar -C / then EXDEV on every var/lib/docker/volumes/... member. Canonicalize
the deepest static prefix (readlink -f /var/lib/docker/volumes) and append a
--transform after SLOWDISK_TRANSFORMS. Keying only on /var/lib/docker misses
a real docker root with volumes/ as the symlink. No-op on normal hosts.
Per-volume _data static-file offload stays on SLOWDISK_TRANSFORMS.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-19 02:24:56 +00:00
38c43345f6 bump kona-node image tag v1.6.1 → v1.6.2
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-18 02:44:38 +00:00
f14b9ff27d celo+ronin: bump eigenda-proxy relay to 2.7.1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-18 01:55:07 +00:00
ab58da64b7 deploy: regenerate compose from vibe-node main 87142cd310ec 2026-07-18 00:12:57 +00:00
1fdef578b3 op.ink.sepolia: bump op-reth image tag v2.3.2 → v2.4.0
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 17:08:28 +00:00
64e0bef77a deploy: regenerate compose from vibe-node main 9ed685edcf50 2026-07-17 14:34:25 +00:00
07be37d3a4 deploy: regenerate compose from vibe-node main 2583bcb3d07e 2026-07-17 01:33:53 +00:00
3e22390e9a op.katana.mainnet: pin op-reth develop → v2.4.0
Also regenerate compose for already-merged hashkey static-peers / op-geth
static-nodes entrypoint (parent #1437) that had not yet landed in rpc.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 13:39:58 +00:00
671f293771 tempo-testnet: fix init exit when validator_key.json exists
Replace buggy && short-circuit with if/fi so the one-shot init
exits 0 when the signing key is already present (matches mainnet/
moderato and templates/clients/reth.tempo.yml), unblocking sync
resume on data-intact hosts still on the orphaned testnet compose.
2026-07-16 05:08:07 +00:00
d2dc6a607e nethermind: bump 1.39.0 → 1.39.1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-16 00:40:08 +00:00
6c48f8a8e5 deploy: regenerate compose from vibe-node main f34cc646017b 2026-07-15 23:17:07 +00:00
98d8a25e53 fix chain-name typos: ethereum-hoodie→hoodi, drop stale soneium-miniato compose
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-15 18:14:59 +00:00
b92e1a6e67 deploy: regenerate compose from vibe-node main 37cda84e5bde 2026-07-15 16:03:43 +00:00
810c5b8631 ethereum: bump prysm v7.1.4/v7.1.6 → v7.1.7 in generated compose defaults.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-15 13:06:09 +00:00
de7984c792 deploy: regenerate compose from vibe-node main dfabbf30beac 2026-07-15 12:14:04 +00:00
rob
d40fbfaac3 reload_dshackle.sh: detect-and-restart on SIGHUP reload failure
dshackle's SIGHUP reload silently fails for upstream REMOVALS (and method-set
changes, same remove+add path): it logs "Config is not reloaded, cause - ...",
updates the in-memory config but leaves runtime selectors stale (drift), and keeps
serving the old config. No runtime admin API exists to mutate upstreams, so a
container restart is the only way to actually apply such changes.

Replace the blind SIGHUP with: per-container SIGHUP, then check post-SIGHUP logs
for the failure marker ("Config is not reloaded, cause -") or a dropped concurrent
HUP ("Reloading is in progress"); on either, docker restart to load config fresh.
"Reloading config has been completed" is NOT success (finally-block) — deliberately
not treated as such. Exit 0 when config ends up applied (via SIGHUP or restart);
non-zero only if a needed restart fails or the container doesn't come back.

Layered on top of the override-weave (apply-dshackle-overrides.py) and the 1:1
invariant gate (validate-dshackle-1to1.py) — both run unchanged before the reload.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-15 06:49:39 +00:00
3dfe9cd8ef reload_dshackle.sh: gate the reload on the 1:1 invariant
Insert validate-dshackle-1to1.py between the overrides weave and the HUP signal:
a dshackle config routing >1 node for the same chain is REFUSED (exit 1) so the
live config stays active. Structural enforcement of 1 dshackle = 1 node/chain —
we can't attribute traffic to multiple nodes behind one proxy (no per-upstream
request metric; conn-seconds biases it). See /root/proxy-1to1-invariant-plan.md.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-15 01:02:52 +00:00
bcc24595a9 add validate-dshackle-1to1.py: structural 1:1 proxy invariant gate
Refuses to activate a dshackle config routing >1 upstream for the same chain
(any kind/client) — we cannot attribute traffic to multiple nodes behind one
proxy (no per-upstream request-count metric; conn-seconds biases it), and the
attribution model + placement planner both assume 1:1. Wire into
reload_dshackle.sh BEFORE the reload so a drifting config can never go live.
Host-local by design (the repo doesn't track host->dshackle assignment; 1:1 is
only checkable against the assembled dshackle config at /root/rpc/main_configs).
See /root/proxy-1to1-invariant-plan.md.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-15 00:12:48 +00:00
e67c16a432 cronos-testnet: use v1.7.8-testnet cronosd binary (tcrc bech32)
Mainnet cronosd v1.7.8 embeds crc/crcvaloper prefixes and cannot replay
testnet validator addresses (tcrc/tcrcvaloper), causing crash-loop on start.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-14 15:21:26 +00:00
f0ec0ba784 deploy: regenerate compose from vibe-node main 80a0c8998610 2026-07-14 15:06:31 +00:00
e165b81731 deploy: regenerate compose from vibe-node main bbf5b6cdb835 2026-07-14 12:50:47 +00:00
526f125d5a cronos: persist ws-origins=* in init.sh on every start
Empty ws-origins rejects WebSocket connections with an Origin header
(dshackle head-subscription monitoring). Sed under [json-rpc] like
address/ws-address so restarts keep the value.
2026-07-13 17:09:09 +00:00
14b3d70125 deploy: regenerate compose from vibe-node main e5b8e344f927 2026-07-13 16:58:03 +00:00
ba410ba7f6 plasma: vendor mainnet chain assets (genesis, non-validator config, validator keys) 2026-07-13 16:34:23 +00:00
a761bd7845 deploy: regenerate compose from vibe-node main b9a5ff49c3b4 2026-07-13 15:50:09 +00:00
2e9f31a6fb deploy: regenerate compose from vibe-node main 95fd32365c42 2026-07-13 04:19:56 +00:00
4509b5afd2 op/celo,op/ronin: revert eigenda-proxy 2.7.1 → v2.6.0
Restore prior eigenda-proxy relay image default in generated compose.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-13 01:06:36 +00:00
849f5e3235 op/celo: bump eigenda-proxy v2.6.0 → 2.7.1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 23:36:30 +00:00
59c8d67923 op.ronin: bump eigenda-proxy 2.7.0 → 2.7.1
Update default relay image tag for Ronin mainnet and Saigon testnet
compose profiles.
2026-07-12 20:36:27 +00:00
5dd087f10b fraxtal: bump op-node to v1.19.0-frax-1.2.1
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 17:04:55 +00:00
050c67f48e deploy: regenerate compose from vibe-node main 88f325516e7b 2026-07-12 15:14:49 +00:00
10e8772e85 deploy: regenerate compose from vibe-node main 20e64aa33cad 2026-07-12 12:06:33 +00:00
7ba1b0944b aztec-testnet: bump AZTEC_TESTNET_AZTEC_VERSION to 5.0.0-rc.2
Testnet rollup protocol upgrade; rc.2 passes compatibility check.
2026-07-12 03:12:00 +00:00
rob
932617814a accesslog-shipper: emit __shipstat__ sent-line checkpoints for splits reconciliation
The splits completeness floor is TIME-based (trust hours complete since shipper
connect) and blind to event-loss-by-rotation (2026-07-10: raw_events rotated
every 1-2min, cruncher lost ~85% of us-32 events, floor still called the hours
complete). Shipper now injects {"__shipstat__":1,"sess":..,"sent":N,"ts":..}
every 1000 lines or 30s through the SAME tcp pipe. Cruncher diffs shipper-sent
vs DB-ingested per gateway/hour -> a reconciliation-based floor that catches the
loss a clock cannot. sess=connection-start epoch so resets on reconnect are
detectable. Logic in a mounted .awk file (not inline) to dodge sh/awk quoting.
Verified on busybox:1.36 (systime/fflush OK). NOT deployed until claude@'s
cruncher filters __shipstat__ from event parsing - coordinating via SIP.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 02:41:01 +00:00
ff41ec1c25 deploy: regenerate compose from vibe-node main 642ad0342dde 2026-07-12 02:09:52 +00:00
52d0d7cf05 deploy: regenerate compose from vibe-node main dbd3156992d7 2026-07-11 15:33:25 +00:00
25ba700ea2 Bump vanilla erigon3 compose image tag v3.5.0 → v3.5.1
Regenerated from context.clients.erigon3.client_version bump (ethereum,
gnosis, linea profiles only; polygon/BSC forks unchanged).
2026-07-11 13:07:23 +00:00
a47324ed0a deploy: regenerate compose from vibe-node main 91d4f07dcd8a 2026-07-11 10:32:47 +00:00
rob
ea7d207994 robinhood: nitro archive profile (pebble/hash) - mainnet archive for US-West placement (operator request 2026-07-11); pruned regen picks up filter-log-cache knob
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 05:15:25 +00:00
rob
190a23ceb8 clone-node: port both slowdisk extract fixes from clone-backup (EXDEV transform + script-file listener)
Same duplicated listener code, same two latent bugs. Not exercised today
(de-32 target has SLOWDISK=False) but any clone to a SLOWDISK=True host
would have failed identically.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 04:49:56 +00:00
4cc335cfce deploy: regenerate compose from vibe-node main 6e2f43c9c44b 2026-07-11 02:35:08 +00:00
rob
9898af951a clone-backup: ship the nc listener as a script file - inline bash -c quoting cannot carry --transform expressions
The slowdisk --transform args contain '|' and quotes; the ssh+screen+bash -c
stack strips one quoting level too many and splits the pipeline (broke the
katana retry within minutes of fccf2792). A heredoc-generated
/tmp/transfer_<key>.sh is parsed exactly once on the target. Applies to both
the screen and nohup listener branches; the direct-ssh fallback already had a
single shell layer and stays inline.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 02:21:34 +00:00
rob
fccf279262 slowdisk offload: fix EXDEV - extract statics via tar --transform, not through symlinks
tar cannot create files through a directory symlink whose target is on
another device: open() fails with 'Invalid cross-device link' even under
--keep-directory-symlink (reproduced, GNU tar 1.34 and 1.35). This killed
the katana->uk-4 provision (place-provision-katana-EU-NorthWest-p1) and
means the slowdisk EXTRACT path never worked on hosts with a separate
/slowdisk device. Rewrite member paths with --transform so tar writes
directly into /slowdisk/rpc_<key>__data_<rel>; the symlink stays for the
container's runtime view. Also aligns restore-volumes' nested-path target
naming to the double-underscore convention clone-backup already uses.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 01:50:20 +00:00
defb9133ea deploy: regenerate compose from vibe-node main cea830d7ba6e 2026-07-11 01:20:00 +00:00
dd7d245625 deploy: regenerate compose from vibe-node main 39dc24762604 2026-07-11 00:36:48 +00:00
35f093e620 op/hashkeychain/testnet: add missing Granite–Jovian hardfork activation times
Node was forked at block 30194654 because rollup.json lacked holocene_time
and later fork timestamps; add granite/holocene/isthmus/jovian times so
op-node can apply post-Holocene batches after resync.
2026-07-10 20:31:45 +00:00
rob
f04d2f9440 cronos Dockerfile: support -testnet version suffix (release tag = base version, asset keeps suffix) - testnet builds use tcrc bech32 prefixes; mainnet binary crashes on testnet validator addresses
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 17:58:09 +00:00
3b46f53a4d deploy: regenerate compose from vibe-node main 3c76d7176c60 2026-07-10 17:20:01 +00:00
bd912b3616 deploy: regenerate compose from vibe-node main 92f020f27b22 2026-07-10 17:03:17 +00:00
rob
2814d358fe cronos-testnet: new pruned node compose (cronostestnet_338-3)
Verified from crypto-org-chain/cronos-testnets: genesis, 3 official seeds,
t3 statesync RPC, basetcro denom; official daily snapshots exist for restore
(sidesteps the cosmos binary-upgrade gauntlet). Closes the planner's
'cronos-testnet: no known node_path' escalation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 16:35:38 +00:00
rob
8c73946212 bor: env-parameterize --cache (default 1024 = bor's own default, rendering no-op) - polygon getLogs at 11.6s mean was pure cache starvation on a 125G/104G-free NVMe host
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 16:19:51 +00:00
rob
927afb2dab op-reth: env knobs for --rpc.max-trace-filter-blocks (default 10000 = previous hardcoded) and --rpc.max-response-size (default 160 = reth default) - tracer-mule tuning surface; max-tracing-requests deliberately NOT pinned (reth self-sizes to cores)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:55:51 +00:00
rob
3d22031a12 dshackle overrides: tab guard - dshackle silently skips hot-reloading YAML containing tabs (operator gotcha); refuse to write tabbed output + audit all configs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:17:35 +00:00
rob
091a759367 dshackle overrides: read chain-level disables from .env (DSHACKLE_<CHAIN>_METHOD_GROUPS_DISABLED) - flows from host_vars env_overrides through the standard envfile pipeline; host-local yaml remains as secondary source
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:05:27 +00:00
rob
f85b2f457f dshackle overrides weave: host-local method/option overrides survive config regens
/root/rpc-local/dshackle-overrides.yaml (host-local, like rpc-local/compose.d) is
re-woven into main_configs/*.yaml by reload_dshackle.sh on every config push.
Method-disable decisions are local to each gateway's market (operator eviction
rule: cost_ratio = time_share/call_share at flat pay); this makes them durable
inputs instead of fragile output patches. Step 1 of moving dshackle config
generation onto the gateway hosts (step 2: ssh forced-command upstreams fetch,
generic dshackle.yaml include list derived from drpc-gateways.json).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:04:43 +00:00
rob
2c6938dee5 method-economics.py: host-local method cost-vs-pay analysis
Each gateway serves its own regional market, so the eviction economics
(cost_ratio = time_share/call_share at flat per-call pay) are computed where
they apply: against the local dshackle's histograms. Silent on non-gateway
hosts. Offenders = candidates for per-upstream method-groups/methods disables
(operator eviction rule 2026-07-10). sendRawTransaction et al [protected].

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 15:01:06 +00:00
rob
f88ec86b47 cache knobs: env-parameterize geth/op-geth --cache (default 1024 = geth's own), l2geth --cache (default 8192 = previous hardcoded), nethermind MEMORYHINT (default 2048000000)
All defaults preserve current effective behavior - this deploy is a rendering no-op
until a host_var overrides a value. Part of the resource-optimizer knob rollout
(resource-optimizer/knob-manifest.yaml is the registry; verify_manifest.py enforces
default sync between templates and envfile).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 14:34:10 +00:00
rob
6ccd711ad5 mantle-sepolia: materialize static-peer template change into rendered composes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 14:34:10 +00:00
rob
36f5f34536 ink-mainnet: materialize merged Karst-genesis template changes (PR #38) into rendered composes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 14:33:31 +00:00
rob
5d0bc35eaf nitro: env-parameterized --execution.rpc.filter-log-cache-size (default 32) - getLogs is 22% of arbitrum traffic; big-RAM hosts can cache hours of log blocks
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 13:20:13 +00:00
rob
a8655586db beacon x-upstreams: disable-validation on all beacon-chain upstreams
dshackle 0.79.10's beacon health validator (GET /eth/v1/node/health via
GenericSingleCallValidator) times out after 5000ms on the spec-compliant
empty-body 200 that nimbus returns, marking the upstream UNAVAILABLE in a
flap loop; live requests routed during flap windows fail 'Source was empty'.
This is the root cause behind dRPC's 617k failed validators POSTs complaint
(2026-07-09). Reproduced + workaround verified on an isolated dshackle
instance on de-14. Head tracking still governs availability.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 12:22:18 +00:00
rob
8273fc9c5b aztec-mainnet: new pruned full-node compose (early dRPC presence, EU-West) - L1 via ETHEREUM_MAINNET_* env, p2p 13840
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 07:30:21 +00:00
rob
b824fb0cf4 aztec-testnet: 5.0.0-rc.1 -> 5.0.0-rc.2 - VK tree root mismatch with upgraded testnet rollup (node wedged 'Still waiting' on de-13)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 07:04:14 +00:00
sebastian
75d52b6d00 Merge pull request 'ink mainnet: add Karst genesis from superchain-registry' (#38) from issue-1124 into main
Reviewed-on: #38
2026-07-10 00:57:54 +00:00
dbacd49d86 ink-mainnet: add superchain-registry genesis for op-reth
Vendor the Ink mainnet L2 genesis (chain 57073, karstTime included) from
superchain-registry so op-reth can mount /config/genesis.json.
2026-07-09 23:53:10 +00:00
rob
9f96548ca3 drpc: fix shipper command YAML (colon-space in unquoted scalar broke compose)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 13:24:17 +00:00
rob
dc14e9cf2b drpc: accesslog-shipper sidecar (NDJSON tail -> splits listener)
Decoupled by design: dshackle writes the file regardless; a dead listener
or slow link stalls only the busybox sidecar. Retry resumes at file end
(bounded loss); the listener-side prometheus reconciliation surfaces gaps.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 13:10:10 +00:00
rob
00356d77e6 edge map: +177.54.154.0/24 Singapore (sentinel catch; adjacent /24 is Chicago)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 12:43:57 +00:00
rob
8cc850160d utils: canonical dRPC edge IP prefix -> region map (splits pipeline seed)
7 edge locations from us-16 + de-14 captures: Chicago/Ashburn/LA/Frankfurt/
Falkenstein(=eu-west2)/London/Tokyo/Singapore. /24 granularity mandatory
(adjacent /24s differ by city). eu-west3 reserved for the GCP edge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 12:41:05 +00:00
rob
53162f7ee0 drpc: mount ./dshackle_logs:/logs for the dshackle accessLog
Gateway request-splits pilot (earnings misattribution fix): the accessLog
stub in main_configs pointed at /logs which was never mounted. Host-side
dir lets the splits tailer aggregate per-caller response counts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 12:15:55 +00:00
607 changed files with 87349 additions and 5243 deletions

4
.gitignore vendored
View File

@@ -11,3 +11,7 @@ peer-backups/
snapshots/
*.bak
*.swp
# Task C local peer capture state
peer-state/

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

@@ -54,7 +54,7 @@ services:
environment:
- DATABASE_POOL_SIZE=50
- DATABASE_URL=postgres://postgres:notsecurepassword@abstract-mainnet-archive-db:5430/zksync_local_ext_node
- EN_API_NAMESAPCES=eth,net,web3,debug,pubsub,debug,zks
- EN_API_NAMESPACES=eth,net,web3,debug,pubsub,debug,zks
- EN_ETH_CLIENT_URL=${ETHEREUM_MAINNET_EXECUTION_RPC}
- EN_HEALTHCHECK_PORT=3081
- EN_HTTP_PORT=8545

View File

@@ -54,7 +54,7 @@ services:
environment:
- DATABASE_POOL_SIZE=50
- DATABASE_URL=postgres://postgres:notsecurepassword@abstract-mainnet-db:5430/zksync_local_ext_node
- EN_API_NAMESAPCES=eth,net,web3,debug,pubsub,debug,zks
- EN_API_NAMESPACES=eth,net,web3,debug,pubsub,debug,zks
- EN_ETH_CLIENT_URL=${ETHEREUM_MAINNET_EXECUTION_RPC}
- EN_HEALTHCHECK_PORT=3081
- EN_HTTP_PORT=8545

View File

@@ -54,7 +54,7 @@ services:
environment:
- DATABASE_POOL_SIZE=50
- DATABASE_URL=postgres://postgres:notsecurepassword@abstract-testnet-archive-db:5430/zksync_local_ext_node
- EN_API_NAMESAPCES=eth,net,web3,debug,pubsub,debug,zks
- EN_API_NAMESPACES=eth,net,web3,debug,pubsub,debug,zks
- EN_ETH_CLIENT_URL=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- EN_HEALTHCHECK_PORT=3081
- EN_HTTP_PORT=8545

View File

@@ -54,7 +54,7 @@ services:
environment:
- DATABASE_POOL_SIZE=50
- DATABASE_URL=postgres://postgres:notsecurepassword@abstract-testnet-db:5430/zksync_local_ext_node
- EN_API_NAMESAPCES=eth,net,web3,debug,pubsub,debug,zks
- EN_API_NAMESPACES=eth,net,web3,debug,pubsub,debug,zks
- EN_ETH_CLIENT_URL=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- EN_HEALTHCHECK_PORT=3081
- EN_HTTP_PORT=8545

18
accesslog-shipper.awk Normal file
View File

@@ -0,0 +1,18 @@
# Streams dshackle access-log lines unchanged, and every 1000 lines OR 30s
# injects a __shipstat__ checkpoint carrying the cumulative sent-count for this
# connection. The splits cruncher (claude host) filters these OUT of event
# processing and uses them to reconcile shipped-vs-ingested per gateway per hour
# — the completeness signal the time-based floor cannot see (event-loss-by-
# rotation, 2026-07-10). `sess` = connection-start epoch so the cruncher detects
# counter resets on shipper reconnect (retry loop resumes at file END).
BEGIN { sess = systime(); last = sess; n = 0 }
{
n++
print
now = systime()
if (n % 1000 == 0 || now - last >= 30) {
printf "{\"__shipstat__\":1,\"sess\":%d,\"sent\":%d,\"ts\":%d}\n", sess, n, now
fflush()
last = now
}
}

143
apply-dshackle-overrides.py Executable file
View File

@@ -0,0 +1,143 @@
#!/usr/bin/env python3
"""apply-dshackle-overrides.py - weave HOST-LOCAL dshackle upstream overrides into
the generated main_configs/*.yaml so they survive every configure-drpc regeneration.
Override file (NOT in the repo - host-local, like rpc-local/compose.d):
/root/rpc-local/dshackle-overrides.yaml
Schema (match by upstream id OR by chain; id wins):
upstreams:
uk-4-base-mainnet-op-reth-pruned: # or e.g. "chain:base"
method_groups_disabled: [trace, debug] # removed from enabled, added to disabled
methods_disabled: [eth_getFilterLogs] # per-method disables (methods.disabled)
options:
disable-validation: true # merged into upstream options
Rationale: heavy methods at flat per-call pay poison the chain's latency scoring
(operator method-eviction rule 2026-07-10; see method-economics.py). The disable
decision is local to the gateway's market, so the config lives on the gateway.
Called by reload_dshackle.sh before signaling dshackle - i.e. re-applied on every
ansible config push. NOTE: dshackle only re-reads upstream method lists on RESTART;
this keeps the on-disk config permanently correct, the next restart activates it.
Idempotent. Silent no-op when the override file is absent.
"""
import glob
import os
import sys
import yaml
OVERRIDES = '/root/rpc-local/dshackle-overrides.yaml'
CONFIG_DIR = '/root/rpc/main_configs'
def apply(upstream, ov):
changed = False
mg = upstream.setdefault('method-groups', {}) or {}
for grp in ov.get('method_groups_disabled') or []:
en = mg.get('enabled') or []
if grp in en:
en.remove(grp)
mg['enabled'] = en
changed = True
dis = mg.get('disabled') or []
if grp not in dis:
dis.append(grp)
mg['disabled'] = dis
changed = True
if mg:
upstream['method-groups'] = mg
for meth in ov.get('methods_disabled') or []:
methods = upstream.setdefault('methods', {}) or {}
dis = methods.get('disabled') or []
if not any((d.get('name') if isinstance(d, dict) else d) == meth for d in dis):
dis.append({'name': meth})
methods['disabled'] = dis
upstream['methods'] = methods
changed = True
for k, v in (ov.get('options') or {}).items():
opts = upstream.setdefault('options', {}) or {}
if opts.get(k) != v:
opts[k] = v
upstream['options'] = opts
changed = True
return changed
ENVFILE = '/root/rpc/.env'
def env_overrides():
"""Chain-level overrides from .env (rendered from host_vars env_overrides):
DSHACKLE_<CHAIN>_METHOD_GROUPS_DISABLED=trace,debug
DSHACKLE_<CHAIN>_METHODS_DISABLED=eth_getFilterLogs
<CHAIN> = dshackle chain name, upper, '-' -> '_' (e.g. BASE, ETH_BEACON_CHAIN)."""
spec = {}
if not os.path.exists(ENVFILE):
return spec
import re as _re
for line in open(ENVFILE):
m = _re.match(r'DSHACKLE_([A-Z0-9_]+)_(METHOD_GROUPS|METHODS)_DISABLED=(.*)', line.strip())
if not m:
continue
chain = m.group(1).lower().replace('_', '-')
key = 'method_groups_disabled' if m.group(2) == 'METHOD_GROUPS' else 'methods_disabled'
vals = [v.strip() for v in m.group(3).split(',') if v.strip()]
if vals:
spec.setdefault(f'chain:{chain}', {}).setdefault(key, []).extend(vals)
return spec
def main():
spec = env_overrides()
if os.path.exists(OVERRIDES):
for k, v in ((yaml.safe_load(open(OVERRIDES)) or {}).get('upstreams') or {}).items():
cur = spec.setdefault(k, {})
for kk, vv in (v or {}).items():
if isinstance(vv, list):
cur[kk] = sorted(set((cur.get(kk) or []) + vv))
else:
cur.setdefault(kk, vv)
if not spec:
return
total = 0
for path in glob.glob(os.path.join(CONFIG_DIR, '*.yaml')):
try:
doc = yaml.safe_load(open(path))
except yaml.YAMLError:
continue
if not isinstance(doc, dict) or 'upstreams' not in doc:
continue
changed = False
for up in doc['upstreams'] or []:
if not isinstance(up, dict):
continue
ov = spec.get(up.get('id')) or spec.get(f"chain:{up.get('chain')}")
if ov and apply(up, ov):
changed = True
if changed:
text = yaml.safe_dump(doc, default_flow_style=False, sort_keys=False)
# dshackle silently refuses to hot-reload configs containing TABS
# (operator gotcha 2026-07-10) - fail loudly, never write a tabbed file.
if '\t' in text:
print(f'dshackle-overrides: REFUSING to write {path} - tab in output')
continue
with open(path, 'w') as f:
f.write(text)
total += 1
print(f'dshackle-overrides: rewove {path}')
# tab audit on ALL configs (even unchanged): a tabbed file silently fails
# dshackle's hot-reload, so disk and running state diverge invisibly.
for path in glob.glob(os.path.join(CONFIG_DIR, '*.yaml')):
try:
if '\t' in open(path, errors='replace').read():
print(f'dshackle-overrides: WARNING {path} contains TABS - dshackle will SILENTLY skip reloading it')
except OSError:
pass
if total:
print(f'dshackle-overrides: {total} file(s) rewoven (dshackle hot-reloads on the HUP that follows)')
if __name__ == '__main__':
main()

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/alephzero-mainnet-archive
- --persistent.db-engine=pebble

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/alephzero-mainnet
- --persistent.db-engine=pebble

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/alephzero-sepolia-archive
- --persistent.db-engine=pebble

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/alephzero-sepolia
- --persistent.db-engine=pebble

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
apechain-mainnet-archive:
image: ${APECHAIN_NITRO_IMAGE:-public.ecr.aws/i6b2w2n6/nitro-node}:${APECHAIN_MAINNET_NITRO_VERSION:-apechain-v3.5.6}
image: ${APECHAIN_NITRO_IMAGE:-public.ecr.aws/i6b2w2n6/nitro-node}:${APECHAIN_MAINNET_NITRO_VERSION:-apechain-3.9.9}
sysctls:
# TCP Performance
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:
apechain-mainnet:
image: ${APECHAIN_NITRO_IMAGE:-public.ecr.aws/i6b2w2n6/nitro-node}:${APECHAIN_MAINNET_NITRO_VERSION:-apechain-v3.5.6}
image: ${APECHAIN_NITRO_IMAGE:-public.ecr.aws/i6b2w2n6/nitro-node}:${APECHAIN_MAINNET_NITRO_VERSION:-apechain-3.9.9}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -69,6 +69,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-nova-archive
- --ws.addr=0.0.0.0

View File

@@ -69,6 +69,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-nova-archive
- --persistent.db-engine=pebble

View File

@@ -70,6 +70,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-nova-minimal
- --persistent.db-engine=pebble

View File

@@ -69,6 +69,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-nova-minimal
- --persistent.db-engine=pebble

View File

@@ -70,6 +70,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-nova
- --persistent.db-engine=pebble

View File

@@ -69,6 +69,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-nova
- --persistent.db-engine=pebble

View File

@@ -70,6 +70,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-one-archive
- --ws.addr=0.0.0.0

View File

@@ -70,6 +70,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-one-archive
- --persistent.db-engine=pebble

View File

@@ -69,6 +69,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-one-archive
- --persistent.db-engine=pebble

View File

@@ -70,6 +70,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-one-minimal
- --persistent.db-engine=pebble

View File

@@ -69,6 +69,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-one-minimal
- --persistent.db-engine=pebble

View File

@@ -71,6 +71,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-one
- --persistent.db-engine=pebble

View File

@@ -70,6 +70,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-one
- --persistent.db-engine=pebble

View File

@@ -70,6 +70,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-one
- --persistent.db-engine=pebble

View File

@@ -69,6 +69,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-one
- --persistent.db-engine=pebble

View File

@@ -70,6 +70,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-sepolia-archive
- --persistent.db-engine=pebble

View File

@@ -71,6 +71,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-sepolia-minimal
- --persistent.db-engine=pebble

View File

@@ -70,6 +70,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-sepolia-minimal
- --persistent.db-engine=pebble

View File

@@ -71,6 +71,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-sepolia
- --persistent.db-engine=pebble

View File

@@ -70,6 +70,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/arbitrum-sepolia
- --persistent.db-engine=pebble

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/connext-sepolia-archive
- --ws.addr=0.0.0.0
@@ -116,7 +117,7 @@ x-upstreams:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: everclear-sepolia
chain:
method-groups:
enabled:
- debug

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/connext-sepolia
- --persistent.db-engine=pebble
@@ -117,7 +118,7 @@ x-upstreams:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: everclear-sepolia
chain:
method-groups:
enabled:
- debug

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/everclear-mainnet-archive
- --ws.addr=0.0.0.0

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/everclear-mainnet
- --persistent.db-engine=pebble

View File

@@ -0,0 +1,144 @@
---
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:arb/nitro/humanity-mainnet-nitro-pruned-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/humanity-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
humanity-mainnet:
image: ${HUMANITY_NITRO_IMAGE:-offchainlabs/nitro-node}:${HUMANITY_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
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
command:
- --conf.file=/config/baseConfig.json
- --execution.caching.archive=${HUMANITY_MAINNET_ARCHIVE_DB:-false}
- --execution.caching.database-cache=${HUMANITY_MAINNET_NITRO_PRUNED_PEBBLE_HASH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${HUMANITY_MAINNET_NITRO_PRUNED_PEBBLE_HASH_SNAPSHOT_CACHE:-400}
- --execution.caching.trie-clean-cache=${HUMANITY_MAINNET_NITRO_PRUNED_PEBBLE_HASH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${HUMANITY_MAINNET_NITRO_PRUNED_PEBBLE_HASH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://humanity-main.g.alchemy.com/public
- --execution.rpc.gas-cap=5500000000
- --execution.rpc.log-history=0
- --execution.sequencer.enable=false
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,arb,txpool,debug
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.prune=full
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://humanity-main.g.alchemy.com/public
- --node.feed.input.url=wss://humanity-main.g.alchemy.com/public
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.connection.url=${ARBITRUM_ONE_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/humanity-mainnet
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${HUMANITY_MAINNET_NITRO_PRUNED_PEBBLE_HASH_DATA:-humanity-mainnet-nitro-pruned-pebble-hash}:/root/.arbitrum
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6070
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.humanity-mainnet-nitro-pruned-pebble-hash-stripprefix.stripprefix.prefixes=/humanity-mainnet
- traefik.http.services.humanity-mainnet-nitro-pruned-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.humanity-mainnet-nitro-pruned-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.humanity-mainnet-nitro-pruned-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.humanity-mainnet-nitro-pruned-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/humanity-mainnet`) || Path(`/humanity-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.humanity-mainnet-nitro-pruned-pebble-hash.rule=Path(`/humanity-mainnet`) || Path(`/humanity-mainnet/`)}
- traefik.http.routers.humanity-mainnet-nitro-pruned-pebble-hash.middlewares=humanity-mainnet-nitro-pruned-pebble-hash-stripprefix, ipallowlist
volumes:
humanity-mainnet-nitro-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: humanity
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,143 @@
---
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:arb/nitro/humanity-mainnet-nitro-pruned-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/humanity-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
humanity-mainnet:
image: ${HUMANITY_NITRO_IMAGE:-offchainlabs/nitro-node}:${HUMANITY_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
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
command:
- --conf.file=/config/baseConfig.json
- --execution.caching.archive=${HUMANITY_MAINNET_ARCHIVE_DB:-false}
- --execution.caching.database-cache=${HUMANITY_MAINNET_NITRO_PRUNED_PEBBLE_HASH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${HUMANITY_MAINNET_NITRO_PRUNED_PEBBLE_HASH_SNAPSHOT_CACHE:-400}
- --execution.caching.trie-clean-cache=${HUMANITY_MAINNET_NITRO_PRUNED_PEBBLE_HASH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${HUMANITY_MAINNET_NITRO_PRUNED_PEBBLE_HASH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://humanity-main.g.alchemy.com/public
- --execution.rpc.gas-cap=5500000000
- --execution.rpc.log-history=0
- --execution.sequencer.enable=false
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,arb,txpool,debug
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://humanity-main.g.alchemy.com/public
- --node.feed.input.url=wss://humanity-main.g.alchemy.com/public
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.connection.url=${ARBITRUM_ONE_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/humanity-mainnet
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${HUMANITY_MAINNET_NITRO_PRUNED_PEBBLE_HASH_DATA:-humanity-mainnet-nitro-pruned-pebble-hash}:/root/.arbitrum
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6070
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.humanity-mainnet-nitro-pruned-pebble-hash-stripprefix.stripprefix.prefixes=/humanity-mainnet
- traefik.http.services.humanity-mainnet-nitro-pruned-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.humanity-mainnet-nitro-pruned-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.humanity-mainnet-nitro-pruned-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.humanity-mainnet-nitro-pruned-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/humanity-mainnet`) || Path(`/humanity-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.humanity-mainnet-nitro-pruned-pebble-hash.rule=Path(`/humanity-mainnet`) || Path(`/humanity-mainnet/`)}
- traefik.http.routers.humanity-mainnet-nitro-pruned-pebble-hash.middlewares=humanity-mainnet-nitro-pruned-pebble-hash-stripprefix, ipallowlist
volumes:
humanity-mainnet-nitro-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: humanity
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,144 @@
---
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:arb/nitro/humanity-testnet-nitro-pruned-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/humanity-testnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
humanity-testnet:
image: ${HUMANITY_NITRO_IMAGE:-offchainlabs/nitro-node}:${HUMANITY_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
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
command:
- --conf.file=/config/baseConfig.json
- --execution.caching.archive=${HUMANITY_TESTNET_ARCHIVE_DB:-false}
- --execution.caching.database-cache=${HUMANITY_TESTNET_NITRO_PRUNED_PEBBLE_HASH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${HUMANITY_TESTNET_NITRO_PRUNED_PEBBLE_HASH_SNAPSHOT_CACHE:-400}
- --execution.caching.trie-clean-cache=${HUMANITY_TESTNET_NITRO_PRUNED_PEBBLE_HASH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${HUMANITY_TESTNET_NITRO_PRUNED_PEBBLE_HASH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://rpc.testnet.humanity.org
- --execution.rpc.gas-cap=5500000000
- --execution.rpc.log-history=0
- --execution.sequencer.enable=false
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,arb,txpool,debug
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.prune=full
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://rpc.testnet.humanity.org
- --node.feed.input.url=wss://rpc.testnet.humanity.org
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.connection.url=${ARBITRUM_ONE_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/humanity-testnet
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${HUMANITY_TESTNET_NITRO_PRUNED_PEBBLE_HASH_DATA:-humanity-testnet-nitro-pruned-pebble-hash}:/root/.arbitrum
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6070
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.humanity-testnet-nitro-pruned-pebble-hash-stripprefix.stripprefix.prefixes=/humanity-testnet
- traefik.http.services.humanity-testnet-nitro-pruned-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.humanity-testnet-nitro-pruned-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.humanity-testnet-nitro-pruned-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.humanity-testnet-nitro-pruned-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/humanity-testnet`) || Path(`/humanity-testnet/`))}
- ${NO_SSL:+traefik.http.routers.humanity-testnet-nitro-pruned-pebble-hash.rule=Path(`/humanity-testnet`) || Path(`/humanity-testnet/`)}
- traefik.http.routers.humanity-testnet-nitro-pruned-pebble-hash.middlewares=humanity-testnet-nitro-pruned-pebble-hash-stripprefix, ipallowlist
volumes:
humanity-testnet-nitro-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: humanity-testnet
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,143 @@
---
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:arb/nitro/humanity-testnet-nitro-pruned-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/humanity-testnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
humanity-testnet:
image: ${HUMANITY_NITRO_IMAGE:-offchainlabs/nitro-node}:${HUMANITY_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
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
command:
- --conf.file=/config/baseConfig.json
- --execution.caching.archive=${HUMANITY_TESTNET_ARCHIVE_DB:-false}
- --execution.caching.database-cache=${HUMANITY_TESTNET_NITRO_PRUNED_PEBBLE_HASH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${HUMANITY_TESTNET_NITRO_PRUNED_PEBBLE_HASH_SNAPSHOT_CACHE:-400}
- --execution.caching.trie-clean-cache=${HUMANITY_TESTNET_NITRO_PRUNED_PEBBLE_HASH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${HUMANITY_TESTNET_NITRO_PRUNED_PEBBLE_HASH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://rpc.testnet.humanity.org
- --execution.rpc.gas-cap=5500000000
- --execution.rpc.log-history=0
- --execution.sequencer.enable=false
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,arb,txpool,debug
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://rpc.testnet.humanity.org
- --node.feed.input.url=wss://rpc.testnet.humanity.org
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.connection.url=${ARBITRUM_ONE_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/humanity-testnet
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${HUMANITY_TESTNET_NITRO_PRUNED_PEBBLE_HASH_DATA:-humanity-testnet-nitro-pruned-pebble-hash}:/root/.arbitrum
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6070
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.humanity-testnet-nitro-pruned-pebble-hash-stripprefix.stripprefix.prefixes=/humanity-testnet
- traefik.http.services.humanity-testnet-nitro-pruned-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.humanity-testnet-nitro-pruned-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.humanity-testnet-nitro-pruned-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.humanity-testnet-nitro-pruned-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/humanity-testnet`) || Path(`/humanity-testnet/`))}
- ${NO_SSL:+traefik.http.routers.humanity-testnet-nitro-pruned-pebble-hash.rule=Path(`/humanity-testnet`) || Path(`/humanity-testnet/`)}
- traefik.http.routers.humanity-testnet-nitro-pruned-pebble-hash.middlewares=humanity-testnet-nitro-pruned-pebble-hash-stripprefix, ipallowlist
volumes:
humanity-testnet-nitro-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: humanity-testnet
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

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/plume-mainnet-archive
- --ws.addr=0.0.0.0

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/plume-mainnet-archive
- --persistent.db-engine=pebble

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/plume-mainnet
- --ws.addr=0.0.0.0

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/plume-mainnet
- --persistent.db-engine=pebble

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/plume-testnet-archive
- --ws.addr=0.0.0.0

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/plume-testnet-archive
- --persistent.db-engine=pebble

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/plume-testnet
- --ws.addr=0.0.0.0

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/plume-testnet
- --persistent.db-engine=pebble

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/real-mainnet-archive
- --ws.addr=0.0.0.0

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/real-mainnet-archive
- --persistent.db-engine=pebble

View File

@@ -74,6 +74,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/real-mainnet
- --persistent.db-engine=pebble

View File

@@ -0,0 +1,143 @@
---
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:arb/nitro/robinhood-mainnet-nitro-archive-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/robinhood-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
robinhood-mainnet-archive:
image: ${ROBINHOOD_NITRO_IMAGE:-offchainlabs/nitro-node}:${ROBINHOOD_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
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
command:
- --conf.file=/config/baseConfig.json
- --execution.caching.archive=true
- --execution.caching.database-cache=${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_SNAPSHOT_CACHE:-400}
- --execution.caching.trie-clean-cache=${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://rpc.mainnet.chain.robinhood.com
- --execution.rpc.filter-log-cache-size=${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_FILTER_LOG_CACHE:-32}
- --execution.rpc.gas-cap=5500000000
- --execution.rpc.log-history=0
- --execution.sequencer.enable=false
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,arb,txpool,debug
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.feed.input.url=wss://feed.mainnet.chain.robinhood.com
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/robinhood-mainnet-archive
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ROBINHOOD_MAINNET_NITRO_ARCHIVE_PEBBLE_HASH_DATA:-robinhood-mainnet-nitro-archive-pebble-hash}:/root/.arbitrum
- ./arb/robinhood/mainnet:/config
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6070
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.robinhood-mainnet-nitro-archive-pebble-hash-stripprefix.stripprefix.prefixes=/robinhood-mainnet-archive
- traefik.http.services.robinhood-mainnet-nitro-archive-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-archive-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-archive-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-archive-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/robinhood-mainnet-archive`) || Path(`/robinhood-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.robinhood-mainnet-nitro-archive-pebble-hash.rule=Path(`/robinhood-mainnet-archive`) || Path(`/robinhood-mainnet-archive/`)}
- traefik.http.routers.robinhood-mainnet-nitro-archive-pebble-hash.middlewares=robinhood-mainnet-nitro-archive-pebble-hash-stripprefix, ipallowlist
volumes:
robinhood-mainnet-nitro-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: robinhood
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

@@ -71,6 +71,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_MAINNET_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_MAINNET_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_MAINNET_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/robinhood-mainnet
- --persistent.db-engine=pebble

View File

@@ -0,0 +1,143 @@
---
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:arb/nitro/robinhood-testnet-nitro-archive-pebble-hash.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/robinhood-testnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
robinhood-testnet-archive:
image: ${ROBINHOOD_NITRO_IMAGE:-offchainlabs/nitro-node}:${ROBINHOOD_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
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
command:
- --conf.file=/config/baseConfig.json
- --execution.caching.archive=true
- --execution.caching.database-cache=${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_SNAPSHOT_CACHE:-400}
- --execution.caching.trie-clean-cache=${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://rpc.testnet.chain.robinhood.com
- --execution.rpc.filter-log-cache-size=${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_FILTER_LOG_CACHE:-32}
- --execution.rpc.gas-cap=5500000000
- --execution.rpc.log-history=0
- --execution.sequencer.enable=false
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,arb,txpool,debug
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.feed.input.url=wss://feed.testnet.chain.robinhood.com
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/robinhood-testnet-archive
- --persistent.db-engine=pebble
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ROBINHOOD_TESTNET_NITRO_ARCHIVE_PEBBLE_HASH_DATA:-robinhood-testnet-nitro-archive-pebble-hash}:/root/.arbitrum
- ./arb/robinhood/testnet:/config
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=6070
- prometheus-scrape.path=/debug/metrics/prometheus
- traefik.enable=true
- traefik.http.middlewares.robinhood-testnet-nitro-archive-pebble-hash-stripprefix.stripprefix.prefixes=/robinhood-testnet-archive
- traefik.http.services.robinhood-testnet-nitro-archive-pebble-hash.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-archive-pebble-hash.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-archive-pebble-hash.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-archive-pebble-hash.rule=Host(`$DOMAIN`) && (Path(`/robinhood-testnet-archive`) || Path(`/robinhood-testnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.robinhood-testnet-nitro-archive-pebble-hash.rule=Path(`/robinhood-testnet-archive`) || Path(`/robinhood-testnet-archive/`)}
- traefik.http.routers.robinhood-testnet-nitro-archive-pebble-hash.middlewares=robinhood-testnet-nitro-archive-pebble-hash-stripprefix, ipallowlist
volumes:
robinhood-testnet-nitro-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: robinhood-testnet
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

@@ -71,6 +71,7 @@ services:
- --node.sequencer=false
- --node.staker.enable=false
- --parent-chain.blob-client.beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST}
- --parent-chain.blob-client.secondary-beacon-url=${ETHEREUM_SEPOLIA_BEACON_REST_FALLBACK}
- --parent-chain.connection.url=${ETHEREUM_SEPOLIA_EXECUTION_RPC}
- --persistent.chain=/root/.arbitrum/robinhood-testnet
- --persistent.db-engine=pebble

View File

@@ -45,7 +45,7 @@ services:
arc-mainnet-archive-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets]
command: [chown 999:999 /sockets]
restart: no
depends_on:
arc-mainnet-archive-consensus-init:
@@ -160,6 +160,9 @@ volumes:
arc-mainnet-reth-archive-trace-execution:
arc-mainnet-reth-archive-trace-sockets:
x-ephemeral-volumes:
- arc-mainnet-reth-archive-trace-sockets
x-upstreams:
- id: $${ID}
labels:

View File

@@ -45,7 +45,7 @@ services:
arc-mainnet-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets]
command: [chown 999:999 /sockets]
restart: no
depends_on:
arc-mainnet-consensus-init:
@@ -92,6 +92,7 @@ services:
- --ipcpath=/sockets/reth.ipc
- --log.file.directory=/data/execution/logs
- --metrics=0.0.0.0:9001
- --prune.block-interval=5000
- --rpc.forwarder=https://rpc.arc.network/
restart: unless-stopped
stop_grace_period: 5m
@@ -161,6 +162,9 @@ volumes:
arc-mainnet-reth-pruned-trace-execution:
arc-mainnet-reth-pruned-trace-sockets:
x-ephemeral-volumes:
- arc-mainnet-reth-pruned-trace-sockets
x-upstreams:
- id: $${ID}
labels:

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arc-testnet-archive-consensus-init:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.7.2}
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.8.0}
user: 0:0
entrypoint: [/usr/local/bin/arc-node-consensus, init]
command:
@@ -45,7 +45,7 @@ services:
arc-testnet-archive-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets]
command: [chown 999:999 /sockets]
restart: no
depends_on:
arc-testnet-archive-consensus-init:
@@ -57,7 +57,7 @@ services:
logging: *logging-defaults
arc-testnet-archive:
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_RETH_VERSION:-0.7.2}
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_RETH_VERSION:-0.8.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -119,7 +119,7 @@ services:
shm_size: 2gb
arc-testnet-archive-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.7.2}
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.8.0}
user: 0:0
expose:
- 31000
@@ -160,6 +160,9 @@ volumes:
arc-testnet-reth-archive-trace-execution:
arc-testnet-reth-archive-trace-sockets:
x-ephemeral-volumes:
- arc-testnet-reth-archive-trace-sockets
x-upstreams:
- id: $${ID}
labels:

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arc-testnet-consensus-init:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.7.2}
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.8.0}
user: 0:0
entrypoint: [/usr/local/bin/arc-node-consensus, init]
command:
@@ -45,7 +45,7 @@ services:
arc-testnet-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets]
command: [chown 999:999 /sockets]
restart: no
depends_on:
arc-testnet-consensus-init:
@@ -57,7 +57,7 @@ services:
logging: *logging-defaults
arc-testnet:
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_RETH_VERSION:-0.7.2}
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_RETH_VERSION:-0.8.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -92,6 +92,7 @@ services:
- --ipcpath=/sockets/reth.ipc
- --log.file.directory=/data/execution/logs
- --metrics=0.0.0.0:9001
- --prune.block-interval=5000
- --rpc.forwarder=https://rpc.quicknode.testnet.arc.network/
restart: unless-stopped
stop_grace_period: 5m
@@ -120,7 +121,7 @@ services:
shm_size: 2gb
arc-testnet-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.7.2}
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.8.0}
user: 0:0
expose:
- 31000
@@ -161,6 +162,9 @@ volumes:
arc-testnet-reth-pruned-trace-execution:
arc-testnet-reth-pruned-trace-sockets:
x-ephemeral-volumes:
- arc-testnet-reth-pruned-trace-sockets
x-upstreams:
- id: $${ID}
labels:

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arc-testnet-consensus-init:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.7.2}
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.8.0}
user: 0:0
entrypoint: [/usr/local/bin/arc-node-consensus, init]
command:
@@ -45,7 +45,7 @@ services:
arc-testnet-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [rm -f /sockets/*.ipc && chown 999:999 /sockets]
command: [chown 999:999 /sockets]
restart: no
depends_on:
arc-testnet-consensus-init:
@@ -57,7 +57,7 @@ services:
logging: *logging-defaults
arc-testnet:
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_RETH_VERSION:-0.7.2}
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_RETH_VERSION:-0.8.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -92,6 +92,7 @@ services:
- --ipcpath=/sockets/reth.ipc
- --log.file.directory=/data/execution/logs
- --metrics=0.0.0.0:9001
- --prune.block-interval=5000
- --rpc.forwarder=https://rpc.quicknode.testnet.arc.network/
restart: unless-stopped
stop_grace_period: 5m
@@ -120,7 +121,7 @@ services:
shm_size: 2gb
arc-testnet-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.7.2}
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.8.0}
user: 0:0
expose:
- 31000
@@ -161,6 +162,9 @@ volumes:
arc-testnet-reth-pruned-execution:
arc-testnet-reth-pruned-sockets:
x-ephemeral-volumes:
- arc-testnet-reth-pruned-sockets
x-upstreams:
- id: $${ID}
labels:

View File

@@ -2,5 +2,18 @@
"state-sync-enabled": false,
"pruning-enabled": false,
"rpc-gas-cap": 2500000000,
"eth-rpc-gas-limit": 2500000000
"eth-rpc-gas-limit": 2500000000,
"eth-apis": [
"eth",
"eth-filter",
"net",
"web3",
"internal-eth",
"internal-blockchain",
"internal-transaction",
"debug",
"debug-tracer",
"debug-file-tracer",
"debug-handler"
]
}

View File

@@ -1,4 +1,19 @@
{
"rpc-gas-cap": 2500000000,
"eth-rpc-gas-limit": 2500000000
}
"eth-rpc-gas-limit": 2500000000,
"state-sync-enabled": true,
"state-sync-skip-resume": true,
"eth-apis": [
"eth",
"eth-filter",
"net",
"web3",
"internal-eth",
"internal-blockchain",
"internal-transaction",
"debug",
"debug-tracer",
"debug-file-tracer",
"debug-handler"
]
}

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
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:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -107,7 +107,7 @@ x-upstreams:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: avalanche
chain: avalanche-fuji
method-groups:
enabled:
- debug

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
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:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -107,7 +107,7 @@ x-upstreams:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: avalanche
chain: avalanche-fuji
method-groups:
enabled:
- debug

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
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:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -107,7 +107,7 @@ x-upstreams:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: avalanche
chain: avalanche-fuji
method-groups:
enabled:
- debug

View File

@@ -1,119 +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:avalanche/go/avalanche-fuji-go-pruned-pebbledb.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/avalanche-fuji \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
avalanche-fuji:
image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.14.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:
- 10350:10350
- 10350:10350/udp
expose:
- 9650
entrypoint: [/bin/sh, -c, mkdir -p /root/.avalanchego/offline-pruning && exec /avalanchego/build/avalanchego "$@", --]
command:
- --chain-config-dir=/config/prune
- --db-type=pebbledb
- --http-allowed-hosts=*
- --http-host=
- --network-id=fuji
- --public-ip=${IP}
- --staking-port=10350
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${AVALANCHE_FUJI_GO_PRUNED_PEBBLEDB_DATA:-avalanche-fuji-go-pruned-pebbledb}:/root/.avalanchego
- ./avalanche/fuji:/config
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=false
- traefik.enable=true
- traefik.http.middlewares.avalanche-fuji-go-pruned-pebbledb-set-path.replacepath.path=/ext/bc/C/rpc
- traefik.http.middlewares.avalanche-fuji-go-pruned-pebbledb-stripprefix.stripprefix.prefixes=/avalanche-fuji
- traefik.http.services.avalanche-fuji-go-pruned-pebbledb.loadbalancer.server.port=9650
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`))}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.rule=Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)}
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.middlewares=avalanche-fuji-go-pruned-pebbledb-stripprefix, avalanche-fuji-go-pruned-pebbledb-set-path, ipallowlist
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.priority=50 # gets any request that is not GET with UPGRADE header
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.priority=100 # answers GET requests first
- traefik.http.middlewares.avalanche-fuji-go-pruned-pebbledb-set-ws-path.replacepath.path=/ext/bc/C/ws
- traefik.http.services.avalanche-fuji-go-pruned-pebbledb-ws.loadbalancer.server.port=9650
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.service=avalanche-fuji-go-pruned-pebbledb-ws
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.service=avalanche-fuji-go-pruned-pebbledb
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.rule=(Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.middlewares=avalanche-fuji-go-pruned-pebbledb-stripprefix, avalanche-fuji-go-pruned-pebbledb-set-ws-path, ipallowlist
volumes:
avalanche-fuji-go-pruned-pebbledb:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: avalanche
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -1,119 +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:avalanche/go/avalanche-fuji-go-pruned-pebbledb.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/avalanche-fuji \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
avalanche-fuji:
image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_FUJI_GO_VERSION:-v1.14.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:
- 10350:10350
- 10350:10350/udp
expose:
- 9650
entrypoint: [/avalanchego/build/avalanchego]
command:
- --chain-config-dir=/config/pruned
- --db-type=pebbledb
- --http-allowed-hosts=*
- --http-host=
- --network-id=fuji
- --public-ip=${IP}
- --staking-port=10350
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${AVALANCHE_FUJI_GO_PRUNED_PEBBLEDB_DATA:-avalanche-fuji-go-pruned-pebbledb}:/root/.avalanchego
- ./avalanche/fuji:/config
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=false
- traefik.enable=true
- traefik.http.middlewares.avalanche-fuji-go-pruned-pebbledb-set-path.replacepath.path=/ext/bc/C/rpc
- traefik.http.middlewares.avalanche-fuji-go-pruned-pebbledb-stripprefix.stripprefix.prefixes=/avalanche-fuji
- traefik.http.services.avalanche-fuji-go-pruned-pebbledb.loadbalancer.server.port=9650
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`))}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.rule=Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)}
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.middlewares=avalanche-fuji-go-pruned-pebbledb-stripprefix, avalanche-fuji-go-pruned-pebbledb-set-path, ipallowlist
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.priority=50 # gets any request that is not GET with UPGRADE header
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.priority=100 # answers GET requests first
- traefik.http.middlewares.avalanche-fuji-go-pruned-pebbledb-set-ws-path.replacepath.path=/ext/bc/C/ws
- traefik.http.services.avalanche-fuji-go-pruned-pebbledb-ws.loadbalancer.server.port=9650
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.service=avalanche-fuji-go-pruned-pebbledb-ws
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb.service=avalanche-fuji-go-pruned-pebbledb
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.rule=(Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-fuji-go-pruned-pebbledb-ws.middlewares=avalanche-fuji-go-pruned-pebbledb-stripprefix, avalanche-fuji-go-pruned-pebbledb-set-ws-path, ipallowlist
volumes:
avalanche-fuji-go-pruned-pebbledb:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: avalanche
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -0,0 +1,120 @@
---
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:avalanche/go/avalanche-mainnet-go-firewood-firewood.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/avalanche-mainnet-firewood \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
avalanche-mainnet-firewood:
image: ${AVALANCHE_GO_IMAGE:-avaplatform/avalanchego}:${AVALANCHE_MAINNET_GO_VERSION:-v1.14.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:
- 13144:13144
- 13144:13144/udp
expose:
- 9650
entrypoint: [/avalanchego/build/avalanchego]
command:
- --chain-config-dir=/config/firewood
- --coreth-state-scheme=firewood
- --db-type=firewood
- --http-allowed-hosts=*
- --http-host=
- --network-id=mainnet
- --public-ip=${IP}
- --staking-port=13144
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${AVALANCHE_MAINNET_GO_FIREWOOD_FIREWOOD_DATA:-avalanche-mainnet-go-firewood-firewood}:/root/.avalanchego
- ./avalanche/mainnet:/config
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=false
- traefik.enable=true
- traefik.http.middlewares.avalanche-mainnet-go-firewood-firewood-set-path.replacepath.path=/ext/bc/C/rpc
- traefik.http.middlewares.avalanche-mainnet-go-firewood-firewood-stripprefix.stripprefix.prefixes=/avalanche-mainnet-firewood
- traefik.http.services.avalanche-mainnet-go-firewood-firewood.loadbalancer.server.port=9650
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-firewood-firewood.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-firewood-firewood.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-firewood-firewood.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet-firewood`) || Path(`/avalanche-mainnet-firewood/`))}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-firewood-firewood.rule=Path(`/avalanche-mainnet-firewood`) || Path(`/avalanche-mainnet-firewood/`)}
- traefik.http.routers.avalanche-mainnet-go-firewood-firewood.middlewares=avalanche-mainnet-go-firewood-firewood-stripprefix, avalanche-mainnet-go-firewood-firewood-set-path, ipallowlist
- traefik.http.routers.avalanche-mainnet-go-firewood-firewood.priority=50 # gets any request that is not GET with UPGRADE header
- traefik.http.routers.avalanche-mainnet-go-firewood-firewood-ws.priority=100 # answers GET requests first
- traefik.http.middlewares.avalanche-mainnet-go-firewood-firewood-set-ws-path.replacepath.path=/ext/bc/C/ws
- traefik.http.services.avalanche-mainnet-go-firewood-firewood-ws.loadbalancer.server.port=9650
- traefik.http.routers.avalanche-mainnet-go-firewood-firewood-ws.service=avalanche-mainnet-go-firewood-firewood-ws
- traefik.http.routers.avalanche-mainnet-go-firewood-firewood.service=avalanche-mainnet-go-firewood-firewood
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-firewood-firewood-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-firewood-firewood-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-firewood-firewood-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet-firewood`) || Path(`/avalanche-mainnet-firewood/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-firewood-firewood-ws.rule=(Path(`/avalanche-mainnet-firewood`) || Path(`/avalanche-mainnet-firewood/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-firewood-firewood-ws.middlewares=avalanche-mainnet-go-firewood-firewood-stripprefix, avalanche-mainnet-go-firewood-firewood-set-ws-path, ipallowlist
volumes:
avalanche-mainnet-go-firewood-firewood:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: avalanche
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -1,4 +1,17 @@
{
"state-sync-enabled": false,
"pruning-enabled": false
"pruning-enabled": false,
"eth-apis": [
"eth",
"eth-filter",
"net",
"web3",
"internal-eth",
"internal-blockchain",
"internal-transaction",
"debug",
"debug-tracer",
"debug-file-tracer",
"debug-handler"
]
}

View File

@@ -0,0 +1,29 @@
{
"rpc-gas-cap": 2500000000,
"rpc-tx-fee-cap": 100,
"eth-rpc-gas-limit": 2500000000,
"local-txs-enabled": false,
"pruning-enabled": false,
"api-max-duration": 0,
"api-max-blocks-per-request": 0,
"allow-unfinalized-queries": false,
"log-level": "info",
"state-sync-enabled": true,
"state-sync-skip-resume": true,
"state-scheme": "firewood",
"populate-missing-tries": null,
"snapshot-cache": 0,
"eth-apis": [
"eth",
"eth-filter",
"net",
"web3",
"internal-eth",
"internal-blockchain",
"internal-transaction",
"debug",
"debug-tracer",
"debug-file-tracer",
"debug-handler"
]
}

View File

@@ -1,23 +1,6 @@
{
"snowman-api-enabled": false,
"coreth-admin-api-enabled": false,
"net-api-enabled": true,
"rpc-gas-cap": 2500000000,
"rpc-tx-fee-cap": 100,
"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-data-directory": "/root/.avalanchego/offline-pruning"
}

View File

@@ -1,21 +1,26 @@
{
"snowman-api-enabled": false,
"coreth-admin-api-enabled": false,
"net-api-enabled": true,
"rpc-gas-cap": 2500000000,
"rpc-tx-fee-cap": 100,
"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
}
"state-sync-enabled": true,
"state-sync-skip-resume": true,
"eth-apis": [
"eth",
"eth-filter",
"net",
"web3",
"internal-eth",
"internal-blockchain",
"internal-transaction",
"debug",
"debug-tracer",
"debug-file-tracer",
"debug-handler"
]
}

View File

@@ -0,0 +1,112 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "512m"
max-file: "2"
# Aztec full node. See https://docs.aztec.network/network/setup/running_a_node
# Admin port (8880) is not exposed; use docker exec for admin API.
# 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:aztec/aztec/aztec-mainnet-aztec-pruned.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/aztec-mainnet-pruned \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
aztec-mainnet-pruned:
image: ${AZTEC_AZTEC_IMAGE:-aztecprotocol/aztec}:${AZTEC_MAINNET_AZTEC_VERSION:-5.0.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)
user: root
ports:
- 13840:13840
- 13840:13840/udp
expose:
- 8545
environment:
AZTEC_ADMIN_PORT: '8880'
AZTEC_PORT: '8545'
DATA_DIRECTORY: /var/lib/data
ETHEREUM_DEBUG_HOSTS: ${ETHEREUM_MAINNET_DEBUG_HOSTS:-${ETHEREUM_MAINNET_EXECUTION_RPC}}
ETHEREUM_HOSTS: ${ETHEREUM_MAINNET_EXECUTION_RPC}
L1_CONSENSUS_HOST_URLS: ${ETHEREUM_MAINNET_BEACON_REST}
LOG_LEVEL: ${AZTEC_LOG_LEVEL:-info}
P2P_IP: ${IP}
P2P_PORT: '13840'
entrypoint: [node, --no-warnings, /usr/src/yarn-project/aztec/dest/bin/index.js, start]
command:
- --node
- --network=mainnet
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${AZTEC_MAINNET_AZTEC_PRUNED_DATA:-aztec-mainnet-aztec-pruned}:/var/lib/data
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=false
- traefik.enable=true
- traefik.http.middlewares.aztec-mainnet-aztec-pruned-stripprefix.stripprefix.prefixes=/aztec-mainnet-pruned
- traefik.http.services.aztec-mainnet-aztec-pruned.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.aztec-mainnet-aztec-pruned.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.aztec-mainnet-aztec-pruned.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.aztec-mainnet-aztec-pruned.rule=Host(`$DOMAIN`) && (Path(`/aztec-mainnet-pruned`) || Path(`/aztec-mainnet-pruned/`))}
- ${NO_SSL:+traefik.http.routers.aztec-mainnet-aztec-pruned.rule=Path(`/aztec-mainnet-pruned`) || Path(`/aztec-mainnet-pruned/`)}
- traefik.http.routers.aztec-mainnet-aztec-pruned.middlewares=aztec-mainnet-aztec-pruned-stripprefix, ipallowlist
volumes:
aztec-mainnet-aztec-pruned:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: aztec-mainnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -32,7 +32,7 @@ x-logging-defaults: &logging-defaults
services:
aztec-testnet-pruned:
image: ${AZTEC_AZTEC_IMAGE:-aztecprotocol/aztec}:${AZTEC_TESTNET_AZTEC_VERSION:-5.0.0-rc.1}
image: ${AZTEC_AZTEC_IMAGE:-aztecprotocol/aztec}:${AZTEC_TESTNET_AZTEC_VERSION:-5.0.1}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -56,6 +56,7 @@ services:
AZTEC_ADMIN_PORT: '8880'
AZTEC_PORT: '8545'
DATA_DIRECTORY: /var/lib/data
ETHEREUM_DEBUG_HOSTS: ${ETHEREUM_SEPOLIA_DEBUG_HOSTS:-${ETHEREUM_SEPOLIA_EXECUTION_RPC}}
ETHEREUM_HOSTS: ${ETHEREUM_SEPOLIA_EXECUTION_RPC}
L1_CONSENSUS_HOST_URLS: ${ETHEREUM_SEPOLIA_BEACON_REST}
LOG_LEVEL: ${AZTEC_LOG_LEVEL:-info}

View File

@@ -68,11 +68,28 @@ ct_merge_seeds() {
ct_log "no official seeds fetched from $_url (continuing with configured)"
fi
fi
_seeds=$(ct_valid_peers "$_seeds")
if [ -n "$_seeds" ]; then
sed -i "s/^seeds = \".*\"/seeds = \"${_seeds}\"/" "$_cfg"
fi
}
# ct_valid_peers LIST
# Keep only well-formed CometBFT peer entries (<40-hex node id>@<host>:<port>), drop and
# log the rest. A truncated id such as 7c153a83@peer.haqq.mainnet.dteam.tech:28656 makes
# haqqd refuse to start ("invalid node ID"), 2026-09-07 rpc-de-31.
ct_valid_peers() {
_in="$1"; _out=""
for _p in $(echo "$_in" | tr ',' ' '); do
if echo "$_p" | grep -Eqi '^[0-9a-f]{40}@[^@,:]+:[0-9]+$'; then
_out="${_out:+$_out,}$_p"
else
ct_log "dropping malformed peer entry: $_p"
fi
done
echo "$_out"
}
# 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.
@@ -80,6 +97,8 @@ ct_set_persistent_peers() {
_cfg="$1"; _peers="$2"
[ -f "$_cfg" ] || return 0
[ -n "$_peers" ] || return 0
_peers=$(ct_valid_peers "$_peers")
[ -n "$_peers" ] || return 0
sed -i "s/^persistent_peers = \".*\"/persistent_peers = \"${_peers}\"/" "$_cfg"
sed -i "s/^persistent-peers = \".*\"/persistent-peers = \"${_peers}\"/" "$_cfg"
return 0

View File

@@ -157,8 +157,15 @@ for key in $keys; do
folder_size_gb=$(printf "%.0f" "$folder_size")
if (( folder_size_gb < 1 )) && [[ "$FORCE_SMALL" != true ]]; then
echo "FATAL: existing datadir too small for backup (${folder_size_gb}G at $source_folder); use --force if intentional" >&2
exit 1
# The torn-backup floor applies to the MAIN data volume only (key == compose
# basename). Sidecar volumes (eigenda-proxy, configs, ...) are legitimately
# tiny — a 0G sidecar aborting the whole backup left no manifest and blocked
# the refresh lane on every ronin bench-retire (4 cycles, 2026-07).
if [[ "$key" == "$(basename "$compose_name")" ]]; then
echo "FATAL: existing datadir too small for backup (${folder_size_gb}G at $source_folder); use --force if intentional" >&2
exit 1
fi
echo "NOTE: sidecar volume rpc_$key is ${folder_size_gb}G — allowing small backup (floor guards the main data volume only)"
fi
timestamp=$(date +'%Y-%m-%d-%H-%M-%S')

View File

@@ -112,7 +112,7 @@ services:
context: ./berachain
dockerfile: beacon-kit.Dockerfile
args:
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.1}
BEACONKIT_IMAGE: ${BERACHAIN_MAINNET_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports:
- 16562:16562

View File

@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services:
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:
# TCP Performance
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:
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:
# TCP Performance
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:
berachain-bepolia-reth:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.2}
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.4}
sysctls:
# TCP Performance
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:
berachain-bepolia-reth-pruned:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.2}
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_BEPOLIA_RETH_VERSION:-v1.4.4}
sysctls:
# TCP Performance
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:
berachain-mainnet-reth:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.0}
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.4}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -89,10 +89,10 @@ services:
- CHAINID=80094
- CHAINNAME=mainnet
- CHAIN_SPEC=mainnet
entrypoint: [/bin/bash, -c, "trap 'exit 0' SIGTERM; while [ ! -f /config/eth-genesis.json ] && [ ! -f /tmp/stop ]; do sleep 1 & wait $!; done; exec bera-reth node \"$@\"", --]
entrypoint: [bera-reth, node]
command:
- --bootnodes=enode://0c5a4a3c0e81fce2974e4d317d88df783731183d534325e32e0fdf8f4b119d7889fa254d3a38890606ec300d744e2aa9c87099a4a032f5c94efe53f3fcdfecfe@34.64.176.79:30303,enode://b6a3137d3a36ef37c4d31843775a9dc293f41bcbde33b6309c80b1771b6634827cd188285136a57474427bd8845adc2f6fe2e0b106bd58d14795b08910b9c326@34.64.181.70:30303,enode://0b6633300614bc2b9749aee0cace7a091ec5348762aee7b1d195f7616d03a9409019d9bef336624bab72e0d069cd4cf0b0de6fbbf53f04f6b6e4c5b39c6bdca6@34.64.39.31:30303,enode://552b001abebb5805fcd734ad367cd05d9078d18f23ec598d7165460fadcfc51116ad95c418f7ea9a141aa8cbc496c8bea3322b67a5de0d3380f11aab1a797513@34.64.183.158:30303,enode://5b037f66099d5ded86eb7e1619f6d06ceb15609e8cc345ced22a4772b06178004e1490a3cd32fd1222789de4c6e4021c2d648a3d750f6d5323e64b771bbd8de7@34.87.142.180:30303,enode://846db253c53753d3ea1197aec296306dc84c25f3afdf142b65cb0fe0f984de55072daa3bbf05a9aea046a38a2292403137b6eafefd5646fcf62120b74e3b898d@34.142.170.110:30303,enode://64b7f6ee9bcd942ad4949c70f2077627f078a057dfd930e6e904e12643d8952f5ae87c91e24559765393f244a72c9d5c011d7d5176e59191d38f315db85a20f5@34.126.161.16:30303,enode://cf4d19bfb8ec507427ec882bac0bac85a0c8c9ddaa0ec91b773bb614e5e09d107cd9fbe323b96f62f31c493f8f42cc5495c18b87c08560c5dea1dfd25256dcf6@35.247.162.2:30303,enode://bb7e44178543431feac8f0ee3827056b7b84d8235b802a8bdbbcd4939dab7f7dd2579ff577a38b002bb0139792af67abd2dd5c9f4f85b8da6e914fa76dca82bc@35.198.150.35:30303,enode://8fef1f5df45e7b31be00a21e1da5665d5a5f5bf4c379086b843f03eade941bdd157f08c95b31880c492577edb9a9b185df7191eaebf54ab06d5bd683b289f3af@34.107.7.241:30303,enode://ce9c87cfe089f6811d26c96913fa3ec10b938d9017fc6246684c74a33679ee34ceca9447180fb509e37bf2b706c2877a82085d34bfd83b5b520ee1288b0fc32f@35.198.109.49:30303,enode://713657eb6a53feadcbc47e634ad557326a51eb6818a3e19a00a8111492f50a666ccbf2f5d334d247ecf941e68d242ef5c3b812b63c44d381ef11f79c2cdb45c7@34.141.15.100:30303,enode://d071fa740e063ce1bb9cdc2b7937baeff6dc4000f91588d730a731c38a6ff0d4015814812c160fab8695e46f74b9b618735368ea2f16db4d785f16d29b3fb7b0@35.203.2.210:30303,enode://ffc452fe451a2e5f89fe634744aea334d92dcd30d881b76209d2db7dbf4b7ee047e7c69a5bb1633764d987a7441d9c4bc57ccdbfd6442a2f860bf953bc89a9b9@34.152.50.224:30303,enode://da94328302a1d1422209d1916744e90b6095a48b2340dcec39b22002c098bb4d58a880dab98eb26edf03fa4705d1b62f99a8c5c14e6666e4726b6d3066d8a4d7@34.95.61.106:30303,enode://19c7671a4844699b481e81a5bcfe7bafc7fefa953c16ebbe1951b1046371e73839e9058de6b7d3c934318fe7e7233dde3621c1c1018eb8b294ea3d4516147150@35.203.82.137:30303
- --chain=/config/eth-genesis.json
- --chain=mainnet
- --datadir=/root/.local/share/reth
- --discovery.port=12881
- --engine.always-process-payload-attributes-on-canonical-head
@@ -131,7 +131,6 @@ services:
- ${BERACHAIN_MAINNET_RETH_ARCHIVE_TRACE_DATA:-berachain-mainnet-reth-archive-trace}:/root/.local/share/reth
- .jwtsecret:/jwtsecret:ro
- /slowdisk:/slowdisk
- berachain-mainnet-reth-archive-trace_config:/config
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
@@ -152,7 +151,7 @@ services:
context: ./berachain
dockerfile: beacon-kit.Dockerfile
args:
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.1}
BEACONKIT_IMAGE: ${BERACHAIN_MAINNET_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports:
- 17881:17881

View File

@@ -61,7 +61,7 @@ x-logging-defaults: &logging-defaults
services:
berachain-mainnet-reth-pruned:
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.0}
image: ${BERACHAIN_RETH_IMAGE:-ghcr.io/berachain/bera-reth}:${BERACHAIN_MAINNET_RETH_VERSION:-v1.4.4}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -153,7 +153,7 @@ services:
context: ./berachain
dockerfile: beacon-kit.Dockerfile
args:
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.0-rc3}
BEACONKIT_VERSION: ${BERACHAIN_MAINNET_BEACON_KIT_VERSION:-v1.4.1}
BEACONKIT_IMAGE: ${BERACHAIN_MAINNET_BEACON_KIT_IMAGE:-ghcr.io/berachain/beacon-kit}
ports:
- 15900:15900

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
bitcoin-cash-mainnet:
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_MAINNET_BITCOIND_VERSION:-0.33.7}
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_MAINNET_BITCOIND_VERSION:-0.33.8}
sysctls:
# TCP Performance
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:
bitcoin-cash-testnet:
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_TESTNET_BITCOIND_VERSION:-0.33.7}
image: ${BITCOIN_CASH_BITCOIND_IMAGE:-bitcoinabc/bitcoin-abc}:${BITCOIN_CASH_TESTNET_BITCOIND_VERSION:-0.33.8}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

102
bootstrap-peers.sh Executable file
View File

@@ -0,0 +1,102 @@
#!/bin/bash
# bootstrap-peers.sh — fetch curated third-party bootstrap enodes for a network.
#
# Secondary seed source for peer-reinject / restore flows. Primary source remains
# the node's own peer-capture state. Same public JSON customers curl:
# https://stakesquid.eu/bootstrap/<network>.json
#
# Usage:
# bootstrap-peers.sh <network> # print enodes (one per line)
# bootstrap-peers.sh <network> --json # print full JSON
# bootstrap-peers.sh --from-compose <path> # derive network from compose path
# bootstrap-peers.sh ... --dry-run # show URL + count, no failure on empty
#
# Env:
# BOOTSTRAP_BASE_URL default https://stakesquid.eu/bootstrap
# BOOTSTRAP_MAX max enodes to emit (default 25)
set -euo pipefail
BASE_URL="${BOOTSTRAP_BASE_URL:-https://stakesquid.eu/bootstrap}"
MAX="${BOOTSTRAP_MAX:-25}"
DRY_RUN=false
JSON_OUT=false
NETWORK=""
COMPOSE=""
usage() {
echo "Usage: $0 <network> [--json] [--dry-run]" >&2
echo " $0 --from-compose <compose-path> [--json] [--dry-run]" >&2
exit 1
}
while [[ $# -gt 0 ]]; do
case "$1" in
--from-compose)
COMPOSE="${2:-}"; shift 2 || usage
;;
--json) JSON_OUT=true; shift ;;
--dry-run) DRY_RUN=true; shift ;;
-h|--help) usage ;;
-*)
echo "Unknown option: $1" >&2
usage
;;
*)
NETWORK="$1"; shift
;;
esac
done
network_from_compose() {
local path="$1"
local base
base="$(basename "$path" | sed 's/--.*//')"
# strip client/variant suffixes (same idea as fleet-peers network_from_path)
for sep in -op-reth -op-geth -op-erigon -op-nethermind \
-reth -geth -erigon -erigon3 -besu -nethermind \
-bsc -nitro -l2geth -bor -external-node -gaiad \
-juno -rskj -avalanche -maru; do
case "$base" in
*"$sep"*) base="${base%%$sep*}"; break ;;
esac
done
# common leftover: -pruned / -archive / -pebble / -path / -trace / -bonsai
base="$(echo "$base" | sed -E 's/-(pruned|archive|full|pebble|path|trace|bonsai|snap|hash).*//')"
echo "$base"
}
if [[ -n "$COMPOSE" ]]; then
NETWORK="$(network_from_compose "$COMPOSE")"
fi
if [[ -z "$NETWORK" ]]; then
usage
fi
URL="${BASE_URL%/}/${NETWORK}.json"
TMP="$(mktemp)"
trap 'rm -f "$TMP"' EXIT
if ! curl -fsS --max-time 15 "$URL" -o "$TMP" 2>/dev/null; then
if [[ "$DRY_RUN" == true ]]; then
echo "bootstrap-peers: dry-run fetch failed for $URL" >&2
exit 0
fi
echo "bootstrap-peers: fetch failed: $URL" >&2
exit 1
fi
COUNT="$(jq -r '.peers | length // 0' "$TMP" 2>/dev/null || echo 0)"
UPDATED="$(jq -r '.updated // empty' "$TMP" 2>/dev/null || true)"
if [[ "$DRY_RUN" == true ]]; then
echo "bootstrap-peers: network=$NETWORK url=$URL peers=$COUNT updated=$UPDATED"
jq -r '.peers[:3][]? | " \(.stability.tier // "?") score=\(.stability.score // "?") n_vantage=\(.stability.n_vantage_nodes // "?") \(.enode[0:60])…"' "$TMP" 2>/dev/null || true
exit 0
fi
if [[ "$JSON_OUT" == true ]]; then
cat "$TMP"
exit 0
fi
jq -r --argjson m "$MAX" '.peers[:$m][]?.enode // empty' "$TMP" 2>/dev/null | grep -E '^enode://' || true

View File

@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
bsc-chapel:
image: ${BSC_BSC_IMAGE:-ghcr.io/bnb-chain/bsc}:${BSC_CHAPEL_BSC_VERSION:-1.7.3}
image: ${BSC_BSC_IMAGE:-ghcr.io/bnb-chain/bsc}:${BSC_CHAPEL_BSC_VERSION:-1.7.8}
sysctls:
# TCP Performance
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:
bsc-mainnet-minimal:
image: ${BSC_BSC_IMAGE:-ghcr.io/bnb-chain/bsc}:${BSC_MAINNET_BSC_VERSION:-1.7.3}
image: ${BSC_BSC_IMAGE:-ghcr.io/bnb-chain/bsc}:${BSC_MAINNET_BSC_VERSION:-1.7.8}
sysctls:
# TCP Performance
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:
bsc-mainnet-minimal:
image: ${BSC_BSC_IMAGE:-ghcr.io/bnb-chain/bsc}:${BSC_MAINNET_BSC_VERSION:-1.7.3}
image: ${BSC_BSC_IMAGE:-ghcr.io/bnb-chain/bsc}:${BSC_MAINNET_BSC_VERSION:-1.7.8}
sysctls:
# TCP Performance
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:
bsc-mainnet:
image: ${BSC_BSC_IMAGE:-ghcr.io/bnb-chain/bsc}:${BSC_MAINNET_BSC_VERSION:-1.7.3}
image: ${BSC_BSC_IMAGE:-ghcr.io/bnb-chain/bsc}:${BSC_MAINNET_BSC_VERSION:-1.7.8}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle

View File

@@ -49,7 +49,7 @@ services:
args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6.3}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.1.1}
RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
@@ -102,7 +102,6 @@ services:
- --rpc.max-connections=50000
- --rpc.max-logs-per-response=0
- --rpc.max-trace-filter-blocks=10000
- --statedb.triedb
- --ws
- --ws.addr=0.0.0.0
- --ws.api=admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,mev

View File

@@ -49,7 +49,7 @@ services:
args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6.3}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.1.1}
RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf}

View File

@@ -49,7 +49,7 @@ services:
args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6.3}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.1.1}
RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf}
@@ -103,7 +103,6 @@ services:
- --rpc.max-connections=50000
- --rpc.max-logs-per-response=0
- --rpc.max-trace-filter-blocks=10000
- --statedb.triedb
- --ws
- --ws.addr=0.0.0.0
- --ws.api=admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots,flashbots,mev

View File

@@ -49,7 +49,7 @@ services:
args:
LLVM_IMAGE: ${LLVM_IMAGE:-snowstep/llvm}
LLVM_VERSION: ${LLVM_VERSION:-20250912105042}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.0.6.3}
RETH_VERSION: ${BSC_CHAPEL_RETH_VERSION:-v0.1.1}
RETH_REPO: ${BSC_CHAPEL_RETH_REPO:-https://github.com/bnb-chain/reth-bsc.git}
ARCH_TARGET: ${ARCH_TARGET:-native}
PROFILE: ${RETH_BUILD_PROFILE:-maxperf}

Some files were not shown because too many files have changed in this diff Show More