1 个不稳定版本
0.2.0 | 2022 年 12 月 3 日 |
---|---|
0.1.0 |
|
#80 在 #签名方案
50KB
913 行
Tendermint
Rust 实现的 Tendermint 状态机。
这只是一个状态机,旨在映射到任何任意系统。它支持任意签名方案、权重和区块定义。它不打算与 Cosmos SDK 一起工作,仅作为 学术协议 的实现。
注意事项
-
目前仅支持 SCALE 序列化。理想情况下,从 SCALE 到 borsh 到 bincode 都应该得到支持。由于 Serai 使用 Substrate,而 Substrate 使用 SCALE,因此选择了 SCALE。因此,在决定支持三个(互不兼容)选项中的哪一个时...
-
tokio 被明确用于运行 Tendermint 机的异步任务。理想情况下,应该使用
futures-rs
,以便使用任何异步运行时。 -
在区块验证失败(或从一开始就没有通过验证)的情况下调用
add_block
是可能的。这与在此接受的论文有悖。这是出于两个原因。- Serai 需要此功能。
- 如果提交了无效的区块,那么现在有一个恶意多数派正在定义共识,或者本地节点由于故障而具有恶意性。考虑到这两种情况都代表了一种致命的情况,除了 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