1个不稳定版本
0.1.0 | 2019年5月5日 |
---|
#2196 在 算法
65KB
1.5K SLoC
BFT
一个用于分布式系统的BFT协议高效且稳定的Rust库。
什么是BFT?
BFT(拜占庭容错)是一类共识算法,它通过拜占庭容错来实现。BFT可以保证在一个没有超过33%恶意拜占庭节点的分布式系统中实现活性和安全性,因此BFT通常用于区块链网络。
BFT协议
协议
BFT是一种状态机复制算法,以下是一些状态示例
- 三层状态协议
NewHeight -> (Propose -> Prevote -> Precommit)+ -> Commit -> NewHeight -> ...
- 在某个高度下的三层状态协议
+-------------------------------------+
| | (Wait new block)
v |
+-----------+ +-----+-----+
+----------> | Propose +--------------+ | NewHeight |
| +-----------+ | +-----------+
| | ^
| (Else) | |
| v |
+-----+-----+ +-----------+ |
| Precommit | <------------------------+ Prevote | | (Wait RichStatus)
+-----+-----+ +-----------+ |
| |
| (When +2/3 Precommits for the block found) |
v |
+--------------------------------------------------------------+-----+
| Commit |
| |
| * Generate Proof; |
| * Set CommitTime = now; |
+--------------------------------------------------------------------+
架构
一个完整的BFT模型由四个基本部分组成
-
共识模块,共识算法模块包括签名验证、证明生成、版本检查等;
-
状态机,BFT状态机专注于共识提案;
-
传输模块,共识模块与其他模块之间的网络;
-
Wal模块,存储BFT日志的地方。
注意:bft-core只提供一个基本的BFT状态机,不支持签名验证、证明生成、紧凑块等高级功能。这些功能在共识模块中,而不是在bft-core库中。
特性
bft-core提供了async_verify
特性,用于在接收到提案后验证交易。BFT状态机将在Precommit
步骤之前检查提案的验证结果。如果在共识期间尚未收到提案的结果,它将额外等待共识持续时间的1/2。
接口
如果bft-core运行正确,它需要接收4种类型的消息:Proposal
、Vote
、Feed
、Status
。bft-core也可以发送4种类型的消息:Proposal
、Vote
、Commit
和GetProposalRequest
。此外,bft-core还提供了Stop
和Start
消息,可以控制状态机的停止或继续。这些类型的消息包括在枚举CoreInput
和CoreOutput
中。
enum CoreInput {
Proposal(Proposal),
Vote(Vote),
Feed(Feed),
Status(Status),
Commit(Commit),
#[cfg(feature = "async_verify")]
VerifyResp(VerifyResp),
Pause,
Start,
}
enum CoreOutput {
Proposal(Proposal),
Vote(Vote),
Commit(Commit),
GetProposalRequest(u64),
}
有关详细信息,请点击这里。
用法
首先,将bft-core添加到您的Cargo.toml
[dependencies]
bft-core = { git = "https://github.com/KaoImin/bft-core.git", branch = "develop" }
如果您想使用async_verify
特性,需要添加以下代码
[features]
async_verify = ["bft-core/async_verify"]
第二,按照以下步骤将BFT和通道添加到您的crate中
extern crate bft_core as bft;
use bft::{types::*, Core, FromCore};
第三,初始化一个BFT核心
let bft = BFT::new(address);
这里的address
是这个节点地址,类型为Vec<u8>
。
需要说明的是,BFT机器默认处于停止步骤,因此,首先需要发送CoreInput::Start
消息。使用send_bft_msg()
函数将消息发送到BFT状态机,如下所示
bft.send_bft_msg(CoreInput::Start).map_err();
bft.send_bft_msg(CoreInput::Status(status)).map_err();
// only in feature async_verify
bft.send_bft_msg(CoreInput::VerifyResq(result)).map_err();
并实现FromCore
特质以接收来自BFT核心的消息。
如果您想使用BFT高度进行一些验证,请使用以下get_height
函数
let height: u64 = bft.get_height();
许可证
这是一个开源项目,遵循MIT许可证。
依赖关系
~1–1.5MB
~32K SLoC