3个不稳定版本

0.1.1 2019年4月2日
0.1.0 2019年1月8日
0.0.0 2018年8月5日

#2854 in 魔法豆

每月32次下载

MIT/Apache

630KB
5.5K SLoC

蜜獾拜占庭容错(BFT)共识算法

crates.io Documentation Build Status Gitter

欢迎来到蜜獾拜占庭容错(BFT)共识算法的 Rust 库。该算法的研究和协议在Miller等人2016年的论文《拜占庭协议中的蜜獾》中有详细说明。

Jean-Philippe Aumasson 完成了对 hbbft官方安全审计

以下是对HoneyBadger BFT的概述以及基本入门指南

注意: 此库仍在开发中,算法的部分功能仍在开发中。

什么是蜜獾?

蜜獾共识算法允许分布式环境中(可能异步)的节点就交易达成一致。达成一致的过程不需要领导者节点,可以容忍被损坏的节点,并在不利的网络条件下取得进展。示例用例包括去中心化数据库和区块链。

蜜獾是 拜占庭容错 的。只要节点总数N大于3 * f(包括被攻击者完全控制),该协议就可以在失败节点数f(包括攻击者的完全控制)的情况下达成共识。

蜜獾协议是异步的。它不对消息传递的时序做假设。攻击者可以控制网络调度并延迟消息,而不影响共识。

它是如何工作的?

蜜獾是一个由多个独立算法组成的模块化库。为了达成共识,蜜獾协议按照时代进行。在每个时代,参与节点会相互广播一组加密的数据交易,并就这些交易的内容达成一致。

在最佳网络环境中,输出包括每个节点发送的数据。在不利环境中,输出是达成一致的数据子集。无论哪种情况,最终输出的结果都包含了一组交易,这些交易在所有节点上都是一致的。

除了验证者外,算法还支持观察者:它们不积极参与,也不需要被信任,但它们会接收输出,并且可以在假设超过三分之二验证者是正确的前提下进行验证。

请参阅以下帖子以获取更多详细信息

算法

  • 蜜獾:每个节点输入交易。协议输出一系列交易批次。

  • 动态蜜獾:修改后的蜜獾,节点可以动态地将其他节点添加到或从网络中移除。

  • 排队蜜獾:与动态蜜獾工作方式相同,但包含内置的交易队列。

  • 子集:每个节点输入数据。节点就建议数据的一个子集达成一致。

  • 广播:提议节点输入数据,每个节点都会收到这个输出。

  • 二进制协议:每个节点输入一个二元值。节点就至少一个正确节点输入的值达成一致。

  • 阈值签名:每个节点输入相同的数据进行签名,并输出与公开主密钥匹配的唯一有效签名。它在二进制协议中用作伪随机值。

  • 阈值解密:每个节点输入相同的数据密文,加密到公开主密钥,并输出解密后的数据。

  • 同步密钥生成:一个无需经销商的算法,用于生成阈值加密和签名的密钥。与其它算法不同,这个算法是完全同步的,应在蜜獾(或另一个共识算法)之上运行。

为此库开发的外部crate

  • 阈值加密:用于协作消息解密和签名创建的阈值加密系统。

入门

此库需要分布式网络环境才能运行。网络要求的详细信息待定。

注意:目前正在开发额外的示例。

构建

需要Rust 1.30或更高版本和cargo:[安装说明](https://rust-lang.net.cn/en-US/install.html)。库已针对稳定发布渠道进行测试。

$ cargo build [--release]

测试

$ cargo test --release

请参阅测试README以获取更多关于我们测试工具包的信息。

示例网络模拟

包含一个基本示例以运行网络模拟。

$ cargo run --example simulation --release

Screenshot

标题 定义
纪元 纪元编号。在每一个纪元中,由模拟节点(默认为10个节点)在网络中批量处理交易。批处理始终一次性输出,所有交易同时输出。
最小时间 模拟毫秒内直到第一个正确(即非故障)节点输出批处理的时间。
最大时间 模拟毫秒内直到最后一个正确节点输出批处理的时间。
Txs 每个纪元中处理的交易数量。
Msgs/Node 每个节点平均处理的消息数量。计数器是累积的,包括当前纪元和所有先前纪元中处理的消息数量。
Size/Node 每个节点平均处理的消息大小(转换为字节)。这是累积的,包括当前纪元和所有先前纪元中的消息大小。

选项

设置不同的参数以模拟不同的交易和网络条件。

标志 描述
-h, --帮助 显示帮助选项
--version 显示hbbft的版本
-n<n>, --节点<n> 节点的总数[默认:10]
-f<f>, --故障节点<f> 故障节点的数量[默认:0]
-t<txs>, --txs<txs> 要处理的交易数量[默认:1000]
-b<b>, --批处理<b> 批处理大小,即每个纪元的交易数量[默认:100]
-l<延迟>, --延迟<延迟> 发送和接收之间的网络延迟[默认:100]
--bw<bw> 带宽,以kbit/s为单位[默认:2000]
--cpu<cpu> 机器的CPU速度,以百分比表示[默认:100]
--tx-size<大小> 交易的大小,以字节为单位[默认:10]

示例

# view options
$ cargo run --example simulation --release -- -h

# simulate a network with 12 nodes, 2 of which are faulty
$ cargo run --example simulation --release -- -n 12 -f 2

# increase batch size to 500 transactions per epoch
$ cargo run --example simulation --release -- -b 500

协议修改

我们的实现以几种方式修改了"BFT协议的Honey Badger"中描述的协议

  • 我们使用配对椭圆曲线库来使用Barrento-Lynn-Scott (BLS12-381)曲线实现基于配对的密码学。
  • 我们向二进制协议算法添加了一个Terminate消息。终止发生在输出后,防止算法无限期运行(或保留在内存中)。(#53)
  • 我们向二进制协议算法添加了一个Conf消息。额外的消息阶段可以防止攻击者控制网络调度器和节点时的攻击。(#37)
  • 我们从子集和Honey Badger算法返回额外的信息,指定了哪个节点输入了哪些数据。这允许识别可能恶意节点。
  • 我们包含了一个分布式密钥生成(DKG)协议,它不需要可信的经销商;节点集体生成一个密钥。这解决了单点故障问题。请参阅分布式密钥生成在野外

算法命名约定

我们将原始论文中的算法命名约定简化了。

算法名称 原始名称
Honey Badger HoneyBadgerBFT
Subset 异步公共子集(ACS)
Broadcast 可靠广播(RBC)
Binary Agreement 异步二进制拜占庭协议(ABA)

参考文献

黄獾可视化

Screenshot

贡献

有关贡献、测试和拉取请求协议,请参阅CONTRIBUTING文档。

许可证

许可协议为以下之一:

任选其一。

依赖项

~9MB
~167K SLoC