#bft #共识 #分布式系统 #状态机 #数据库接口

bft-core

一个高效的、稳定的用于分布式系统的BFT核心Rust库

1个不稳定版本

0.1.0 2019年5月5日

#2196算法

MIT 许可证

65KB
1.5K SLoC

BFT

一个用于分布式系统的BFT协议高效且稳定的Rust库。

什么是BFT?

BFT(拜占庭容错)是一类共识算法,它通过拜占庭容错来实现。BFT可以保证在一个没有超过33%恶意拜占庭节点的分布式系统中实现活性和安全性,因此BFT通常用于区块链网络。

BFT协议

协议

BFT是一种状态机复制算法,以下是一些状态示例

  1. 三层状态协议
    NewHeight -> (Propose -> Prevote -> Precommit)+ -> Commit -> NewHeight -> ...
  1. 在某个高度下的三层状态协议
                            +-------------------------------------+
                            |                                     | (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模型由四个基本部分组成

  1. 共识模块,共识算法模块包括签名验证、证明生成、版本检查等;

  2. 状态机,BFT状态机专注于共识提案;

  3. 传输模块,共识模块与其他模块之间的网络;

  4. Wal模块,存储BFT日志的地方。

注意:bft-core只提供一个基本的BFT状态机,不支持签名验证、证明生成、紧凑块等高级功能。这些功能在共识模块中,而不是在bft-core库中。

特性

bft-core提供了async_verify特性,用于在接收到提案后验证交易。BFT状态机将在Precommit步骤之前检查提案的验证结果。如果在共识期间尚未收到提案的结果,它将额外等待共识持续时间的1/2。

接口

如果bft-core运行正确,它需要接收4种类型的消息:ProposalVoteFeedStatus。bft-core也可以发送4种类型的消息:ProposalVoteCommitGetProposalRequest。此外,bft-core还提供了StopStart消息,可以控制状态机的停止或继续。这些类型的消息包括在枚举CoreInputCoreOutput中。

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