Centralization cleanup - #1038
Conversation
…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
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Team Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
Co-authored-by: allen.wu <allen.wu@bitget.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat: allow third-party submitter staking
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
update go-ethereum tag
…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.
…1057) Co-authored-by: allen.wu <allen.wu@bitget.com>
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
No description provided.