#node #bft #agreement #input-stream #context #round #safe

rhododendron

异步安全BFT协议,基于futures的实现

11个不稳定版本 (5个破坏性更新)

0.7.0 2019年7月30日
0.6.0 2019年6月25日
0.5.0 2019年1月29日
0.4.0 2018年10月11日
0.2.0 2018年7月6日

#8 in #agreement

每月下载量 21

GPL-3.0许可证

73KB
2K SLoC

Rhododendron

Rust中的基于futures的BFT。大部分功能实现,但尚未准备好用于生产。

大部分工作是通过agree函数完成的

pub fn agree<C: Context, I, O>(context: C, nodes: usize, max_faulty: usize, input: I, output: O)
	-> Agreement<C, I, O>
{
    // ...
}

调用agree有三个部分

  • 一个Context,封装要协商的值类型,以及值的生成、评估和签名。
  • 来自其他节点的消息输入流。
  • 将到达所有其他诚实节点的消息输出汇。

这将产生一个可以在事件循环上运行的Agreement,直到完成。


lib.rs:

基于不同轮次旋转提议者的BFT协议,基于泛型的futures实现。

尝试在候选者上达成BFT协议。尚未准备好用于生产。

协议在n个节点之间进行,其中最多max_faulty个是错误的。max_faulty应小于nodes的1/3,否则可能无法达成协议。

通过调用带有泛型Context、输入流和输出汇的agree来启动协议。输入应该永远在逻辑上不会得出结论,并包含来自所有其他节点的消息,而输出汇

注意,即使在没有看到候选者的情况下,也可能见证达成协议。任何看到的候选者都将进行检查以确保其有效性。

尽管从技术上讲,协议将始终完成(假设最终交付了消息),但在实践中,这个未来可能在没有见证结论的情况下就结束了。

使用Agreement未来的用户应安排它被外部导入的已达成值所抢占。

依赖关系

~2.6–4MB
~81K SLoC