Compare commits

..

361 Commits

Author SHA1 Message Date
997a039c78 Bump bitcoind to 0.33.11 for bitcoin-cash
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-09-12 07:08:18 +00:00
009cf01cc8 deploy: regenerate compose from vibe-node main 7e71efbd3d0b 2026-09-12 06:03:48 +00:00
611aae805a Merge pull request 'superseed-sepolia: fix Karst fork-time configuration' (#75) from issue-3840 into main 2026-09-11 15:25:24 +00:00
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
6abace8173 superseed-sepolia: fix karst fork time from 1781712000 to 1787068801 2026-09-08 02:15:21 +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
rob
8baf603b48 Add hemi sepolia (testnet, chain 743111): op-geth pruned variant
hemi-testnet US-Central market $6/day with 2 providers. BTC side =
testnet3 (own hVM genesis @3522419), L1 = ethereum sepolia, snap sync,
genesis+rollup checked in per hemi-node testnet dir, fork overrides in
env/op/hemi/sepolia/.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 09:35:25 +00:00
rob
b54bfa84ef slowdisk fit check: 90d growth headroom (statics grow; /slowdisk is often the root partition)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 07:22:13 +00:00
rob
a0b47b3631 restore-volumes: fail loudly when static offload cannot fit on /slowdisk
A silent fallback to primary-disk extraction violates the caller's NVMe
capacity math now that the planner treats slowdisk as a separate pool.
When SLOWDISK=True and the manifest's static sizes (accurate, replacing
the whole-archive x2 estimate that false-refuses large restores) do not
fit above the floor, error out with the explicit remedy: re-run with
--no-slowdisk as the conscious override. Operator directive 2026-07-09.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 07:20:52 +00:00
rob
331a9c27a8 Lift reth static-file symlink guard: op-reth v2.3.2 verified through symlink
Live test on rpc-uk-4 (unichain-mainnet pruned, 166G static_files moved to
/slowdisk + symlinked): reth healed consistency, initialized the
StaticFileProducer, and resumed committing canonical blocks - full
read/write through the symlink. The guard's premise (old reth refusing
symlinked static_files) no longer holds; pre-v2 reths fail loudly at start,
fallback is --no-slowdisk. Restores/clones of reth nodes to SLOWDISK=True
hosts now offload statics automatically (NVMe is the scarce resource).
Note: reth also has --datadir.static-files for a flag-based layout later.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 07:10:23 +00:00
d77ee75752 deploy: regenerate compose from vibe-node main 17caf065f38f 2026-07-09 02:04:21 +00:00
rob
5137dcbfba hemi mainnet: op-geth 05d4d8f -> 7cfc394 (2026-07-08 build)
Candidate fix for the receipts RLP decode failure that blocks snap sync
past block 4,178,637 (2026-04-12): peers dropped with 'invalid message
(code 10) receipt 1: rlp: ListEnd not positioned at EOL' on the previous
newest published image.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 01:41:19 +00:00
88dbbd1ef2 morph: bump l2geth 2.2.3 → 2.2.4 (ghcr.io/morph-l2/go-ethereum)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-09 01:40:20 +00:00
9ca7ddd52d deploy: regenerate compose from vibe-node main 5ac8fffb7d6c 2026-07-09 00:34:34 +00:00
090116d8c4 deploy: regenerate compose from vibe-node main 3fd0cf61f237 2026-07-08 13:17:12 +00:00
rob
c07dc9f720 show-status: footer listing fenced nodes (maintenance windows)
Fenced nodes are dropped from COMPOSE_FILE so show-status silently omitted
them - a fenced-but-running node looked 'gone'. rpc-update now writes
/root/rpc/.fenced (node | until | reason | owner per active window); print
it as a footer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 13:06:15 +00:00
7c2ef13238 op/lisk: bump op-node v1.19.1 → v1.19.2 on mainnet
Karst hardfork activates 2026-07-08T16:00:01 UTC; op-reth v2.3.3
already supports getPayloadV5.
2026-07-08 12:26:38 +00:00
rob
1ebabee93d volume-utils: per-volume-kind restorable floor (_config tars are legitimately tiny)
The 1MB near-empty guard (added for purged-volume zstd stubs) rejected every
legitimate _config volume archive (cronos: 68KB), so any node whose registry
entry includes a _config volume reported Restorable: 0 despite healthy
multi-GB data backups (cronos had three; 14 registry entries carry _config
volumes). _config archives now pass at >=4KB; data volumes keep the 1MB floor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 12:01:44 +00:00
cf26455d3a deploy: regenerate compose from vibe-node main 07b0472e0d1a 2026-07-08 11:49:07 +00:00
sebastian
ad93d73f12 Merge pull request 'cosmos gaiad: document Polkachu FULL snapshot bootstrap procedure' (#36) from issue-982 into main
Reviewed-on: #36
2026-07-08 11:46:24 +00:00
rob
9aa98718b6 hemi mainnet: syncmode full -> snap
hemi cannot full-sync across old BTC reorg points: EVM blocks referencing
orphaned Bitcoin Attributes ancestors are unexecutable once no peer retains
the stale BTC block (us-16 wedged at 3353463 on reorged-out block
00000000000000000001dcb3...b971). hemi's official l2-config.toml ships
SyncMode=snap. Registry: 150 entries gain node names (regen enrichment).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 11:44:52 +00:00
sebastian
c8f89a43d3 Merge pull request 'linea-mainnet: add engine-API healthcheck script' (#37) from issue-1049 into main
Reviewed-on: #37
2026-07-08 11:43:37 +00:00
rob
9ac5529ef5 R-2: gitignore chaindata/snapshot/tarball patterns 2026-07-08 04:20:06 +00:00
04b9a5356d linea: add engine API healthcheck script for geth mainnet
Shell probe signs a JWT from /jwtsecret and calls engine_exchangeCapabilities
on :8551 so compose can gate Maru startup on EL engine readiness.
2026-07-08 03:24:13 +00:00
rob
5ee02b85d4 Add unichain op-reth archive-trace variants (mainnet + sepolia)
Operator wants a reth archive sync on de-32 to compare footprint vs the
612G op-erigon archive.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 03:03:49 +00:00
73173299c9 cosmos gaiad: document Polkachu FULL snapshot bootstrap procedure
Fresh wasm-chain bootstrap needs a Polkachu full snapshot (includes wasm/),
the snapshots URL pattern, and CL_VERSION matching the live chain version.
2026-07-07 14:39:03 +00:00
990a406751 deploy: regenerate compose from vibe-node main cef3cb8cdb49 2026-07-07 14:19:44 +00:00
1ec43f481f deploy: regenerate compose from vibe-node main d0d784c8ff09 2026-07-07 13:45:47 +00:00
goldsquid
623deaf9d6 update 2026-07-07 18:22:08 +07:00
goldsquid
50c00156cf fix 2026-07-07 18:17:00 +07:00
41d4dd0d5c deploy: regenerate compose from vibe-node main 218c002b232e 2026-07-07 06:00:03 +00:00
33ea38b8d9 mode: add optimism.eip1559DenominatorCanyon=250 to mainnet genesis
Canyon-fork EIP-1559 denominator, present in the authoritative genesis
on rpc-de-32 but missing from the committed copy. Matches the fork-time
addition in d4fc9487.
2026-07-07 01:02:48 +00:00
d4fc948794 mode: add mainnet L2 fork times to genesis.json config
Add the post-Regolith OP-stack fork activation timestamps (canyon through
karst) to op/mode/mainnet/genesis.json, sourced from the authoritative
copy running on rpc-de-32 (sha256 ea320f6a). The committed genesis was
missing every fork time after regolithTime, so op-reth could not apply
the L2 hardfork schedule.

canyonTime=shanghaiTime=1704992401, deltaTime=1708560000,
ecotoneTime=1710374401, fjordTime=1720627201, graniteTime=1726070401,
holoceneTime=1736445601, isthmusTime=1746806401, jovianTime=1764691201,
karstTime=1783526401.
2026-07-06 15:39:48 +00:00
goldsquid
6ec29db531 fix 2026-07-06 22:24:00 +07:00
goldsquid
c14a357773 reth for mode 2026-07-06 22:02:42 +07:00
a397561afa ethereum: bump prysm v7.1.4 → v7.1.6 on mainnet only
Update Prysm beacon-chain image default for ethereum mainnet profiles
(geth pruned/minimal + reth trace); sepolia and hoodi remain on v7.1.4.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 14:38:43 +00:00
57db6a16fa multicurl: fix cat: '': No such file or directory when called without -o
$temp_file is only created when curl is invoked with -o (the -o loop
above), but the post-success null/error check always ran `cat "$temp_file"`.
When a caller omits -o (e.g. check-health.sh's Cosmos reference RPC), the
variable is empty, so bash executed `cat ""` and printed
"cat: '': No such file or directory" — once per show-status run.

In that no-o case the body is already captured in $output, so read the
response from $output when $temp_file is unset, and from $temp_file when
it exists. Behaviour with -o is unchanged; the result==null / JSON-RPC
error skip-to-next-URL fallback is preserved in both paths.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 14:00:30 +00:00
goldsquid
ea15f31844 fix 2026-07-06 20:53:10 +07:00
6d41b16150 deploy: regenerate compose from vibe-node main c828f26e351e 2026-07-06 13:35:00 +00:00
goldsquid
dec01b5a18 fix 2026-07-06 20:20:48 +07:00
goldsquid
5b33030773 fix 2026-07-06 20:10:56 +07:00
c83f2cc5de deploy: regenerate compose from vibe-node main 8ef91b9ce256 2026-07-06 13:04:10 +00:00
goldsquid
ce7f278f77 fix 2026-07-06 19:56:34 +07:00
goldsquid
d9072c7b4d fix 2026-07-06 19:34:01 +07:00
goldsquid
0e4b69c65d fix 2026-07-06 19:29:29 +07:00
goldsquid
27b33458de better discovery 2026-07-06 19:27:39 +07:00
8684fbb96b katana mainnet op-reth: execution-layer sync + conduit bootnodes
op-node env (env/op/katana/mainnet/node.env):
- OP_NODE_SYNCMODE: consensus-layer -> execution-layer
- add OP_NODE_SYNCMODE_OFFSET_EL_SAFE=12h
- add OP_NODE_P2P_BOOTNODES (conduit katana bootnodes)
- drop OP_NODE_L2_SKIP_SYNC_START_CHECK=true (global default false applies)

Regenerates katana-mainnet-op-reth-pruned-trace + -archive-trace.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 11:04:20 +00:00
2418c15d52 deploy: regenerate compose from vibe-node main f045d7a27b13 2026-07-06 09:32:53 +00:00
1760023975 sonic: bump Dockerfile Go base image 1.24 -> 1.26 for v2.2.0
v2.2.0 requires go 1.26.0 per upstream go.mod.
2026-07-06 01:58:26 +00:00
cf6fda7fa6 deploy: regenerate compose from vibe-node main 16db41852a31 2026-07-06 00:34:02 +00:00
goldsquid
a498b12b45 fix 2026-07-06 07:29:12 +07:00
55df34de69 ronin-saigon op-reth: op-node consensus-layer CL-sync (SKIP_SYNC_START_CHECK=true)
Match ronin-mainnet's EigenDA alt-DA recipe on both saigon profiles
(archive-trace + pruned-trace): OP_NODE_SYNCMODE execution-layer ->
consensus-layer and OP_NODE_L2_SKIP_SYNC_START_CHECK false -> true.
Hand-maintained edit (these CL-sync flags are not template-driven);
do NOT regenerate saigon via update.sh or it reverts. Mainnet untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 00:21:39 +00:00
6311aeae0b deploy: regenerate compose from vibe-node main 6463a06bc49f 2026-07-05 14:23:54 +00:00
f1661bd650 op/bnb,op/manta-pacific,op/blast: remove non-migratable kona compose profiles
Custom op-node forks on these chains cannot run kona-node; drop the
orphaned --kona.yml compose files and registry entries.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 09:37:06 +00:00
8bd024823b Remove broken kona-node variants for diverged OP chains; add worldchain reth+kona
Drop --kona compose profiles for base, fraxtal, zircuit, xlayer, and superseed
where kona-node v1.6.1 stalls or hash-mismatches on custom rollups. Add
worldchain-mainnet-op-reth-pruned-trace--kona for the planned geth→reth+kona swap.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 07:22:04 +00:00
a58f44b98c deploy: regenerate compose from vibe-node main f8ab5e434006 2026-07-05 02:40:11 +00:00
66ecc3d8bc op: add kona consensus-client variants for 13 OP-stack chains
Generate --kona compose profiles for base, mode, zircuit, fraxtal, zora,
metal, hashkeychain, superseed, swell, bnb, manta-pacific, blast, and xlayer
so production nodes can migrate off stock op-node before DRPC deprioritizes it.
Each kona variant shares the same EL data volume as its op-node sibling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 02:04:05 +00:00
018451b9b0 katana-mainnet: op-node consensus-layer sync for op-reth profiles
Persist OP_NODE_SYNCMODE=consensus-layer and OP_NODE_L2_SKIP_SYNC_START_CHECK=true
so op-node drives the EL via engine API (no EL P2P peers on katana mainnet).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 01:52:02 +00:00
2cdc238330 op/metal: add mainnet op-reth pruned-trace compose profile
Generated compose for metal-mainnet EL sync on op-reth (superchain
registry chain=metal, L1 ethereum-mainnet, chainid 1750), mirroring
other Superchain mainnet op-reth pruned nodes.
2026-07-05 00:53:30 +00:00
e79b2f017f worldchain: add mainnet op-reth pruned-trace compose
Add generated op/reth/worldchain-mainnet-op-reth-pruned-trace.yml and
register it in compose_registry.json for Superchain EL migration off op-geth.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 00:45:57 +00:00
03034ab069 deploy: regenerate compose from vibe-node main 2819af5125c4 2026-07-05 00:31:44 +00:00
0ba27e01fe cronos: build cronosd from GitHub release tarball; fix MIN_GAS and statesync RPC
GHCR image returns 403 on anonymous pulls — switch cometbft.Dockerfile to alpine +
public v1.7.8 tarball. init.sh sets minimum-gas-prices (5000000000000basecro) and
drops dead rpc-cronos.crypto.org statesync endpoint.
2026-07-04 21:07:11 +00:00
827b61911c lens: bump external-node v31.0.0 → v31.1.0 (mainnet only)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-04 15:34:46 +00:00
30eb36786d deploy: regenerate compose from vibe-node main 58d4347aac2c 2026-07-04 12:33:03 +00:00
dffdacaa3c digibyte: bump digibyted Dockerfile to v9.26.4
Update tarball VERSION default and SHA256 checksum for the v9.26.4 release.
2026-07-04 11:05:24 +00:00
5663570cad deploy: regenerate compose from vibe-node main 03ef7eb9ec15 2026-07-04 09:06:47 +00:00
361110f1ff cronos: wire init.sh pruning and statesync from context env
Read STATESYNC_RPC and app.toml pruning tunables from environment
(set by the generator from context.yml) instead of hardcoding them.
2026-07-04 04:10:27 +00:00
921fec2e86 deploy: regenerate compose from vibe-node main 1195854e5e9a 2026-07-04 00:34:32 +00:00
70b8cce5af cronos: wire init.sh to context.yml bootstrap env vars
Read chain_id, genesis_url, seeds, and app.toml json-rpc/evm tunables from
environment (set by the generator from context.yml). Fix seed wiring to use
ct_merge_seeds instead of ct_set_persistent_peers.
2026-07-03 22:08:10 +00:00
d94213fd5c fix(jovay/aldaba): replace VERSION subpath mount with startup cp
Docker 28.5.x fails container create when a volume subpath targets a
path that exists as a file in the image. Copy VERSION from the conf
volume mount instead of subpath-mounting onto /opt/l2_deploy/bin/VERSION.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 12:23:13 +00:00
fcf747c6ee taiko: use --chain=mainnet for alethia-reth v1.1.0
The alethia-reth binary expects --chain=mainnet, not --chain=alethia.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 12:19:04 +00:00
e56976adeb taiko: pass BUILD_ALETHIA_RETH=true for alethia-reth compose builds
Without this build arg reth.Dockerfile builds upstream reth and cargo fails
on asm-keccak/jemalloc features missing from the alethia-reth fork.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 10:19:06 +00:00
9d9da8342c ethereum: bump nimbus multiarch-v26.6.0 -> multiarch-v26.6.2
Regenerated compose defaults for all statusim/nimbus-eth2 profiles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 08:08:12 +00:00
99867025db deploy: regenerate compose from vibe-node main 67e5a65a31a1 2026-07-03 07:56:35 +00:00
bf508e8b07 deploy: regenerate compose from vibe-node main 0e76246fb875 2026-07-03 07:05:14 +00:00
052e74a00d bitcoin-cash: bump bitcoind client_version to 0.33.7
Update mainnet and testnet compose defaults to bitcoinabc/bitcoin-abc:0.33.7.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 06:43:46 +00:00
88bedb0956 fix(stop/start): scope compose to base.yml + node yml
stop.sh and start.sh previously relied on ambient COMPOSE_FILE, so
backup fencing left orchestration unable to stop or restart the target
node. Pass -f base.yml and the node yml explicitly and fail loudly.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 04:53:28 +00:00
e571efbea1 fix(backup): read remote backup list from stdin in selector
select_newest_remote_backup_from_list was sorting an empty process
substitution instead of the piped list-backups.sh output.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 04:38:31 +00:00
58adc446e2 backup: harden lifecycle fencing and skip near-empty archives
backup-node.sh now stops services, fences COMPOSE_FILE during backup, and
restores via EXIT trap; consumers skip <1MB .tar.zst artifacts so purged-
volume junk cannot shadow real backups.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 04:38:00 +00:00
6c0df2bce5 restore-volumes: add /slowdisk absolute floor gate for static offload
Skip static-file offload when projected /slowdisk free space after restore
would fall below SLOWDISK_FLOOR_GB (default 150 GB); warn after extract if
the floor is breached. Restore never aborts — falls back to primary extract.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 03:59:41 +00:00
8f57c8af68 jovay: tail aldaba/cubenet logs to docker logs via tini+bash wrapper
The aldaba_light binary writes sync and p2p logs only to rotating files
under /opt/l2_deploy/light/log/; wrap entry.sh so tail -n0 -F streams new
lines to stdout while preserving file logging and tini PID-1 semantics.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 03:37:22 +00:00
f8915ed59f catchup: per-protocol dispatch for bitcoin, cosmos, and ripple
Extend catchup.sh with protocol-aware branches (bitcoin height-gain,
cosmos CometBFT timestamp via timestamp.sh, ripple validated-ledger
seq) and explicit degradation for closed RPC / unsupported protocols.
Reuse sync-status/check-health idioms for protocol resolution and parsing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 03:10:24 +00:00
a98ced8af1 jovay: wire aldaba P2P advertise IP/port and host port mapping
Set ADVERTISE_NODE_IP=${IP} and ADVERTISE_NODE_PORT to the salted host
port; map client_port:19000 so inbound cubenet peering is dialable.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 02:47:54 +00:00
1c65fdb26f fix(check-health): retry on unreachable reference endpoint
When multicurl fails to reach the reference RPC (timeout/unreachable),
clean up the temp file, retry up to MAX_RETRIES, then exit with
'unverified (reference unreachable)' instead of falling through as success.

Also add Robinhood mainnet official RPC to reference-rpc-endpoint.json.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-03 01:36:42 +00:00
sebastian
2fbf996857 Merge pull request 'tac/tacchaind: add Polkachu seeds and statesync RPC config' (#26) from issue-734 into main
Reviewed-on: #26
2026-07-02 23:40:43 +00:00
sebastian
3c8623531f Merge pull request 'op/katana: add Prague/Osaka fork timestamps to genesis' (#27) from issue-739 into main
Reviewed-on: #27
2026-07-02 23:39:23 +00:00
27f10b29d3 babylon: pass --no-bls-password on babylond start
babylond v4.3.0 prompts for a BLS key password on every start when
bls_key.json exists unless start gets --no-bls-password; without it RPC
replicas crash-loop with "failed to get BLS password: EOF".

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 18:53:45 +00:00
23e9a5dcd5 katana mainnet: fix genesis.json — preserve alloc, add fork times only
Restore full genesis alloc section; add pragueTime (1746806401) and
osakaTime (1773066601) without truncating predeploy entries.
2026-07-02 16:38:27 +00:00
14b115b7bd katana mainnet: add pragueTime and osakaTime fork activations
op-reth requires pragueTime equal to isthmusTime for custom-genesis OP
chains per OP Upgrade 15; osakaTime added for upcoming Jovian fork.
2026-07-02 16:37:35 +00:00
cb7bb80490 fix: bitcoin rpcallowip IPv4, babylon BLS pre-create, tac peers+cosmos RPC
- Add -rpcallowip=0.0.0.0/0 family-wide via bitcoind template regen
- Pre-create empty-password BLS key in babylon init.sh (v4.3.0 EOF fix)
- TAC: seeds+persistent_peers, CometBFT :26657 traefik, protocol cosmos

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 16:04:01 +00:00
eda1068f45 tac mainnet: merge Polkachu seeds in init.sh for peer discovery
Call ct_merge_seeds() so SEEDS env populates config.toml; default
STATESYNC_RPC to tacchain-rpc.polkachu.com for statesync bootstrap.
2026-07-02 14:41:07 +00:00
75b931461d deploy: regenerate compose from vibe-node main de67ec1de6be 2026-07-02 14:08:34 +00:00
rob
4d5d8f4be1 Merge pull request 'katana-mainnet genesis: add isthmusTime + jovianTime (unblock op-reth) [issue-501]' (#25) from issue-501-katana-jovian into main
Reviewed-on: #25
2026-07-02 14:05:25 +00:00
865f80c56d babylon: add mainnet babylond pruned compose (bbn-1)
Family-C CometBFT node with statesync, wasm-only snapshot bootstrap,
and babylon-specific config (timeout_commit, btc-config, iavl-cache).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 14:02:17 +00:00
d058fe1db1 Add DigiByte and Dash mainnet bitcoin-family RPC nodes.
DigiByte uses a tarball-install digibyted.Dockerfile (v9.26.3); Dash uses
dashpay/dashd:23.1.7. Both follow the dogecoind bitcoind pattern for RPC
auth, ZMQ, traefik, and x-upstreams wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 13:51:15 +00:00
21c01e8de8 bitcoin: production-ready mainnet bitcoind for DRPC serving
Switch to bitcoin/bitcoin:31.0 with txindex and tuned RPC flags, drop the
esplora indexer sidecar, and add bitcoin-protocol health probes so fleet
status and wait-for-online work for bitcoin-family nodes.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 13:35:16 +00:00
73b65dbbc9 tac: re-declare ARG VERSION in tacchaind go-builder stage
Pre-FROM ARG VERSION is not visible inside build stages; compose passes
VERSION as a build arg but git checkout expanded empty without a stage-level
re-declaration.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 13:22:14 +00:00
79d2839a48 tac: install git in tacchaind go-builder stage
The golang:alpine go-builder stage runs git clone/checkout but never
installed git, causing compose build to fail with exit 127 on rpc-de-32.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 13:04:03 +00:00
0c8a3cc4b0 ripple: deployable mainnet + testnet rippled with health checks
Fix mainnet rippled.cfg (ws,http RPC, port_peer 13331), strip eth-isms
from x-upstreams, add testnet chain assets/compose, and wire --ripple
sync-status via check-health.sh server_info probe.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 11:46:03 +00:00
58d45c8576 katana mainnet: add isthmusTime/jovianTime to genesis for op-reth
op-reth reads OP-stack fork schedule from genesis.json; without
isthmusTime/jovianTime it rejects post-Jovian payloads (MinBaseFeeNotAllowedBeforeJovian).
2026-07-02 11:37:11 +00:00
sebastian
b8752b0c7e Merge pull request 'katana-mainnet: add Isthmus + Jovian fork times to genesis and rollup config' (#24) from issue-712 into main
Reviewed-on: #24
2026-07-02 11:27:10 +00:00
aab46a52b6 tac: add tacchaind pruned compose for mainnet and spb
Source-build Dockerfile (tacchain v1.6.0), init script with statesync via
cometbft-common.sh, EVM RPC/WS on 8545/8546, and dshackle slugs tac/tac-spb.
2026-07-02 11:25:25 +00:00
8629ed3e0c deploy: regenerate compose from vibe-node main 4985b130fd82 2026-07-02 10:55:08 +00:00
1b4c4d0d51 fix(robinhood): add full chain info-json to mainnet nitro baseConfig
Nitro crash-looped with "unsupported chain ID 4663" because baseConfig
only had chain.id. Add info-json with on-chain rollup addresses and
chain-config from genesis serializedChainConfig (BoLD v3.x, no validator-utils).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 10:04:16 +00:00
7fc876a321 jovay: add aldaba pruned compose for mainnet and sepolia
Vendor L2 RPC (jovay/l2-rpc:0.14.0-rc1) with init seeding, Traefik
/jovay-mainnet and /jovay-sepolia routes, and dshackle upstream labels.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 09:53:30 +00:00
9accd794c1 kite: add mainnet go-pruned-leveldb compose and subnet-evm config
Add KiteAI Avalanche subnet mainnet node using gokite-chain image with
stock entrypoint, AVAGO_* env configuration, and pruned leveldb chain config.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 09:39:00 +00:00
658ba6151e Bump dshackle gateway image 0.79.5 → 0.79.10
Adds Humanity chain support, Aztec getChainTips fallback, and hyperliquid fix.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 09:29:29 +00:00
7359f3ded8 arb/robinhood: add nitro pruned-pebble-path compose for mainnet and testnet
Orbit rollup on Ethereum/Sepolia with per-chain baseConfig assets (testnet
info-json from official config; mainnet genesis-json-file bootstrap).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-02 09:19:58 +00:00
af1348240c katana mainnet: add Isthmus/Jovian fork times to genesis and rollup
op-reth rejects post-Jovian blocks without isthmusTime/jovianTime in
genesis config and jovian_time in rollup.json; live chain passed both forks.
2026-07-02 06:33:41 +00:00
cecd0d5638 deploy: regenerate compose from vibe-node main cae6f8c29982 2026-07-02 01:19:44 +00:00
bbdc74faba deploy: regenerate compose from vibe-node main 548adca26eab 2026-07-01 14:49:26 +00:00
0e00127088 superseed-sepolia: add Karst fork time (2026-06-17T16:00:00Z)
Add karst_time to rollup.json and karstTime to genesis.json for the
Karst hardfork activation on chain 53302.
2026-07-01 11:08:10 +00:00
f1e71f6dbe polygon: pin bor client to 2.8.3
Downgrade from 2.9.0 to fix mainnet crash-loop on block 81541799
(sender not an eoa) after us-40 purge.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-01 04:21:17 +00:00
edf1254258 Bump Ethereum mainnet Besu image default to 26.6.1
Regenerated from context.yml client_version bump (hyperledger/besu).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-30 18:51:37 +00:00
0709866489 deploy: regenerate compose from vibe-node main e32de131428a 2026-06-30 15:18:53 +00:00
499275ea84 arc: add mainnet (chain 5042) — reth EL + malachite CL
Mirror arc-testnet for mainnet: --chain=arc-mainnet (bundled genesis, chainspec.rs
ARC_SUPPORTED), drpc chain 'arc' (CHAIN_ARC__MAINNET), forwarder rpc.arc.network.
malachite follows rpc.arc.network + arc.drpc.org (testnet endpoints are testnet-only
in Circle's docs). Generates arc/reth/arc-mainnet-reth-{pruned,archive}-trace.yml.
2026-06-30 06:04:29 +00:00
bd49c767da deploy: regenerate compose from vibe-node main 38d9a835af10 2026-06-30 05:15:12 +00:00
sebastian
dcc8c9b6ae Merge pull request 'op-mainnet op-reth: reduce TransactionLookup chunk_size to 500k' (#22) from issue-593 into main
Reviewed-on: #22
2026-06-30 01:05:48 +00:00
2dfe3e9325 deploy: regenerate compose from vibe-node main 6446617d6a59 2026-06-29 15:27:51 +00:00
288d9dcbdf op-mainnet: lower TransactionLookup chunk_size to 500k
Reduce stages.transaction_lookup.chunk_size from 5M to 500k in reth.toml
to prevent multi-hour pipeline stalls during large checkpoint windows on
op-reth-pruned-trace (rpc-de-32).
2026-06-29 15:11:55 +00:00
9fa0917326 arc reth: --full only for pruned/minimal; archive keeps full history
Mirror vanilla reth.yml's client_command_dbopts ({{ '- --full' if db_type in
['pruned','minimal'] else '' }}): the arc execution client now omits --full for the
archive variant (full history) and keeps it for pruned/minimal. Previously --full was
hardcoded so both variants ran identical pruned-sync flags.
2026-06-29 14:56:31 +00:00
e97a63832d deploy: regenerate compose from vibe-node main 9ce518e683bb 2026-06-29 12:03:52 +00:00
1743d869a8 arc: reth client + pruned/archive profiles; drop snapshot-download init container
- EL client renamed arc -> reth (it IS a reth fork); template arc.yml -> reth.arc.yml
  so find_template picks it as the arc-network reth override. Path is now
  arc/reth/arc-testnet-reth-{pruned,archive}-trace.yml (was arc/arc/arc-testnet-arc-full).
- profiles: full -> pruned[trace] + archive[trace] (there is no 'full' node type).
- removed the {{short_name}}-snapshots init container (arc-snapshots download, ~84 GB) and
  the consensus-init depends_on that pointed at it. Chain data is seeded OUT-OF-BAND, never
  via a compose service. Services: arc-testnet (EL) / arc-testnet-node (malachite CL) +
  consensus-init / sockets-init.
- git rm orphaned arc/arc/arc-testnet-arc-full.yml.
2026-06-29 11:51:43 +00:00
fc4ce97aee kona: KONA_NODE_MODE verifier -> Validator (fix startup crash-loop)
kona's NodeMode enum (crates/node/service/src/service/mode.rs) has only
Validator/Sequencer and parses via FromStr against the PascalCase display
strings. There is no 'verifier' mode, so the old value failed to parse and
kona-node crash-looped on startup. Validator is also kona's default.

Source change is env/op/kona.env (global default for all op-stack kona nodes),
so this regenerates KONA_NODE_MODE across all 38 op/*/...--kona compose files.
2026-06-29 10:35:45 +00:00
5533fcc5e3 deploy: regenerate compose from vibe-node main 285b1c2050bd 2026-06-29 09:03:51 +00:00
f843c4eb99 cronos: bump client image to v1.7.8
Update cronos-mainnet compose default CRONOS_CRONOS_VERSION from v1.7.7 to v1.7.8.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 06:31:18 +00:00
a27fbfd5d6 deploy: regenerate compose from vibe-node main b612fafd4d04 2026-06-29 02:11:54 +00:00
0a711cf868 linea: bump linea-besu-package to 1.1.1-20260626-d9f04f0
Update default image tags for mainnet and sepolia besu compose profiles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 11:03:42 +00:00
734 changed files with 102251 additions and 5651 deletions

15
.gitignore vendored
View File

@@ -1,2 +1,17 @@
.env
peer-backups/
# R-2 (fleet-audit): keep chaindata/snapshots/tarballs out of git status. Some land
# in-tree via per-host _DATA overrides or snapshot staging; evict to /slowdisk at the
# next maintenance window — see fleet-audit-2026-07-07.md §R-2.
*.tar
*.tar.*
*.lz4
*.zst
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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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
@@ -98,6 +98,7 @@ services:
- traefik.http.routers.abstract-mainnet-external-node-archive.service=abstract-mainnet-external-node-archive
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-archive-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-archive-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-archive-ws.rule=Host(`$DOMAIN`) && (Path(`/abstract-mainnet-archive`) || Path(`/abstract-mainnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.abstract-mainnet-external-node-archive-ws.rule=(Path(`/abstract-mainnet-archive`) || Path(`/abstract-mainnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.abstract-mainnet-external-node-archive-ws.middlewares=abstract-mainnet-external-node-archive-stripprefix, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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
@@ -98,6 +98,7 @@ services:
- traefik.http.routers.abstract-mainnet-external-node-pruned.service=abstract-mainnet-external-node-pruned
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-pruned-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-pruned-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.abstract-mainnet-external-node-pruned-ws.rule=Host(`$DOMAIN`) && (Path(`/abstract-mainnet`) || Path(`/abstract-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.abstract-mainnet-external-node-pruned-ws.rule=(Path(`/abstract-mainnet`) || Path(`/abstract-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.abstract-mainnet-external-node-pruned-ws.middlewares=abstract-mainnet-external-node-pruned-stripprefix, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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
@@ -98,6 +98,7 @@ services:
- traefik.http.routers.abstract-testnet-external-node-archive.service=abstract-testnet-external-node-archive
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-archive-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-archive-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-archive-ws.rule=Host(`$DOMAIN`) && (Path(`/abstract-testnet-archive`) || Path(`/abstract-testnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.abstract-testnet-external-node-archive-ws.rule=(Path(`/abstract-testnet-archive`) || Path(`/abstract-testnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.abstract-testnet-external-node-archive-ws.middlewares=abstract-testnet-external-node-archive-stripprefix, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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
@@ -98,6 +98,7 @@ services:
- traefik.http.routers.abstract-testnet-external-node-pruned.service=abstract-testnet-external-node-pruned
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-pruned-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-pruned-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.abstract-testnet-external-node-pruned-ws.rule=Host(`$DOMAIN`) && (Path(`/abstract-testnet`) || Path(`/abstract-testnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.abstract-testnet-external-node-pruned-ws.rule=(Path(`/abstract-testnet`) || Path(`/abstract-testnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.abstract-testnet-external-node-pruned-ws.middlewares=abstract-testnet-external-node-pruned-stripprefix, ipallowlist

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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
alephzero-mainnet-archive:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud
- --node.feed.input.url=wss://feed.alephzero.raas.gelato.cloud
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
alephzero-mainnet:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero.raas.gelato.cloud
- --node.feed.input.url=wss://feed.alephzero.raas.gelato.cloud
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
alephzero-sepolia-archive:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital
- --node.feed.input.url=wss://feed.alephzero-testnet.gelato.digital
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
alephzero-sepolia:
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ALEPHZERO_NITRO_IMAGE:-offchainlabs/nitro-node}:${ALEPHZERO_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.alephzero-testnet.gelato.digital
- --node.feed.input.url=wss://feed.alephzero-testnet.gelato.digital
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-nova:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_NOVA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-one:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_ONE_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-sepolia-archive:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -62,6 +62,7 @@ services:
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
@@ -69,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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-sepolia-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -63,6 +63,7 @@ services:
- --http.port=8545
- --http.vhosts=*
- --init.prune=minimal
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
@@ -70,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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-sepolia-minimal:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -62,6 +62,7 @@ services:
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
@@ -69,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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-sepolia:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -63,6 +63,7 @@ services:
- --http.port=8545
- --http.vhosts=*
- --init.prune=full
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
@@ -70,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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
arbitrum-sepolia:
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${ARBITRUM_NITRO_IMAGE:-offchainlabs/nitro-node}:${ARBITRUM_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -62,6 +62,7 @@ services:
- --http.corsdomain=*
- --http.port=8545
- --http.vhosts=*
- --init.validate-genesis-assertion=false
- --metrics
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
@@ -69,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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
connext-sepolia-archive:
image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital
- --node.feed.input.url=wss://feed.connext-sepolia.gelato.digital
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
connext-sepolia:
image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${CONNEXT_NITRO_IMAGE:-offchainlabs/nitro-node}:${CONNEXT_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.connext-sepolia.gelato.digital
- --node.feed.input.url=wss://feed.connext-sepolia.gelato.digital
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
everclear-mainnet-archive:
image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud
- --node.feed.input.url=wss://feed.everclear.raas.gelato.cloud
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
everclear-mainnet:
image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${EVERCLEAR_NITRO_IMAGE:-offchainlabs/nitro-node}:${EVERCLEAR_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.everclear.raas.gelato.cloud
- --node.feed.input.url=wss://feed.everclear.raas.gelato.cloud
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
opencampuscodex-sepolia-archive:
image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital
- --node.feed.input.url=wss://feed.open-campus-codex.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
opencampuscodex-sepolia:
image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${OPENCAMPUSCODEX_NITRO_IMAGE:-offchainlabs/nitro-node}:${OPENCAMPUSCODEX_SEPOLIA_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.open-campus-codex.gelato.digital
- --node.feed.input.url=wss://feed.open-campus-codex.gelato.digital
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
playblock-mainnet-archive:
image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.playblock.io
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.playblock.io
- --node.feed.input.url=wss://feed.playblock.io
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
playblock-mainnet:
image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLAYBLOCK_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLAYBLOCK_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,9 +67,9 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.playblock.io
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.playblock.io
- --node.feed.input.url=wss://feed.playblock.io
- --node.sequencer=false
- --node.staker.enable=false

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-mainnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.0-a618155}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-mainnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.0-a618155}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-mainnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.0-a618155}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-mainnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.0-a618155}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-mainnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-mainnet-1.t.conduit.xyz
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-testnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-testnet-archive:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-testnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
plume-testnet:
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${PLUME_NITRO_IMAGE:-offchainlabs/nitro-node}:${PLUME_TESTNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das-plume-testnet-1.t.conduit.xyz
- --node.feed.input.url=wss://relay-plume-testnet-1.t.conduit.xyz
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
real-mainnet-archive:
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.feed.input.url=wss://feed.realforreal.gelato.digital
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
real-mainnet-archive:
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.feed.input.url=wss://feed.realforreal.gelato.digital
- --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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -30,7 +30,7 @@ x-logging-defaults: &logging-defaults
services:
real-mainnet:
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.10.1-d7f07be}
image: ${REAL_NITRO_IMAGE:-offchainlabs/nitro-node}:${REAL_MAINNET_NITRO_VERSION:-v3.11.2-3599aca}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
@@ -67,13 +67,14 @@ services:
- --metrics-server.addr=0.0.0.0
- --metrics-server.port=6070
- --node.batch-poster.enable=false
- --node.data-availability.enable=true
- --node.data-availability.rest-aggregator.enable=true
- --node.data-availability.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.da.anytrust.enable=true
- --node.da.anytrust.rest-aggregator.enable=true
- --node.da.anytrust.rest-aggregator.urls=https://das.realforreal.gelato.digital
- --node.feed.input.url=wss://feed.realforreal.gelato.digital
- --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

@@ -0,0 +1,145 @@
---
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-pruned-pebble-path.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/robinhood-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
robinhood-mainnet:
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=${ROBINHOOD_MAINNET_ARCHIVE_DB:-false}
- --execution.caching.database-cache=${ROBINHOOD_MAINNET_NITRO_PRUNED_PEBBLE_PATH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${ROBINHOOD_MAINNET_NITRO_PRUNED_PEBBLE_PATH_SNAPSHOT_CACHE:-400}
- --execution.caching.state-scheme=path
- --execution.caching.trie-clean-cache=${ROBINHOOD_MAINNET_NITRO_PRUNED_PEBBLE_PATH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${ROBINHOOD_MAINNET_NITRO_PRUNED_PEBBLE_PATH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://rpc.mainnet.chain.robinhood.com
- --execution.rpc.gas-cap=5500000000
- --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.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
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ROBINHOOD_MAINNET_NITRO_PRUNED_PEBBLE_PATH_DATA:-robinhood-mainnet-nitro-pruned-pebble-path}:/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-pruned-pebble-path-stripprefix.stripprefix.prefixes=/robinhood-mainnet
- traefik.http.services.robinhood-mainnet-nitro-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.robinhood-mainnet-nitro-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/robinhood-mainnet`) || Path(`/robinhood-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.robinhood-mainnet-nitro-pruned-pebble-path.rule=Path(`/robinhood-mainnet`) || Path(`/robinhood-mainnet/`)}
- traefik.http.routers.robinhood-mainnet-nitro-pruned-pebble-path.middlewares=robinhood-mainnet-nitro-pruned-pebble-path-stripprefix, ipallowlist
volumes:
robinhood-mainnet-nitro-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: robinhood
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...

View File

@@ -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

@@ -0,0 +1,145 @@
---
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-pruned-pebble-path.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/robinhood-testnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
robinhood-testnet:
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=${ROBINHOOD_TESTNET_ARCHIVE_DB:-false}
- --execution.caching.database-cache=${ROBINHOOD_TESTNET_NITRO_PRUNED_PEBBLE_PATH_DATABASE_CACHE:-2048}
- --execution.caching.snapshot-cache=${ROBINHOOD_TESTNET_NITRO_PRUNED_PEBBLE_PATH_SNAPSHOT_CACHE:-400}
- --execution.caching.state-scheme=path
- --execution.caching.trie-clean-cache=${ROBINHOOD_TESTNET_NITRO_PRUNED_PEBBLE_PATH_TRIE_CLEAN_CACHE:-600}
- --execution.caching.trie-dirty-cache=${ROBINHOOD_TESTNET_NITRO_PRUNED_PEBBLE_PATH_TRIE_DIRTY_CACHE:-1024}
- --execution.forwarding-target=https://rpc.testnet.chain.robinhood.com
- --execution.rpc.gas-cap=5500000000
- --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.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
- --ws.addr=0.0.0.0
- --ws.origins=*
- --ws.port=8545
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${ROBINHOOD_TESTNET_NITRO_PRUNED_PEBBLE_PATH_DATA:-robinhood-testnet-nitro-pruned-pebble-path}:/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-pruned-pebble-path-stripprefix.stripprefix.prefixes=/robinhood-testnet
- traefik.http.services.robinhood-testnet-nitro-pruned-pebble-path.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-pruned-pebble-path.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-pruned-pebble-path.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.robinhood-testnet-nitro-pruned-pebble-path.rule=Host(`$DOMAIN`) && (Path(`/robinhood-testnet`) || Path(`/robinhood-testnet/`))}
- ${NO_SSL:+traefik.http.routers.robinhood-testnet-nitro-pruned-pebble-path.rule=Path(`/robinhood-testnet`) || Path(`/robinhood-testnet/`)}
- traefik.http.routers.robinhood-testnet-nitro-pruned-pebble-path.middlewares=robinhood-testnet-nitro-pruned-pebble-path-stripprefix, ipallowlist
volumes:
robinhood-testnet-nitro-pruned-pebble-path:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: robinhood-testnet
method-groups:
enabled:
- debug
- filter
methods:
disabled:
# not compatible with path state scheme
- name: debug_traceBlockByHash
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
# standard geth only
- name: debug_getRawBlock
- name: debug_getRawTransaction
- name: debug_getRawReceipts
- name: debug_getRawHeader
- name: debug_getBadBlocks
# non standard geth only slightly dangerous
- name: debug_intermediateRoots
- name: debug_dumpBlock
# standard geth and erigon
- name: debug_accountRange
- name: debug_getModifiedAccountsByNumber
- name: debug_getModifiedAccountsByHash
# non standard geth and erigon
- name: eth_getRawTransactionByHash
- name: eth_getRawTransactionByBlockHashAndIndex
...

View File

@@ -0,0 +1,8 @@
{
"chain": {
"info-json": "[{\"chain-id\":4663,\"parent-chain-id\":1,\"parent-chain-is-arbitrum\":false,\"chain-name\":\"robinhood\",\"chain-config\":{\"chainId\":4663,\"homesteadBlock\":0,\"daoForkBlock\":null,\"daoForkSupport\":true,\"eip150Block\":0,\"eip150Hash\":\"0x0000000000000000000000000000000000000000000000000000000000000000\",\"eip155Block\":0,\"eip158Block\":0,\"byzantiumBlock\":0,\"constantinopleBlock\":0,\"petersburgBlock\":0,\"istanbulBlock\":0,\"muirGlacierBlock\":0,\"berlinBlock\":0,\"londonBlock\":0,\"clique\":{\"period\":0,\"epoch\":0},\"arbitrum\":{\"EnableArbOS\":true,\"AllowDebugPrecompiles\":false,\"DataAvailabilityCommittee\":false,\"InitialArbOSVersion\":51,\"InitialChainOwner\":\"0xc8451c5DE260E7ea1b879e7994967077e71230Ca\",\"GenesisBlockNum\":0,\"MaxCodeSize\":98304,\"MaxInitCodeSize\":196608}},\"rollup\":{\"bridge\":\"0xDf8755334ce7A73cCF6b581C02eA649AE3E864b3\",\"inbox\":\"0x1A07cc4BD17E0118BdB54D70990D2158AbAD7a2D\",\"sequencer-inbox\":\"0xBd0D173EEb87D57A09521c24388a12789F33ba96\",\"rollup\":\"0x23A19d23e89166adedbDcB432518AB01e4272D94\",\"validator-wallet-creator\":\"0xB7FE37712e46F28C8f22Ec4bAA33A09fb8B52BD0\",\"stake-token\":\"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\"deployed-at\":24994238}}]"
},
"init": {
"genesis-json-file": "/config/robinhood-genesis.json"
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
{
"chain": {
"info-json": "[{\"chain-id\":46630,\"parent-chain-id\":11155111,\"parent-chain-is-arbitrum\":false,\"chain-name\":\"Robinhood Chain Sepolia\",\"chain-config\":{\"chainId\":46630,\"homesteadBlock\":0,\"daoForkBlock\":null,\"daoForkSupport\":true,\"eip150Block\":0,\"eip150Hash\":\"0x0000000000000000000000000000000000000000000000000000000000000000\",\"eip155Block\":0,\"eip158Block\":0,\"byzantiumBlock\":0,\"constantinopleBlock\":0,\"petersburgBlock\":0,\"istanbulBlock\":0,\"muirGlacierBlock\":0,\"berlinBlock\":0,\"londonBlock\":0,\"clique\":{\"period\":0,\"epoch\":0},\"arbitrum\":{\"EnableArbOS\":true,\"AllowDebugPrecompiles\":false,\"DataAvailabilityCommittee\":false,\"InitialArbOSVersion\":51,\"InitialChainOwner\":\"0x7131b1c28Df46d845Ee044f2f79AC19Ba14526a8\",\"GenesisBlockNum\":0,\"MaxCodeSize\":98304,\"MaxInitCodeSize\":196608}},\"rollup\":{\"bridge\":\"0x96295BDad104eaD97cC08797b3dC68efF59CcF30\",\"inbox\":\"0xF2939afA86F6f933A3CE17fCAB007907B6b0B7a4\",\"sequencer-inbox\":\"0xA0D9dB3DC9791D54b5183C1C1866eFe1eCA7D414\",\"rollup\":\"0xdc5F8E399DBd8a9F5F87AeC4C23Beb12431b386D\",\"validator-utils\":\"0x0000000000000000000000000000000000000000\",\"validator-wallet-creator\":\"0xB7FE37712e46F28C8f22Ec4bAA33A09fb8B52BD0\",\"stake-token\":\"0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9\",\"deployed-at\":10204516}}]"
}
}

View File

@@ -0,0 +1,183 @@
---
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:arc/reth/arc-mainnet-reth-archive-trace.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/arc-mainnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
arc-mainnet-archive-consensus-init:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_MAINNET_CONSENSUS_VERSION:-0.7.2}
user: 0:0
entrypoint: [/usr/local/bin/arc-node-consensus, init]
command:
- --home=/data/consensus
restart: no
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_ARCHIVE_TRACE_CONSENSUS_DATA:-arc-mainnet-reth-archive-trace-consensus}:/data/consensus
logging: *logging-defaults
arc-mainnet-archive-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [chown 999:999 /sockets]
restart: no
depends_on:
arc-mainnet-archive-consensus-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- arc-mainnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
arc-mainnet-archive:
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_MAINNET_RETH_VERSION:-0.7.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)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: 0:0
expose:
- 8545
- 9001
entrypoint: [/usr/local/bin/arc-node-execution, node]
command:
- --auth-ipc
- --auth-ipc.path=/sockets/auth.ipc
- --chain=arc-mainnet
- --datadir=/data/execution
- --disable-discovery
- --enable-arc-rpc
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,txpool,trace,debug
- --http.port=8545
- --ipcpath=/sockets/reth.ipc
- --log.file.directory=/data/execution/logs
- --metrics=0.0.0.0:9001
- --rpc.forwarder=https://rpc.arc.network/
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-mainnet-archive-sockets-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_ARCHIVE_TRACE_EXECUTION_DATA:-arc-mainnet-reth-archive-trace-execution}:/data/execution
- /slowdisk:/slowdisk
- arc-mainnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.arc-mainnet-reth-archive-trace-stripprefix.stripprefix.prefixes=/arc-mainnet-archive
- traefik.http.services.arc-mainnet-reth-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/arc-mainnet-archive`) || Path(`/arc-mainnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.arc-mainnet-reth-archive-trace.rule=Path(`/arc-mainnet-archive`) || Path(`/arc-mainnet-archive/`)}
- traefik.http.routers.arc-mainnet-reth-archive-trace.middlewares=arc-mainnet-reth-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
arc-mainnet-archive-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_MAINNET_CONSENSUS_VERSION:-0.7.2}
user: 0:0
expose:
- 31000
- 29000
entrypoint: [/usr/local/bin/arc-node-consensus, start]
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.arc.network,wss=rpc.arc.network
- --follow.endpoint=https://arc.drpc.org,wss=arc.drpc.org
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
- --rpc.addr=0.0.0.0:31000
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-mainnet-archive-consensus-init:
condition: service_completed_successfully
arc-mainnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_ARCHIVE_TRACE_CONSENSUS_DATA:-arc-mainnet-reth-archive-trace-consensus}:/data/consensus
- arc-mainnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=29000
volumes:
arc-mainnet-reth-archive-trace-consensus:
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:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
chain: arc
method-groups:
enabled:
- debug
- filter
- trace
methods:
enabled:
- name: txpool_content
...

View File

@@ -0,0 +1,185 @@
---
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:arc/reth/arc-mainnet-reth-pruned-trace.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/arc-mainnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
arc-mainnet-consensus-init:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_MAINNET_CONSENSUS_VERSION:-0.7.2}
user: 0:0
entrypoint: [/usr/local/bin/arc-node-consensus, init]
command:
- --home=/data/consensus
restart: no
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-arc-mainnet-reth-pruned-trace-consensus}:/data/consensus
logging: *logging-defaults
arc-mainnet-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [chown 999:999 /sockets]
restart: no
depends_on:
arc-mainnet-consensus-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- arc-mainnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
arc-mainnet:
image: ${ARC_RETH_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_MAINNET_RETH_VERSION:-0.7.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)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: 0:0
expose:
- 8545
- 9001
entrypoint: [/usr/local/bin/arc-node-execution, node]
command:
- --auth-ipc
- --auth-ipc.path=/sockets/auth.ipc
- --chain=arc-mainnet
- --datadir=/data/execution
- --disable-discovery
- --enable-arc-rpc
- --full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,txpool,trace,debug
- --http.port=8545
- --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
depends_on:
arc-mainnet-sockets-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_PRUNED_TRACE_EXECUTION_DATA:-arc-mainnet-reth-pruned-trace-execution}:/data/execution
- /slowdisk:/slowdisk
- arc-mainnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.arc-mainnet-reth-pruned-trace-stripprefix.stripprefix.prefixes=/arc-mainnet
- traefik.http.services.arc-mainnet-reth-pruned-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-pruned-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-pruned-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-mainnet-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/arc-mainnet`) || Path(`/arc-mainnet/`))}
- ${NO_SSL:+traefik.http.routers.arc-mainnet-reth-pruned-trace.rule=Path(`/arc-mainnet`) || Path(`/arc-mainnet/`)}
- traefik.http.routers.arc-mainnet-reth-pruned-trace.middlewares=arc-mainnet-reth-pruned-trace-stripprefix, ipallowlist
shm_size: 2gb
arc-mainnet-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_MAINNET_CONSENSUS_VERSION:-0.7.2}
user: 0:0
expose:
- 31000
- 29000
entrypoint: [/usr/local/bin/arc-node-consensus, start]
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.arc.network,wss=rpc.arc.network
- --follow.endpoint=https://arc.drpc.org,wss=arc.drpc.org
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
- --rpc.addr=0.0.0.0:31000
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-mainnet-consensus-init:
condition: service_completed_successfully
arc-mainnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ${ARC_MAINNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-arc-mainnet-reth-pruned-trace-consensus}:/data/consensus
- arc-mainnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=29000
volumes:
arc-mainnet-reth-pruned-trace-consensus:
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:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
chain: arc
method-groups:
enabled:
- debug
- filter
- trace
methods:
enabled:
- name: txpool_content
...

View File

@@ -0,0 +1,183 @@
---
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:arc/reth/arc-testnet-reth-archive-trace.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/arc-testnet-archive \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
arc-testnet-archive-consensus-init:
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:
- --home=/data/consensus
restart: no
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_ARCHIVE_TRACE_CONSENSUS_DATA:-arc-testnet-reth-archive-trace-consensus}:/data/consensus
logging: *logging-defaults
arc-testnet-archive-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [chown 999:999 /sockets]
restart: no
depends_on:
arc-testnet-archive-consensus-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- arc-testnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
arc-testnet-archive:
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
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: 0:0
expose:
- 8545
- 9001
entrypoint: [/usr/local/bin/arc-node-execution, node]
command:
- --auth-ipc
- --auth-ipc.path=/sockets/auth.ipc
- --chain=arc-testnet
- --datadir=/data/execution
- --disable-discovery
- --enable-arc-rpc
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,txpool,trace,debug
- --http.port=8545
- --ipcpath=/sockets/reth.ipc
- --log.file.directory=/data/execution/logs
- --metrics=0.0.0.0:9001
- --rpc.forwarder=https://rpc.quicknode.testnet.arc.network/
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-testnet-archive-sockets-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_ARCHIVE_TRACE_EXECUTION_DATA:-arc-testnet-reth-archive-trace-execution}:/data/execution
- /slowdisk:/slowdisk
- arc-testnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.arc-testnet-reth-archive-trace-stripprefix.stripprefix.prefixes=/arc-testnet-archive
- traefik.http.services.arc-testnet-reth-archive-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-archive-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-archive-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-archive-trace.rule=Host(`$DOMAIN`) && (Path(`/arc-testnet-archive`) || Path(`/arc-testnet-archive/`))}
- ${NO_SSL:+traefik.http.routers.arc-testnet-reth-archive-trace.rule=Path(`/arc-testnet-archive`) || Path(`/arc-testnet-archive/`)}
- traefik.http.routers.arc-testnet-reth-archive-trace.middlewares=arc-testnet-reth-archive-trace-stripprefix, ipallowlist
shm_size: 2gb
arc-testnet-archive-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.8.0}
user: 0:0
expose:
- 31000
- 29000
entrypoint: [/usr/local/bin/arc-node-consensus, start]
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.quicknode.testnet.arc.network,wss=rpc.quicknode.testnet.arc.network
- --follow.endpoint=https://rpc.blockdaemon.testnet.arc.network,wss=rpc.blockdaemon.testnet.arc.network/websocket
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
- --rpc.addr=0.0.0.0:31000
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-testnet-archive-consensus-init:
condition: service_completed_successfully
arc-testnet-archive:
condition: service_started
restart: true
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_ARCHIVE_TRACE_CONSENSUS_DATA:-arc-testnet-reth-archive-trace-consensus}:/data/consensus
- arc-testnet-reth-archive-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=29000
volumes:
arc-testnet-reth-archive-trace-consensus:
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:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
chain: arc-testnet
method-groups:
enabled:
- debug
- filter
- trace
methods:
enabled:
- name: txpool_content
...

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -20,7 +20,7 @@ x-logging-defaults: &logging-defaults
# ...
# IP=$(curl ipinfo.io/ip)
# DOMAIN=${IP}.traefik.me
# COMPOSE_FILE=base.yml:rpc.yml:arc/arc/arc-testnet-arc-full.yml
# COMPOSE_FILE=base.yml:rpc.yml:arc/reth/arc-testnet-reth-pruned-trace.yml
#
# docker compose up -d
#
@@ -29,42 +29,23 @@ x-logging-defaults: &logging-defaults
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
arc-testnet-snapshots:
image: ${ARC_ARC_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_ARC_VERSION:-0.7.2}
user: 0:0
entrypoint: [/usr/local/bin/arc-snapshots, download]
command:
- --chain=arc-testnet
- --consensus-path=/data/consensus
- --execution-path=/data/execution
restart: no
networks:
- chains
volumes:
- ${ARC_TESTNET_ARC_FULL_CONSENSUS_DATA:-arc-testnet-arc-full-consensus}:/data/consensus
- ${ARC_TESTNET_ARC_FULL_EXECUTION_DATA:-arc-testnet-arc-full-execution}:/data/execution
logging: *logging-defaults
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:
- --home=/data/consensus
restart: no
depends_on:
arc-testnet-snapshots:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${ARC_TESTNET_ARC_FULL_CONSENSUS_DATA:-arc-testnet-arc-full-consensus}:/data/consensus
- ${ARC_TESTNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-arc-testnet-reth-pruned-trace-consensus}:/data/consensus
logging: *logging-defaults
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:
@@ -72,11 +53,11 @@ services:
networks:
- chains
volumes:
- arc-testnet-arc-full-sockets:/sockets
- arc-testnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
arc-testnet:
image: ${ARC_ARC_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-execution}:${ARC_TESTNET_ARC_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
@@ -90,6 +71,7 @@ services:
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: 0:0
expose:
- 8545
@@ -110,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
@@ -119,25 +102,26 @@ services:
networks:
- chains
volumes:
- ${ARC_TESTNET_ARC_FULL_EXECUTION_DATA:-arc-testnet-arc-full-execution}:/data/execution
- ${ARC_TESTNET_RETH_PRUNED_TRACE_EXECUTION_DATA:-arc-testnet-reth-pruned-trace-execution}:/data/execution
- /slowdisk:/slowdisk
- arc-testnet-arc-full-sockets:/sockets
- arc-testnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.arc-testnet-arc-full-stripprefix.stripprefix.prefixes=/arc-testnet
- traefik.http.services.arc-testnet-arc-full.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-testnet-arc-full.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-testnet-arc-full.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-testnet-arc-full.rule=Host(`$DOMAIN`) && (Path(`/arc-testnet`) || Path(`/arc-testnet/`))}
- ${NO_SSL:+traefik.http.routers.arc-testnet-arc-full.rule=Path(`/arc-testnet`) || Path(`/arc-testnet/`)}
- traefik.http.routers.arc-testnet-arc-full.middlewares=arc-testnet-arc-full-stripprefix, ipallowlist
- traefik.http.middlewares.arc-testnet-reth-pruned-trace-stripprefix.stripprefix.prefixes=/arc-testnet
- traefik.http.services.arc-testnet-reth-pruned-trace.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned-trace.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned-trace.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned-trace.rule=Host(`$DOMAIN`) && (Path(`/arc-testnet`) || Path(`/arc-testnet/`))}
- ${NO_SSL:+traefik.http.routers.arc-testnet-reth-pruned-trace.rule=Path(`/arc-testnet`) || Path(`/arc-testnet/`)}
- traefik.http.routers.arc-testnet-reth-pruned-trace.middlewares=arc-testnet-reth-pruned-trace-stripprefix, ipallowlist
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
@@ -146,12 +130,11 @@ services:
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=50
- --execution-persistence-backpressure-threshold=200
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.blockdaemon.testnet.arc.network,wss=rpc.blockdaemon.testnet.arc.network/websocket
- --follow.endpoint=https://rpc.drpc.testnet.arc.network,wss=rpc.drpc.testnet.arc.network
- --follow.endpoint=https://rpc.quicknode.testnet.arc.network,wss=rpc.quicknode.testnet.arc.network
- --follow.endpoint=https://rpc.blockdaemon.testnet.arc.network,wss=rpc.blockdaemon.testnet.arc.network/websocket
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
@@ -167,17 +150,20 @@ services:
networks:
- chains
volumes:
- ${ARC_TESTNET_ARC_FULL_CONSENSUS_DATA:-arc-testnet-arc-full-consensus}:/data/consensus
- arc-testnet-arc-full-sockets:/sockets
- ${ARC_TESTNET_RETH_PRUNED_TRACE_CONSENSUS_DATA:-arc-testnet-reth-pruned-trace-consensus}:/data/consensus
- arc-testnet-reth-pruned-trace-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=29000
volumes:
arc-testnet-arc-full-consensus:
arc-testnet-arc-full-execution:
arc-testnet-arc-full-sockets:
arc-testnet-reth-pruned-trace-consensus:
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}

View File

@@ -0,0 +1,185 @@
---
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:arc/reth/arc-testnet-reth-pruned.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/arc-testnet \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
arc-testnet-consensus-init:
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:
- --home=/data/consensus
restart: no
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_PRUNED_CONSENSUS_DATA:-arc-testnet-reth-pruned-consensus}:/data/consensus
logging: *logging-defaults
arc-testnet-sockets-init:
image: debian:bookworm-slim
entrypoint: [/bin/sh, -c]
command: [chown 999:999 /sockets]
restart: no
depends_on:
arc-testnet-consensus-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- arc-testnet-reth-pruned-sockets:/sockets
logging: *logging-defaults
arc-testnet:
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
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
memlock: -1 # Disable memory locking limits (for in-memory DBs like MDBX)
user: 0:0
expose:
- 8545
- 9001
entrypoint: [/usr/local/bin/arc-node-execution, node]
command:
- --auth-ipc
- --auth-ipc.path=/sockets/auth.ipc
- --chain=arc-testnet
- --datadir=/data/execution
- --disable-discovery
- --enable-arc-rpc
- --full
- --http
- --http.addr=0.0.0.0
- --http.api=eth,net,web3,txpool,trace,debug
- --http.port=8545
- --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
depends_on:
arc-testnet-sockets-init:
condition: service_completed_successfully
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_PRUNED_EXECUTION_DATA:-arc-testnet-reth-pruned-execution}:/data/execution
- /slowdisk:/slowdisk
- arc-testnet-reth-pruned-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=9001
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.arc-testnet-reth-pruned-stripprefix.stripprefix.prefixes=/arc-testnet
- traefik.http.services.arc-testnet-reth-pruned.loadbalancer.server.port=8545
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.arc-testnet-reth-pruned.rule=Host(`$DOMAIN`) && (Path(`/arc-testnet`) || Path(`/arc-testnet/`))}
- ${NO_SSL:+traefik.http.routers.arc-testnet-reth-pruned.rule=Path(`/arc-testnet`) || Path(`/arc-testnet/`)}
- traefik.http.routers.arc-testnet-reth-pruned.middlewares=arc-testnet-reth-pruned-stripprefix, ipallowlist
shm_size: 2gb
arc-testnet-node:
image: ${ARC_CONSENSUS_IMAGE:-docker.cloudsmith.io/circle/arc-network/arc-consensus}:${ARC_TESTNET_CONSENSUS_VERSION:-0.8.0}
user: 0:0
expose:
- 31000
- 29000
entrypoint: [/usr/local/bin/arc-node-consensus, start]
command:
- --eth-socket=/sockets/reth.ipc
- --execution-persistence-backpressure
- --execution-persistence-backpressure-threshold=200
- --execution-socket=/sockets/auth.ipc
- --follow
- --follow.endpoint=https://rpc.quicknode.testnet.arc.network,wss=rpc.quicknode.testnet.arc.network
- --follow.endpoint=https://rpc.blockdaemon.testnet.arc.network,wss=rpc.blockdaemon.testnet.arc.network/websocket
- --full
- --home=/data/consensus
- --metrics=0.0.0.0:29000
- --rpc.addr=0.0.0.0:31000
restart: unless-stopped
stop_grace_period: 5m
depends_on:
arc-testnet-consensus-init:
condition: service_completed_successfully
arc-testnet:
condition: service_started
restart: true
networks:
- chains
volumes:
- ${ARC_TESTNET_RETH_PRUNED_CONSENSUS_DATA:-arc-testnet-reth-pruned-consensus}:/data/consensus
- arc-testnet-reth-pruned-sockets:/sockets
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=29000
volumes:
arc-testnet-reth-pruned-consensus:
arc-testnet-reth-pruned-execution:
arc-testnet-reth-pruned-sockets:
x-ephemeral-volumes:
- arc-testnet-reth-pruned-sockets
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
chain: arc-testnet
method-groups:
enabled:
- debug
- filter
- trace
methods:
enabled:
- name: txpool_content
...

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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-fuji-go-archive-leveldb.service=avalanche-fuji-go-archive-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-archive-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-archive-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-archive-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji-archive`) || Path(`/avalanche-fuji-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-archive-leveldb-ws.rule=(Path(`/avalanche-fuji-archive`) || Path(`/avalanche-fuji-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-fuji-go-archive-leveldb-ws.middlewares=avalanche-fuji-go-archive-leveldb-stripprefix, avalanche-fuji-go-archive-leveldb-set-ws-path, ipallowlist
@@ -106,7 +107,7 @@ x-upstreams:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: avalanche
chain: avalanche-fuji
method-groups:
enabled:
- debug

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-fuji-go-pruned-leveldb.service=avalanche-fuji-go-pruned-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.rule=(Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.middlewares=avalanche-fuji-go-pruned-leveldb-stripprefix, avalanche-fuji-go-pruned-leveldb-set-ws-path, ipallowlist
@@ -106,7 +107,7 @@ x-upstreams:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: avalanche
chain: avalanche-fuji
method-groups:
enabled:
- debug

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -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
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-fuji-go-pruned-leveldb.service=avalanche-fuji-go-pruned-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.rule=(Path(`/avalanche-fuji`) || Path(`/avalanche-fuji/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-fuji-go-pruned-leveldb-ws.middlewares=avalanche-fuji-go-pruned-leveldb-stripprefix, avalanche-fuji-go-pruned-leveldb-set-ws-path, ipallowlist
@@ -106,7 +107,7 @@ x-upstreams:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: avalanche
chain: avalanche-fuji
method-groups:
enabled:
- debug

View File

@@ -1,118 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# 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}
- ${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,118 +0,0 @@
---
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
# 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}
- ${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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-mainnet-go-archive-leveldb.service=avalanche-mainnet-go-archive-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-archive-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-archive-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-archive-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet-archive`) || Path(`/avalanche-mainnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-archive-leveldb-ws.rule=(Path(`/avalanche-mainnet-archive`) || Path(`/avalanche-mainnet-archive/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-archive-leveldb-ws.middlewares=avalanche-mainnet-go-archive-leveldb-stripprefix, avalanche-mainnet-go-archive-leveldb-set-ws-path, ipallowlist

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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-mainnet-go-pruned-leveldb.service=avalanche-mainnet-go-pruned-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.rule=(Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.middlewares=avalanche-mainnet-go-pruned-leveldb-stripprefix, avalanche-mainnet-go-pruned-leveldb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-mainnet-go-pruned-leveldb.service=avalanche-mainnet-go-pruned-leveldb
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.rule=(Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-pruned-leveldb-ws.middlewares=avalanche-mainnet-go-pruned-leveldb-stripprefix, avalanche-mainnet-go-pruned-leveldb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb.service=avalanche-mainnet-go-pruned-pebbledb
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.rule=(Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.middlewares=avalanche-mainnet-go-pruned-pebbledb-stripprefix, avalanche-mainnet-go-pruned-pebbledb-set-ws-path, ipallowlist

View File

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
max-size: "512m"
max-file: "2"
# Usage:
#
@@ -87,6 +87,7 @@ services:
- traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb.service=avalanche-mainnet-go-pruned-pebbledb
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.rule=Host(`$DOMAIN`) && (Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.rule=(Path(`/avalanche-mainnet`) || Path(`/avalanche-mainnet/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.avalanche-mainnet-go-pruned-pebbledb-ws.middlewares=avalanche-mainnet-go-pruned-pebbledb-stripprefix, avalanche-mainnet-go-pruned-pebbledb-set-ws-path, ipallowlist

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

@@ -2,8 +2,8 @@
x-logging-defaults: &logging-defaults
driver: json-file
options:
max-size: "10m"
max-file: "3"
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.
@@ -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

@@ -0,0 +1,128 @@
---
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:babylon/babylond/babylon-mainnet-babylond-pruned.yml
#
# docker compose up -d
#
# curl -X POST https://${IP}.traefik.me/babylon-mainnet-pruned \
# -H "Content-Type: application/json" \
# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
services:
babylon-mainnet-pruned:
build:
context: ./babylon
dockerfile: cometbft.Dockerfile
args:
CL_IMAGE: ${BABYLON_BABYLOND_IMAGE:-babylonlabs/babylond}
CL_VERSION: ${BABYLON_MAINNET_BABYLOND_VERSION:-v4.3.0}
sysctls:
# TCP Performance
net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle
net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache
net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers
net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers
net.core.somaxconn: 32768 # Higher connection queue
# Memory/Connection Management
# net.core.netdev_max_backlog: 50000 # Increase network buffer
net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests
net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets
ulimits:
nofile: 1048576 # Max open files (for RPC/WS connections)
user: root
ports:
- 10871:10871
- 10871:10871/udp
expose:
- 26657
- 26660
- 9090
- 1317
environment:
- CHAIN_ID=bbn-1
- GENESIS_URL=https://raw.githubusercontent.com/babylonlabs-io/networks/main/bbn-1/network-artifacts/genesis.json
- IP=${IP}
- MIN_GAS=0.002ubbn
- MONIKER=d${DOMAIN:-local}
- P2P_PORT=10871
- SEEDS=42fad8afbf7dfca51020c3c6e1a487ce17c4c218@babylon-seed-1.nodes.guru:55706,ade4d8bc8cbe014af6ebdf3cb7b1e9ad36f412c0@seeds.polkachu.com:20656
- STATESYNC_RPC=https://babylon-rpc.polkachu.com:443
- WASM_SNAPSHOT_URL=https://snapshots.polkachu.com/wasm/babylon/babylon_wasmonly.tar.lz4
restart: unless-stopped
stop_grace_period: 5m
networks:
- chains
volumes:
- ${BABYLON_MAINNET_BABYLOND_PRUNED_DATA:-babylon-mainnet-babylond-pruned}:/root/.babylond
- /slowdisk:/slowdisk
logging: *logging-defaults
labels:
- prometheus-scrape.enabled=true
- prometheus-scrape.port=26660
- prometheus-scrape.path=/metrics
- traefik.enable=true
- traefik.http.middlewares.babylon-mainnet-babylond-pruned-stripprefix.stripprefix.prefixes=/babylon-mainnet-pruned
- traefik.http.services.babylon-mainnet-babylond-pruned.loadbalancer.server.port=26657
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned.tls.certresolver=myresolver}
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned.rule=Host(`$DOMAIN`) && (Path(`/babylon-mainnet-pruned`) || Path(`/babylon-mainnet-pruned/`))}
- ${NO_SSL:+traefik.http.routers.babylon-mainnet-babylond-pruned.rule=Path(`/babylon-mainnet-pruned`) || Path(`/babylon-mainnet-pruned/`)}
- traefik.http.routers.babylon-mainnet-babylond-pruned.middlewares=babylon-mainnet-babylond-pruned-stripprefix, ipallowlist
- traefik.http.routers.babylon-mainnet-babylond-pruned.priority=50 # gets any request that is not GET with UPGRADE header
- traefik.http.routers.babylon-mainnet-babylond-pruned-ws.priority=100 # answers GET requests first
- traefik.http.middlewares.babylon-mainnet-babylond-pruned-set-ws-path.replacepath.path=/websocket
- traefik.http.services.babylon-mainnet-babylond-pruned-ws.loadbalancer.server.port=26657
- traefik.http.routers.babylon-mainnet-babylond-pruned-ws.service=babylon-mainnet-babylond-pruned-ws
- traefik.http.routers.babylon-mainnet-babylond-pruned.service=babylon-mainnet-babylond-pruned
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned-ws.entrypoints=websecure}
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned-ws.tls.certresolver=myresolver}
# case-insensitive Upgrade: python websocket-client sends "WebSocket" (capital W)
- ${NO_SSL:-traefik.http.routers.babylon-mainnet-babylond-pruned-ws.rule=Host(`$DOMAIN`) && (Path(`/babylon-mainnet-pruned`) || Path(`/babylon-mainnet-pruned/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- ${NO_SSL:+traefik.http.routers.babylon-mainnet-babylond-pruned-ws.rule=(Path(`/babylon-mainnet-pruned`) || Path(`/babylon-mainnet-pruned/`)) && HeadersRegexp(`Upgrade`, `(?i)websocket`)}
- traefik.http.routers.babylon-mainnet-babylond-pruned-ws.middlewares=babylon-mainnet-babylond-pruned-stripprefix, babylon-mainnet-babylond-pruned-set-ws-path, ipallowlist
volumes:
babylon-mainnet-babylond-pruned:
x-upstreams:
- id: $${ID}
labels:
provider: $${PROVIDER}
connection:
generic:
rpc:
url: $${RPC_URL}
ws:
frameSize: 20Mb
msgSize: 50Mb
url: $${WS_URL}
chain: babylon
method-groups:
enabled:
- debug
- filter
methods:
disabled:
enabled:
- name: txpool_content # TODO: should be disabled for rollup nodes
...

View File

@@ -0,0 +1,11 @@
ARG CL_IMAGE
ARG CL_VERSION
FROM ${CL_IMAGE}:${CL_VERSION}
# Layer the shared CometBFT bootstrap lib + the chain init.sh onto the upstream
# babylond binary image (alpine-based, has sh+apk; runs nonroot by default — the compose
# sets user: root so init.sh can apk-add curl and write the /root home).
USER root
COPY ./scripts/cometbft-common.sh /usr/local/bin/cometbft-common.sh
COPY ./scripts/init.sh /usr/local/bin/init.sh
RUN chmod +x /usr/local/bin/init.sh /usr/local/bin/cometbft-common.sh
ENTRYPOINT ["init.sh"]

View File

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

55
babylon/scripts/init.sh Normal file
View File

@@ -0,0 +1,55 @@
#!/bin/sh
# babylon-genesis (babylond) entrypoint — family C, pure CometBFT (no EL). Thin: sources the
# shared cometbft-common.sh and orchestrates init + statesync bootstrap + start.
# Genesis replay is impractical; statesync near head with the current binary.
# Serves CometBFT RPC :26657 (the dshackle upstream).
set -e
. /usr/local/bin/cometbft-common.sh
HOME_DIR="/root/.babylond"
CONFIG_DIR="$HOME_DIR/config"
CHAIN_ID="${CHAIN_ID:-bbn-1}"
GENESIS_URL="${GENESIS_URL:-https://raw.githubusercontent.com/babylonlabs-io/networks/main/bbn-1/network-artifacts/genesis.json}"
STATESYNC_RPC="${STATESYNC_RPC:-https://babylon-rpc.polkachu.com:443}"
MIN_GAS="${MIN_GAS:-0.002ubbn}"
MONIKER="${MONIKER:-rpc-node}"
ct_apk curl jq
if babylond init "$MONIKER" --chain-id "$CHAIN_ID" --home "$HOME_DIR" >/dev/null 2>&1; then
ct_log "fresh init; fetching genesis"
ct_fetch "$GENESIS_URL" "$CONFIG_DIR/genesis.json" required
ct_localize_home "$CONFIG_DIR"
ct_set_min_gas_prices "$CONFIG_DIR/app.toml" "$MIN_GAS"
else
ct_log "already initialized, continuing"
fi
# v4.x start prompts for a BLS password if no key exists; RPC replicas never sign
# checkpoints, so pre-create an empty-password key before the first start.
if [ ! -f "$CONFIG_DIR/bls_key.json" ]; then
ct_log "pre-creating BLS key (no password — RPC replica)"
babylond create-bls-key --home "$HOME_DIR" --no-bls-password
fi
# Serve RPC on all interfaces (dshackle/traefik upstream); default is 127.0.0.1.
sed -i '/^\[rpc\]/,/^\[/{s|^laddr = .*|laddr = "tcp://0.0.0.0:26657"|}' "$CONFIG_DIR/config.toml"
# Babylon Genesis block time (9200ms) — required for consensus.
sed -i 's|^timeout_commit = .*|timeout_commit = "9200ms"|' "$CONFIG_DIR/config.toml"
# BTC checkpointing network params only — no bitcoind needed for an RPC replica.
sed -i '/^\[btc-config\]/,/^\[/{s|^network = .*|network = "mainnet"|}' "$CONFIG_DIR/app.toml"
# Recommended for pruned RPC nodes (reduces memory pressure).
sed -i 's|^iavl-cache-size = .*|iavl-cache-size = 0|' "$CONFIG_DIR/app.toml"
ct_patch_p2p "$CONFIG_DIR/config.toml" "$IP" "${P2P_PORT:-26656}"
ct_merge_seeds "$CONFIG_DIR/config.toml" "$SEEDS"
ct_set_persistent_peers "$CONFIG_DIR/config.toml" "$PERSISTENT_PEERS"
ct_set_moniker "$CONFIG_DIR/config.toml" "$MONIKER"
ct_configure_statesync "$CONFIG_DIR/config.toml" "$STATESYNC_RPC"
ct_ensure_wasm "$HOME_DIR" "$WASM_SNAPSHOT_URL"
ct_seed_priv_validator_state "$HOME_DIR"
exec babylond start --home "$HOME_DIR" --minimum-gas-prices "$MIN_GAS" --no-bls-password "$@"

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