3个不稳定版本
0.1.1 | 2019年4月2日 |
---|---|
0.1.0 | 2019年1月8日 |
0.0.0 | 2018年8月5日 |
#2854 in 魔法豆
每月32次下载
630KB
5.5K SLoC
蜜獾拜占庭容错(BFT)共识算法
欢迎来到蜜獾拜占庭容错(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
标题 | 定义 |
---|---|
纪元 | 纪元编号。在每一个纪元中,由模拟节点(默认为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) |
参考文献
-
其他语言实现
黄獾可视化
贡献
有关贡献、测试和拉取请求协议,请参阅CONTRIBUTING文档。
许可证
许可协议为以下之一:
- Apache License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
依赖项
~9MB
~167K SLoC