Optimism 仓库 Rust 开发指南:工作区结构、构建测试与提交规范全解析
Optimism 仓库 Rust 开发指南工作区结构、构建测试与提交规范全解析【免费下载链接】optimismOptimism is Ethereum, scaled.项目地址: https://gitcode.com/GitHub_Trending/op/optimism本指南面向在 Optimism 单仓库monorepo中从事 Rust 开发与代码审查的工程师及 AI Agent系统梳理rust/统一 Cargo 工作区的组件布局、构建/测试/Lint 命令体系、no_std 兼容约束、硬分叉映射规则与 reth 依赖升级流程。读完本文你将掌握从「干净检出」到「通过 CI 提交」的完整 Rust 开发闭环并理解 OP Stack 各 Rust 组件kona、op-reth、op-alloy、lokahi之间及与 Go 侧实现之间的依赖关系与协作边界。一、Rust 工作区全景迁移而非 Vendored所有 Rust 代码统一位于仓库根下的rust/目录它是一个单一 Cargo 工作区unified Cargo workspace。所有 Rust 命令都必须在rust/目录内执行——不要在仓库其他位置直接运行cargo。完整的 workspace 成员列表、依赖版本与 lint 配置见 rust/Cargo.toml工具链版本固定在 rust/rust-toolchain.toml。1.1 四大组件群工作区目前包含四个主要组件群[workspace].members中均有对应条目组件目录定位Konarust/kona/证明系统fault proof与 rollup 节点含kona-node、kona-host、kona-client二进制及kona-sp1-*系列 crateOp-Rethrust/op-reth/基于 reth 构建的 OP Stack 执行客户端二进制为op-rethOp-Alloy / Alloy 扩展rust/op-alloy/、rust/alloy-op-evm/、rust/alloy-op-hardforks/OP Stack 交易/收据类型、provider、EVM 与硬分叉扩展Lokahirust/lokahi/Go 版op-supernode多链共识层宿主binary 为lokahi的 Rust 重写目前处于早期开发阶段crate 仅构建出 CLI 骨架此外工作区还包含op-revmOP 版 revm 扩展、revm-ee-testsrevm 执行环境集成测试、op-reth-test-engine用于 op-e2e/actions 对等验证的测试执行层、op-versionop-reth 与 kona-node 共享的构建/版本元数据等辅助 crate。default-members仅包含kona-host、kona-client、kona-node与op-reth/bin/因此对 lokahi 这类非默认成员构建时必须显式-p lokahi见 rust/justfile 中build-lokahi的注释说明。1.2 迁移而来而非 vendored 拷贝这是理解本仓库 Rust 代码的关键事实大多数 OP Stack Rust 代码是与上游仓库所有者协调后正式迁移进 monorepo 的不是第三方代码的 vendored 快照。上游对应 crate 已被删除或标记废弃整个 Rust OP Stack 现在都在本仓库内开发。适用对象包括op-rethrust/op-reth/kona-*rust/kona/op-alloy-*rust/op-alloy/alloy-op-*rust/alloy-op-evm/、rust/alloy-op-hardforks/op-revmrust/op-revm/这些 crate 直接在本地维护与编辑不要到上游仓库查找它们的源码。但它们仍依赖通用上游 crate如 reth 的 engine/provider 系 crate、alloy、revm这些依赖保持外部引用并固定在 rust/Cargo.toml 的[workspace.dependencies]中。例如 reth 系依赖统一指向git https://github.com/op-rs/reth的同一个revalloy-*与revm系则来自 crates.io。若某个通用上游 API 发生变更需要先在上游修改、再通过版本 bump 引入当上游行为/API 变更能带来比本地 workaround 更优的整体方案时向上游提 PR 是合理甚至更受推荐的做法。已知例外op-alloy-flz尚未迁移仍是外部依赖版本 0.13.1见 rust/Cargo.toml 中[workspace.dependencies]的op-alloy-flz条目。1.3 工作区工具配置的位置约束工作区级工具配置位于rust/.config/nextest.toml测试运行设置含 JUnit 输出、慢测试超时、特定用例重试zepter.yamlfeature 传播feature-propagationlint 配置一个容易踩坑的约束nextest、zepter、cargo-release只会从工作区根目录发现配置。因此各组件目录下如rust/crate/.config/*.toml的配置文件不会被读取、完全无效——新增测试或 lint 配置必须放在rust/.config/。以 rust/.config/nextest.toml 为例其设计细节包括profile.default默认不做测试重试flaky 测试应当响亮地失败并被修复而不是被重试掩盖唯一例外是p2p_version::peers_negotiate_eth_69的 teardown SIGSEGV 临时 stopgaptest(p2p_version::peers_negotiate_eth_69)精确匹配 retries 2slow-timeout { period 30s, terminate-after 4 }超过 30 秒标记、约 2 分钟终止挂起测试JUnit 报告输出到target/nextest/default/junit.xml供 CI 的store_test_results使用CI 还会 grepflakyFailure来检测上述重试并向 Slack 告警针对general_state_tests、eest_fixtures、e2e_testsuite等慢速套件单独配置了更宽松的超时覆盖。而 rust/.config/zepter.yaml 则定义了propagate-feature检查的 feature 集合std,serde,arbitrary,test-utils,metrics,op,dev,...等与check/default工作流确保 crate 正确向上游传播 feature 而不会误报外部依赖。二、构建系统just 配方与常见构建目标在rust/下运行just --list可查看全部可用目标。核心构建配方如下cd rust # 构建整个工作区 just build # 构建整个工作区排除 example crates默认使用 fast-build 快速编译 profile just build-no-examples # release 模式构建 just build-release # 构建指定二进制 just build-node # kona-noderelease just build-op-reth # op-rethrelease just build-lokahi # lokahi需 -p 显式解析从 rust/justfile 源码看几个关键配方的实现要点just build-no-examples先用cargo metadatajq动态收集所有 manifest 路径包含/examples/的包逐个--exclude默认追加--profile fast-build除非用户显式传了--release/--profile提供build-kona-node-debug、build-op-reth-debug、build-lokahi-debug三个 debug 变体用于加速本地 E2E 迭代cargo build --bin kona-node等别名alias t : test、alias l : lint、alias f : fmt-fix、alias b : build。2.1 性能 Profile 一览rust/Cargo.toml 定义了多个自定义编译 profile理解它们对调试构建性能与产物差异很有帮助Profile特点典型用途devopt-level1、overflow-checksfalse、split-debuginfounpacked、debugline-tables-only日常开发fast-build继承 devopt-level0、debugnone、incrementaltrue、codegen-units256build-no-examples默认 profile编译最快releaseopt-level3、ltothin、stripsymbols、codegen-units16常规发布release-client-lto继承 releaseltofat、codegen-units1、stripnonekona-client 交叉编译cannon load-elf 需要符号段reproducible继承 releasepanicabort、codegen-units1、incrementalfalse可复现构建哈希匹配 CI/发布profiling继承 releasedebugfull、stripnone性能剖析2.2 op-reth 的 superchain-registry 子模块reth-optimism-chainspeccrate 的build.rsrust/op-reth/crates/chainspec/build.rs会把链配置归档res/superchain-configs.targitignored从仓库根目录的superchain-registry子模块物化出来。任何启用了superchain-configsfeature 的 op-reth 构建op-reth二进制、clippy --all-features、chainspec 测试都需要该子模块被检出否则构建失败。初始化方式从仓库根运行just update-superchain-registry-submodule或just sync-superchain它还会顺带同步 Go/Rust 两侧的链配置。build.rs的运行语义与 kona 的KONA_SYNC_SUPERCHAIN保持一致且有一个额外分支一旦res/中已存在归档后续构建直接复用、不再触碰子模块默认模式设置OP_RETH_SYNC_SUPERCHAIN1则强制重新生成归档对应根justfile中的sync-superchain-rust。2.3 生成 Kona PrestatesKona prestates 通过 Docker 构建可复现哈希匹配发布构建cd rust just build-kona-prestates从 rust/justfile 可以看到该配方的完整链路先到cannon/目录构建 cannon 二进制再交叉编译 kona-client ELFMIPS64 目标最后用 cannonload-elf/run生成每个变体的prestate.bin.gz、meta.json、prestate-proof.json及哈希命名副本。相关进阶配方包括just build-kona-prestates-auto自动探测环境优先本机 MIPS64 交叉工具链其次 Docker可用KONA_PRESTATE_BUILDnative|docker强制指定just build-kona-reproducible-prestate/just reproducible-kona-prestate通过 rust/kona/docker/fpvm-prestates/cannon-repro.dockerfile 的可复现 Docker 构建产出与发布一致的哈希just output-kona-prestate-hash输出各变体的 absolute prestate hash原生构建需要 MIPS64 GCC 交叉工具链sudo apt install g-mips64-linux-gnuabi64 libc6-dev-mips64-cross binutils-mips64-linux-gnuabi64跨目标规范文件在 rust/kona/docker/cannon/mips64-unknown-none.json工具链名称可通过CC_mips64_unknown_none、CXX_mips64_unknown_none、CARGO_TARGET_MIPS64_UNKNOWN_NONE_LINKER环境变量覆盖变体清单kona-client:prestate-artifacts-cannon、kona-client-int:prestate-artifacts-cannon-interop定义在 rust/justfile 的KONA_PRESTATE_VARIANTS并通过kona-prestate-variants配方作为唯一权威输出供rust/kona/.gitignore、ops/prestate-reproducibility/build-prestates.sh 等外部消费者读取。三、运行测试cargo-nextest 与三层测试单元测试使用cargo-nextest而非cargo testcd rust # 运行全部测试单元 doc 测试 just test # 仅单元测试排除在线测试 just test-unit # 仅 doc 测试 just test-docs各配方的真实实现rust/justfilejust testtest-unittest-beacon-blob-stacktest-docstest-unitcargo nextest run --workspace --all-features -E !test(test_online)默认排除test_online标记的在线测试另有test-online配方专门运行它们test-docscargo test --doc --workspace --locked --all-featurestest-beacon-blob-stack以fast-buildprofile 在受限栈上验证生产 beacon blob 解析器test_filtered_beacon_blobs_deserializes_on_small_stack用于在无 debug 断言环境下检验小栈行为嵌套的 SP1 guest workspacekona/sp1/programs/Cargo.toml为 SP1 加密补丁隔离而独立有单独的test-sp1-guest配方SP1 guests 需要生成 vkeys 后由 CI 构建 ELF 再测试。3.1 op-reth E2E 测试完整 devnet 双执行客户端op-reth E2E 测试位于 rust/op-reth/tests/proofs/含contracts/、core/、prune/、reorg/、utils/子目录默认以 op-reth 同时作为 sequencer 和 validator 的执行层EL运行完整 devnet。EL 角色可通过环境变量覆盖见 rust/op-reth/tests/proofs/utils/preset.go 的MixedOpProofPresetOP_DEVSTACK_PROOF_SEQUENCER_EL可选op-geth、op-reth默认、op-reth-proof-v1OP_DEVSTACK_PROOF_VALIDATOR_EL可选op-reth-proof-v1默认、op-reth、op-geth。运行前需要两个构建前置条件Forge 合约产物——devnet 从编译好的合约 artifacts 部署合约cd packages/contracts-bedrock mise exec -- just build-no-testsop-reth 二进制——测试 harnessop-devstack/shared/rustbin/rust_binary.go会使用target/release/或target/debug/下最近构建的二进制。两种方式# 方式 A让测试自己构建首次慢之后有缓存 RUST_JIT_BUILD1 go test -v -run TestName ./rust/op-reth/tests/proofs/core/ # 方式 B预先构建 cd rust just build-op-reth在 monorepo 根目录执行测试mise exec -- go test -v -run TestExecutePayloadSuccess -count1 ./rust/op-reth/tests/proofs/core/3.2 nextest 配置细节rust/.config/nextest.toml 的工作区级行为已在 1.3 节详述无默认重试、slow-timeout 分层、JUnit 输出、eth69 精确重试等。注意slow-timeout的terminate-after语义是按周期计数的例如period30s, terminate-after4表示连续 4 个 30 秒周期未完成即终止约 2 分钟。四、Lint 与格式规范cd rust # 运行全部 lint格式检查 clippy doc lints just lint # 单独步骤 just fmt-check # 格式化检查需要 nightly just lint-clippy # 全 features clippy-D warnings just lint-docs # rustdoc 警告Lint 配置分布在三处rust/Cargo.toml[workspace.lints.rust]、[workspace.lints.rustdoc]、[workspace.lints.clippy]用# BEGIN SHARED WORKSPACE LINTS/# END SHARED WORKSPACE LINTS标记块包裹just fmt-fix会将该块同步复制到嵌套的 SP1 guest workspace且有check-sp1-guest-lints配方校验两侧一致rust/clippy.tomlclippy 配置rust/rustfmt.tomlrustfmt 配置。lint-clippy实际执行cargo clippy --workspace --all-features --all-targets -- -D warningslint-docs通过RUSTDOCFLAGS--cfg docsrs -D warnings --show-type-layout --generate-link-to-definition -Zunstable-options cargo nightly doc ...严格检查文档。workspace lint 表在 warn 级别启用了一大批挑剔的 clippy lint如doc_markdown、implicit_clone、redundant_clone、manual_assert、string_lit_as_bytes等同时allow了cognitive_complexity、result_large_err等。4.1 格式化必须使用 Nightly格式化使用固定 pin 的 nightly 工具链版本号定义在 rust/justfile 的NIGHTLY变量中通过grep -oE nightly-[0-9]{4}-[0-9]{2}-[0-9]{2} ../mise.toml从 mise.toml 提取当前为nightly-2026-08-22components 含rustfmt,clippy。stable 工具链版本由 rust/rust-toolchain.toml 固定为1.95该版本必须与ops/docker/op-stack-go/Dockerfile一致。nightly 通过 mise 安装。# 自动格式化也格式化 SP1 guest workspace just fmt-fix # 仅检查 just fmt-check # 安装 pinned nightly just install-nightly注意fmt-check-allfmt-checkfmt-check-sp1-guest同时被 pre-push git hook 与rust-fmtCI job 使用确保两个 workspace 的格式不会漂移。nightly 格式化器有自己的偏好例如会把多行let绑定折叠为一行这是后续「提交前检查」一节反复强调「只在最后编辑后格式化」的根因。4.2 no_std 兼容性检查许多 kona 与 alloy crate 必须能在无标准库环境下编译用于 fault proof VM。修改这些 crate 后必须验证 no_std 构建cd rust just check-no-std该配方rust/justfile先rustup target add riscv32imac-unknown-none-elf然后对固定的 crate 清单逐一执行cargo build -p package --target riscv32imac-unknown-none-elf --no-default-features。清单包括proof crateskona-executor、kona-mpt、kona-preimage、kona-proof、kona-proof-interopprotocol crateskona-genesis、kona-hardforks、kona-registry、kona-protocol、kona-derive、kona-driver、kona-interoputilitieskona-serdealloyalloy-op-evm、alloy-op-hardforksop-alloyop-alloy、op-alloy-consensus、op-alloy-rpc-types、op-alloy-rpc-types-enginealloy-op-hardforks本身即以#![no_std]extern crate alloc编写见 rust/alloy-op-hardforks/src/lib.rs 开头是 no_std 约束的直接体现。五、依赖审计cargo-deny工作区使用cargo-deny进行许可证license、安全通告advisory与依赖禁令ban检查配置在 rust/deny.tomlcd rust just deny实际执行cargo deny --all-features check all。从配置可以看到advisories对一批已知「不再维护但无漏洞/无修复版本」的传递依赖做显式ignore如RUSTSEC-2024-0436paste、RUSTSEC-2025-0141bincode、RUSTSEC-2024-0384instant等每条都附有来源说明例如经 sp1-sdk 的 backoff、经 reth-transaction-pool 的 imblbansmultiple-versions warn并deny了openssl仅允许kona-gossip与native-tls两个 wrapper 使用——这与工作区默认走 rustls 的取向一致alloy-transport-http启用reqwest-rustls-tlsrust/Cargo.tomllicensesconfidence-threshold 0.8allow 列表含 MIT、Apache-2.0、BSD 系列、BSL-1.0、0BSD 等。5.1 特性统一的审计陷阱审计由 Cargo feature 控制的行为时必须对齐生产包的选取集合。Rust 镜像配方 melange/op-stack-rust.yaml 会在一次 Cargo 调用中构建多个二进制--package op-reth --package kona-node --package kona-host --package kona-client --package kona-sp1-proposer --package lokahi见其pipelines/runs配置因此多个 workspace 根上的 feature 会被统一unified单个cargo tree -p binary的结果并不能反映最终镜像的依赖组合。当可选传输层或 TLS 后端会影响结论时请参考 melange/op-stack-rust.yaml 中的包清单进行审计。六、提交前必做检查以下检查从rust/目录执行。CI 强制零警告请修复所有问题后再提交。6.1 第一步格式化只在最终编辑后执行just fmt-fixnightly 格式化器有自己的意见例如把多行let绑定折叠成一行这是 Edit 工具无法复刻的——如果在会话中途运行格式化、之后又继续编辑会留下未格式化代码并导致rust-fmtCI 检查失败。格式化后运行git diff --stat确认工作区改动与即将提交的内容一致。6.2 第二步Lint含格式化、clippy、doc lintsjust lint等价于fmt-checklint-clippylint-docs。6.3 第三步测试变更包just test-unit6.4 第四步no_std如改动 proof/protocol/alloy cratejust check-no-std若修改了任何 proof、protocol 或 alloy crate必须执行。此外还有两个可选的强化检查just check-udepsnightly cargo-udeps 检查未使用依赖与just hack/just hack-tests-defaultcargo hack 逐 feature 检查前者比全 powerset 便宜约 n 次检查 vs 2^n 次。七、CI 环境要点op-reth 需要clang/libclang-dev供 reth-mdbx-sys 的 bindgen 使用。CI 会自动安装这些依赖如果本地出现 bindgen 相关错误先安装 clang 再重试。八、跨实现一致性Cross-implementation Parityrust/op-alloy 持有 op-reth 与 kona 消费的 OP 交易与收据类型Go 侧服务则通过 op-geth 和op-core/*运行相同的格式。任何一侧对线格式wire format或哈希规则的改动都必须与另一侧保持一致由两侧测试套件中共同断言的共享 golden vectorgolden vector钉住。规则定义与当前示例位于 docs/ai/opgeth-decoupling.mdbatcher 控制的解码器覆盖见 docs/ai/derivation.md。九、硬分叉映射单一事实来源OP 硬分叉 → 隐含 L1以太坊硬分叉的映射只定义一次位于 rust/alloy-op-hardforks/src/lib.rs 的OpHardfork::activates_l1_forkpub const fn activates_l1_fork(self) - OptionEthereumHardfork { match self { Self::Bedrock Some(EthereumHardfork::Paris), Self::Canyon Some(EthereumHardfork::Shanghai), Self::Ecotone Some(EthereumHardfork::Cancun), Self::Isthmus Some(EthereumHardfork::Prague), Self::Karst Some(EthereumHardfork::Osaka), _ None, } }当新的 OP 硬分叉搭载某个 L1 分叉例如 Isthmus → Prague、Karst → Osaka时只需在该处增加一个 match 分支。其余所有视图与下游消费者都从它推导implied_l1_fork()累积视图——自身不激活 L1 分叉的 OP 分叉会继承其前驱隐含的 L1 分叉Self::VARIANTS[..self.idx()]反向find_mapactivating_op_fork(l1_fork)逆视图——返回激活给定 L1 分叉的最早 OP 分叉首个implied_l1_fork() l1_fork的变体下游消费者包括 op-revm、op-reth chainspec、kona 等。同一文件还定义了OpHardfork枚举本体Bedrock 到 LagoonJovian 为默认变体、各链的硬分叉时间表常量op_mainnet()、op_sepolia()、base_mainnet()、base_sepolia()以ForkCondition::Block/ForkCondition::Timestamp表达、from_chain_and_timestamp时间戳反查以及OpHardforkstrait 的is_*_active_at_timestamp系列便捷方法含is_no_user_tx_activation_block自 Jovian 起分叉激活区块只能包含存款交易、不能有用户交易。十、升级 reth 依赖完整指南位于 rust/UPDATING-RETH.md。在 bump rust/Cargo.toml 中 reth pin当前指向git https://github.com/op-rs/reth的固定 rev之前务必先阅读它——或者直接运行/update-rethskill.claude/skills/update-reth/SKILL.md它以端到端 Agent 工作流封装了整份指南。审查而非执行一次 bump 时使用 docs/ai/reth-update-review.md 与reth-update-revieweragent——它们会暴露上游reth/revm/alloy中「本应强制我们 in-tree op- 分支产生 diff、却没有任何改动」的变更。指南之外的 Agent 实战建议迭代式升级运行cargo check --workspace --tests修复第一批错误重跑重复。不要试图预先枚举所有 API 变更也不必让用户逐行确认适配迭代到编译通过并在最后汇报 diff 即可本地 reth 检出如果你有paradigmxyz/reth的本地检出用它查上游 trait 签名并运行git log old-rev..new-rev定位改动某个符号的 commit——比手工抓取原始 GitHub URL 更快更可靠。不确定是否有可用检出时先询问用户不要臆断路径新增被忽略的参数对新增但被忽略的 trait 方法参数用_前缀如_block_access_list_hash: OptionB256以避免 unused-variable 警告除非你真的在贯通该值否则不要编造有意义的命名上游删除 trait/reexport如果上游移除了 op-reth 仍在用的 trait 或 re-export先本地 vendor 并注释指向上游移除 PR——不要在确认消费者确实无用之前就重构 op-reth 摆脱它。上游的 stale 标签不代表下游未使用新增传递依赖新 rev 拉入的新传递依赖cargo update中可见的Adding crate行要判断来源是 upstream reth 自身依赖还是我们侧的配置问题用cargo tree -i crate追踪路径。十一、Skills 与辅助工具Fix Rust Formatting.claude/skills/fix-rust-fmt/SKILL.md通过安装 pinned nightly 工具链并运行just fmt-fix修复rust-fmtCI 失败以/fix-rust-fmt调用rust-reviewrust/justfile 中的rust-review配方基于 claude CLI 的代码审查工作流自动从origin/HEAD/{upstream}/origin/develop探测 base对当前分支的 Rust diff 运行rust-code-revieweragent 审查并选择性应用结论其他跨语言工具版本、PR 工作流指南见 docs/ai/dev-workflow.md。十二、最小开发流程速查把以上内容压缩成一次典型的 Rust 改动提交流程# 1. 构建在 rust/ 下 cd rust just build-node # 或 build-op-reth / build-lokahi # 2. 测试 just test-unit # 变更包可加 -p crate 收窄 # 3. Lint just lint # 4. no_std改动 proof/protocol/alloy crate 时 just check-no-std # 5. 最终编辑完成后一次性格式化 just fmt-fix git diff --stat # 确认工作区与提交内容一致若涉及 op-reth 且有 chainspec 相关改动先执行根目录的just update-superchain-registry-submodule保证子模块归档可用涉及依赖变更时用just deny做许可证与安全审计涉及 reth 升级时先读 rust/UPDATING-RETH.md。遵循这一流程即可让本地检查与 CI 保持零警告一致避免在合并队列中被rust-fmt、clippy、nextest 或check-no-std拦截。【免费下载链接】optimismOptimism is Ethereum, scaled.项目地址: https://gitcode.com/GitHub_Trending/op/optimism创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →