Register privacy L3 devnet chain 84534 for nitro proving#3435
Conversation
Adds privacy-sepolia rollup config with Base Sepolia (84532) as L1 parent, including L1_CONFIGS entry for OP-stack parent proving and config-hash tests. Genesis anchors and contract addresses are placeholders until privacy devnet pins deploy-once genesis. Co-authored-by: Cursor <cursoragent@cursor.com>
| spin.workspace = true | ||
| auto_impl.workspace = true | ||
| serde = { workspace = true, optional = true } | ||
| serde_json = { workspace = true, default-features = false, features = ["alloc"] } |
There was a problem hiding this comment.
serde_json is added as a required (non-optional) runtime dependency to this #![no_std] crate. The existing Ethereum L1 configs are all built programmatically — no JSON deserialization needed at runtime. This new dependency is only used by BaseSepolia::l1_config() to parse a single embedded JSON blob at lazy-init time.
Consider one of these alternatives to avoid inflating the dependency graph for all consumers (including zkVM proof clients):
- Feature-gate it: make
serde_jsonoptional behind a feature (e.g.,op-l1-configs) and gate theopmodule on that feature. - Build-time codegen: deserialize in
build.rsand emit theChainConfigas aconst(matching the pattern used for the other chains).
| map.insert(NamedChain::Sepolia.into(), Sepolia::l1_config()); | ||
| map.insert(NamedChain::Holesky.into(), Holesky::l1_config()); | ||
| map.insert(NamedChain::Hoodi.into(), Hoodi::l1_config()); | ||
| map.insert(84532, BaseSepolia::l1_config()); |
There was a problem hiding this comment.
Nit: Base Sepolia (84532) is an OP-stack L2, not an Ethereum L1 chain. The module doc comment on line 1 says "Static Ethereum L1 chain configuration mapping" and this lives under the ethereum/ module, which makes the placement a bit misleading.
L1_CONFIGS is semantically correct from the L3's perspective (Base Sepolia is the L3's "L1 parent"), but you may want to either:
- Update the module doc to say "parent chain configurations" instead of "Ethereum L1 chain configurations", or
- Rename this map / move it out of the
ethereummodule to reflect it now holds non-Ethereum entries too.
Not blocking, but worth considering as more OP-stack L1 parents may follow.
Review SummaryThe PR correctly registers a new privacy L3 devnet chain (84534) and its OP-stack parent (Base Sepolia 84532) for nitro proving. The chain config follows established patterns, tests are solid, and config hash regression tests are included. Two items flagged: Findings
No correctness, safety, or concurrency issues found. |
❌ base-std fork tests: 4 failed, 611 passedbase/base diverges from the base-std spec. Failing tests
|
Summary
privacy-sepolia(ChainConfigchain ID 84534, parent L1 84532) so nitro host/enclave can resolverollup_config!(84534)and precompute config hashes.L1_CONFIGSas an OP-stack L1 parent config (required by nitro-hostprover_config()when proving L3 batches derived from Base Sepolia).Placeholder fields (follow-up required)
Genesis anchors, L1 contract addresses, and azul/beryl timestamps currently use zero/derived placeholders. They must be updated after privacy-enclave pins a deploy-once genesis so
PerChainConfig::hash()matches the live rollup config at runtime.Privacy devnet params encoded today:
block_time=2,seq_window=3600, azul block 20 / beryl block 21 → timestamps 40/42 (assumesgenesis_l2_time=0)batch_inbox:0xff...84534activation_admin: devnet Anvil account0x9965...Test plan
cargo test -p base-common-chains --libcargo test -p base-proof-tee-nitro-enclave config_hashes_match_chain_configscargo test -p base-proof-succinct-client-utils test_config_hash_matches_nitro_enclaveBASE_COMMITand bump privacy-enclave mirror digests (after merge)PRIVACY_SEPOLIAMade with Cursor