#状态机 #区块 #tendermint #签名方案 #预期 #系统 #协议

已删除 tendermint-machine

使用 Rust 实现的 Tendermint 状态机

1 个不稳定版本

0.2.0 2022 年 12 月 3 日
0.1.0 2022 年 11 月 3 日

#80#签名方案

MIT 许可证

50KB
913

Tendermint

Rust 实现的 Tendermint 状态机。

这只是一个状态机,旨在映射到任何任意系统。它支持任意签名方案、权重和区块定义。它不打算与 Cosmos SDK 一起工作,仅作为 学术协议 的实现。

注意事项

  • 目前仅支持 SCALE 序列化。理想情况下,从 SCALE 到 borsh 到 bincode 都应该得到支持。由于 Serai 使用 Substrate,而 Substrate 使用 SCALE,因此选择了 SCALE。因此,在决定支持三个(互不兼容)选项中的哪一个时...

  • tokio 被明确用于运行 Tendermint 机的异步任务。理想情况下,应该使用 futures-rs,以便使用任何异步运行时。

  • 在区块验证失败(或从一开始就没有通过验证)的情况下调用 add_block 是可能的。这与在此接受的论文有悖。这是出于两个原因。

    1. Serai 需要此功能。
    2. 如果提交了无效的区块,那么现在有一个恶意多数派正在定义共识,或者本地节点由于故障而具有恶意性。考虑到这两种情况都代表了一种致命的情况,除了 Serai 等具有自己逻辑来处理伪有效区块的系统外,这被视为一种可能的行为,但有前提是任何消费者都必须意识到这一点。任何机器都不会对它认为无效的区块进行投票或预提交。因此,对于拥有诚实多数的网络来说,这不是一个问题。

论文

论文 在第 6 页上使用伪代码描述了算法。这个伪代码不能直接实现,也没有指定故障行为。相反,它只是一系列触发事件以成功实现共识的条件。

包含的伪代码片段可以简要描述如下:

01-09 Init
10-10 StartRound(0)
11-21 StartRound
22-27 Fresh proposal
28-33 Proposal building off a valid round with prevotes
34-35 2f+1 prevote -> schedule timeout prevote
36-43 First proposal with prevotes -> precommit Some
44-46 2f+1 nil prevote -> precommit nil
47-48 2f+1 precommit -> schedule timeout precommit
49-54 First proposal with precommits -> finalize
55-56 f+1 round > local round, jump
57-60 on timeout propose
61-64 on timeout prevote
65-67 on timeout precommit

实现这些任务的对应Rust代码及其相关行号已标记。

依赖项

~4–7MB
~120K SLoC