Skip to content

Centralization cleanup - #1038

Open
SegueII wants to merge 69 commits into
release/0.6.2from
main
Open

Centralization cleanup#1038
SegueII wants to merge 69 commits into
release/0.6.2from
main

Conversation

@SegueII

@SegueII SegueII commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

No description provided.

curryxbo and others added 30 commits August 11, 2026 15:29
…h guard, metrics port) (#1034)

Co-authored-by: corey <corey.zhang@bitget.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: corey <corey.zhang@bitget.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Program vkey: 0x00c684101523a06415be6d72d011eebaf465b4c1da4e3b18ab052a29d7ac6e88

ELF SHA-256: f916cf05f462c08692b28a112ecc65ae7a66e7648bdedcd264648993fa666719
@coderabbitai

coderabbitai Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: 1f7725d4-5106-4522-82f2-9e11b7bafe95

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Billing warning: we have not been able to collect payment for this subscription for more than 72 hours. Please update the payment method or pay any pending invoices in Billing to avoid service interruption.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

tomatoishealthy and others added 20 commits August 24, 2026 11:11
Co-authored-by: allen.wu <allen.wu@bitget.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: kukoo.yue <kukoo.yue@bitget.com>
chore(challenge-handler): opt proveState
Stop documenting blob_count_mismatch as a BatchStatus divergence, and stop wrapping ErrBatchVerifyDivergence on that packing error so the sentinel matches the call site.

Co-authored-by: Cursor <cursoragent@cursor.com>
Restore the ErrBatchVerifyDivergence wrap on blob_count_mismatch and the surrounding comment text; correct only the sentences that claimed the rebuildBlob path sets BatchStatus=stateException.

Co-authored-by: Cursor <cursoragent@cursor.com>
…entinel

docs(derivation): stateException is only from verifyBatchRoots
…d never rough-estimate past a revert

commitBatch / commitState / finalizeBatch all carry onlyActiveSubmitter on L1,
but the activity probe only ran once, in PreCheck at Start(). A submitter can be
removed, slashed, priced out by a raised minimum stake, or start withdrawing at
any point afterwards, and the rollup / finalize loops kept submitting against a
stale startup result.

With rough_estimate_gas enabled this became a funds leak rather than a stall:
eth_estimateGas fails on the revert, the rough fallback swallowed that failure
and guessed a gas limit, and the tx was signed and sent anyway. The reverting tx
refunds unused execution gas, but a commitBatch blob tx is charged its full blob
fee regardless of revert. Nothing broke the cycle — the failed receipt only logs
a warning, and once the tx leaves the pending pool the loop re-derives the same
batch index and resends, with no low-balance guard.

- extract ensureActiveSubmitter and call it at the top of rollup() and
  finalize(); an RPC failure on the probe also stops submission rather than
  assuming the wallet is still eligible
- gate both rough-estimate fallbacks on utils.IsExecutionRevertErr, so the flag
  still covers a flaky/unreachable node but never guesses past a contract
  rejection

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
fix(tx-submitter): re-check submitter activity before each submit, and never rough-estimate past a revert
panos-xyz and others added 8 commits August 31, 2026 15:37
…o ha-el

The devnet execution-layer nodes were not peered with each other, and the HA
cluster could not reach a usable state at all. Three independent causes, each
failing silently:

reth had no peers. docker-compose-reth.yml set --disable-discovery but never
supplied --trusted-peers, and reth does not read geth's static-nodes.json, so
net_peerCount was 0x0 on every reth node. It also mounted no nodekey, so reth
minted a random identity per datadir and no peer list could be written ahead of
time.

The HA execution nodes never peered with each other under either client: they
mount static-nodes.json, which lists only morph-el-0 and morph-el-1.

The HA consensus nodes never peered with each other either. setup_nodes.py
overwrote the persistent_peers generated by --populate-persistent-peers with a
hardcoded node-0/node-1/node-2 list. node-1 runs with
MORPH_NODE_DERIVATION_VERIFY_MODE=layer1 and never starts tendermint, and
node-2 has no compose service, so each ha-node-* had exactly one reachable peer
and none of each other. The sequencer hand-over waits for the block pool to
report caught up, which never happened, so make devnet-up-cluster* stalled at
height 0 - the failure mode already described in ops/README.md. Hardcoding the
IDs could not have worked anyway: ops/docker/ has no ha-node0/1/2 directories,
so those nodes keep the random key tendermint generates.

Changes:

- docker-compose-reth.yml points every node at the same nodekey*/ha-nodekey*
  file geth uses, via --p2p-secret-key, and passes explicit --trusted-peers, so
  both clients derive the same enode for a node.
- static-nodes-cluster.json gives the geth cluster path the peers it lacked.
- ha-nodekey0/1/2 and nodekey2 had a trailing newline, which reth rejects with
  "malformed or out-of-range secret key" while geth tolerates it. Stripped, so
  one file serves both clients.
- setup_nodes.py derives each node ID from the node_key.json that actually ends
  up installed, and lists only the nodes that run tendermint. Copying the keys
  moved ahead of building the peer list, since overwriting a node_key.json
  changes the node's identity. Tendermint RPC now binds 0.0.0.0 so the ports in
  the README endpoint table are reachable from the host.
- docker-compose-cluster.yml is layered before docker-compose-reth.yml. Later
  -f files win, so the previous order let the cluster file's geth image and
  entrypoint override the reth override, and devnet-up-cluster-reth silently ran
  geth for ha-el-*.
- ha-geth-0/1/2 renamed to ha-el-0/1/2, since either client can back these
  services. The .devnet/ha-el* data directories already used that name.

Verified with make devnet-clean-build && make devnet-up-cluster-reth: all five
execution nodes report 4 peers and identical height, node-0 and the three
ha-node-* report 3 peers each, the HA leader produces blocks, and the reth
enodes match the values the geth static-nodes files have always used.
Co-authored-by: allen.wu <allen.wu@bitget.com>
…nect

fix(devnet): peer the execution and consensus nodes, rename ha-geth to ha-el
…known (#1041)

Co-authored-by: allen.wu <allen.wu@bitget.com>
docker-compose-reth.yml carried reth overrides for ha-el-0/1/2 on the
assumption that compose would ignore them unless
docker-compose-cluster.yml was layered in as well. It does not: compose
creates any service a later -f file names, whether or not an earlier
file declared it. So `make devnet-up-reth` also started three ha-el-*
containers, which only got the -f file's own ha-nodekey mount and none
of the /genesis.json or /jwt-secret.txt mounts that live in the cluster
file. All three died immediately with

    error: Invalid value '/genesis.json' for --chain <CHAIN_OR_PATH>:
    No such file or directory

Move those three service overrides into docker-compose-cluster-reth.yml
and pass it only when both --cluster and reth are asked for, so the
plain reth devnet now resolves to exactly the geth devnet's service
list. The cluster path is unchanged: ha-el-* still come up on the reth
image and entrypoint with the cluster's mounts intact.
Claude Code keeps its git worktrees under .claude/worktrees. On a machine
that has used one, .claude is 1.0 GB -- comparable to .git (1.1 GB) and
prover (1.2 GB), both of which .dockerignore already excludes. Nothing
under it is ever needed by a build, so every image build was shipping it
as build context: ~3.0 GB transferred where ~2.0 GB is required.
…erride

fix(devnet): scope the ha-el reth overrides, and keep .claude out of the build context
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants