Rewrite `core/qbft` to async-Rust-friendly API
还没有人认领这个 Issue。
评估
- 难度
- 5/5
- 预计耗时
- 一周以上
- 新手友好度
- 25/100
- Issue 类型
- 重构
- 描述清晰度
- 描述清楚
- 活跃度
- 冷清
- 技术栈
- rust
调研方向
从 crates/core/src/qbft/mod.rs 及其 internal_test.rs 开始,然后与 Go 参考实现和 strategysim_internal_test.go 进行比较。在更改并发模型之前,先运行现有的 QBFT 测试。完成的标准是:提供异步公共 API,提供等价的异步测试(包括与 strategysim 的对等性),clippy 和格式检查均无问题,并为公共项编写文档。
由索引模型根据 Issue 内容生成。
描述
Context
The current Rust port of core/qbft (crates/core/src/qbft/mod.rs) is a faithful translation of the Go reference but built on synchronous, thread-based primitives:
crossbeam::channelfor transportstd::thread::scopefor spawning per-process workers- A blocking
pub fn run(...)entry point cancellation::CancellationToken(third-party crate, nottokio_util)
This is at odds with the rest of Pluto, which is tokio-async end to end. Every consumer that will eventually wire QBFT in (core/consensus, core/scheduler, the duty pipeline) is async. The current shape forces either (a) bridging via spawn_blocking and ad-hoc channel adapters, or (b) blocking inside async tasks — both bad.
Closes the gap left by #13, which produced the initial sync port.
Goal
Rewrite core/qbft with an async-Rust-native API that integrates cleanly with the rest of the workspace and preserves the Byzantine-safety guarantees of the Go reference.
Scope
API
runbecomespub async fn run(...) -> Result<Decision, QbftError>Transporttrait methods returnimpl Future<Output = Result<...>> + Send(or areasync fnvia trait async)- Cancellation uses
tokio_util::sync::CancellationToken(already used elsewhere in Pluto) - Channels:
tokio::sync::mpsc(andoneshotwhere appropriate) - No
std::thread, nocrossbeam, nostd::sync::mpscanywhere in the public or internal API
Internals
- Replace
thread::scopewithtokio::spawn+JoinSet(orselect!for per-instance loops) - Replace blocking sleeps/timers with
tokio::time::sleep/Interval - Clock abstraction (
fake_clock.rs) becomes async-aware so deterministic tests still work — likely usingtokio::time::pause()+advance()rather than the current fake clock - Keep the algorithm shape (rounds, justifications, message bookkeeping) bit-for-bit identical to the Go reference — only the concurrency primitives change
Safety net (mandatory)
- Port
charon/core/consensus/qbft/strategysim_internal_test.go(~1040 LOC) as the parity gate. This is the test that catches BFT correctness regressions; without it we cannot trust the rewrite. - All current
crates/core/src/qbft/internal_test.rscases pass (or are replaced by equivalent async versions)
Acceptance criteria
- Public API is fully async; no
pub fn runblocking entry point remains - No
crossbeam,std::thread, or third-partycancellationcrate usage incrates/core/src/qbft/ - All existing QBFT unit tests pass (rewritten as async where needed)
- Strategysim parity test ported from Go and green
-
cargo clippy --workspace --all-targets --all-features -- -D warningsclean -
cargo +nightly fmt --all --checkclean - Public API documented;
missing_docswarning re-enabled for the module
References
- Go source: https://github.com/ObolNetwork/charon/blob/main/core/qbft/qbft.go
- Go strategysim test: https://github.com/ObolNetwork/charon/blob/main/core/consensus/qbft/strategysim_internal_test.go
- Current Rust port:
crates/core/src/qbft/mod.rs(1305 LOC) - Predecessor issue: #13 (closed — produced the initial sync port)
Notes
This is on the critical path for the duty-flow pipeline. core/consensus (#157) and downstream modules (core/scheduler #176, etc.) will consume the new async API directly, so this should land before consensus framework integration begins.
- 主要语言
- Rust
- 星标
- 8
- 派生
- 5
- PR 合并指标
- 30 天内没有已合并 PR
环境准备
- 提供 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
NethermindEth/pluto 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 69/100
NethermindEth/pluto#722 ·
-
难度 4/5 3-5 天 新手友好度 52/100
NethermindEth/pluto#719 ·
-
enhancement rust
难度 4/5 3-5 天 新手友好度 45/100
NethermindEth/pluto#640 ·
-
rust
难度 5/5 一周以上 新手友好度 45/100
NethermindEth/pluto#638 · 1 条评论 ·
-
enhancement rust
难度 5/5 一周以上 新手友好度 35/100
NethermindEth/pluto#635 ·
查看 NethermindEth/pluto 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 68/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 68/100
max-sixty/worktrunk#4727 · 7 条评论 · 1 个 reaction ·
维护者通常 1 天内回复
-
follow-up
难度 2/5 1-3 小时 新手友好度 73/100
carrick-sh/carrick#1859 ·
维护者通常 1 天内回复
-
crate: spate-kafka documentation priority: medium
难度 1/5 1 小时以内 新手友好度 88/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 85/100
维护者通常 1 天内回复