Skip to content

Celadon audit - #1072

Draft
tomatoishealthy wants to merge 13 commits into
release/0.6.3from
Celadon-audit
Draft

tomatoishealthy wants to merge 13 commits into
release/0.6.3from
Celadon-audit

Conversation

@tomatoishealthy

Copy link
Copy Markdown
Contributor

No description provided.

panos-xyz and others added 13 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
Co-authored-by: allen.wu <allen.wu@bitget.com>
#1065)

Co-authored-by: kukoo.yue <kukoo.yue@bitget.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: allen.wu <allen.wu@bitget.com>
Point every Tendermint module replacement at morph-l2/tendermint#45's merged commit and refresh the affected checksums.
…ll-depth

chore(deps): update Tendermint for backfill recovery
@coderabbitai

coderabbitai Bot commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

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.

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.

3 participants