#共识 #bft #区块链 #分布式系统 #异步 #日志消息

aleph-bft

阿莱夫BFT是一个异步和拜占庭容错共识协议,旨在对任意消息(交易)进行排序。它被设计成即使在最恶劣的条件下也能持续运行:在消息交付延迟没有限制的情况下,以及在存在恶意行为者的环境中。这使得它非常适合区块链相关应用。

42个版本 (18个破坏性)

0.36.5 2024年4月17日
0.35.0 2024年3月12日
0.34.1 2024年3月11日
0.33.0 2023年11月2日
0.5.2 2021年7月30日

1190神奇豆

Download history 549/week @ 2024-04-25 260/week @ 2024-05-02 954/week @ 2024-05-09 1345/week @ 2024-05-16 811/week @ 2024-05-23 683/week @ 2024-05-30 598/week @ 2024-06-06 791/week @ 2024-06-13 291/week @ 2024-06-20 290/week @ 2024-06-27 363/week @ 2024-07-04 524/week @ 2024-07-11 328/week @ 2024-07-18 290/week @ 2024-07-25 293/week @ 2024-08-01 214/week @ 2024-08-08

每月1,202次下载

Apache-2.0

480KB
11K SLoC

Crate Docs Build Status Apache 2.0 Licensed cargo-audit

概述

阿莱夫BFT是一个异步和拜占庭容错共识协议,旨在对任意消息(交易)进行排序。它被设计成在消息交付延迟没有限制且存在恶意行为的情况下持续运行,这使得它非常适合区块链相关应用。更多信息请查看白皮书

此仓库包含了一个Rust实现的阿莱夫BFT,提供了一个方便的API,使其能够无缝应用于各种问题。此仓库的主要应用是阿莱夫零区块链的共识引擎(有时称为“最终性小工具”)。

代码分为几个Rust包,每个包都有自己的目录 - 请参阅Cargo.toml文件,该文件定义了整个工作空间的布局。主要包aleph-bft位于consensus目录中。此外,每个其他包都有一个简短的README文件,描述其在阿莱夫BFT工具集中的作用。

文档

每个包都在docs.rs上进行了文档说明。完整的文档可以作为mdBook获取。

本地构建书籍(假设您已安装rustup

cargo install mdbook
cd docs
mdbook serve --open

实现状态

亮点

  • 该协议是异步的,因此它由共识事件驱动,而不是由某些时钟滴答驱动。
  • 在部分同步环境中,性能仍然是最优的。
  • BFT - 如果恶意节点少于委员会的三分之一,则安全。
  • 防止分叉炸弹。
  • 降低了发送DAG父节点信息的网络开销。
  • 彻底测试,包括恶意场景,以及高代码覆盖率。

更多详细信息请参阅本书

使用crate

  • 在您的crate中导入AlephBFT
    [dependencies]
    aleph-bft = "^0.36"
    
  • 主要入口点是run_session函数,该函数返回一个运行共识算法的Future。要调用此函数,您需要传递一个配置(默认值在包中可用),并实现某些特质,这将提供所有必要的功能,例如网络和消息签名。有关完整指南,请参阅文档

示例

我们提供了两个运行AlephBFT的基本示例,这两个示例都不是密码学安全的,并假设参与者诚实,但可能存在故障。

第一个示例是ordering,它实现了一个简单的节点,该节点生成数据项,然后等待它们被最终确定。它还可以在创建指定数量的项目后进行模拟崩溃。

例如,您可能运行以下命令

cd ./examples/ordering
./run.sh

这将启动2个正常工作的节点和2个每个节点崩溃3次的节点。崩溃后重新启动节点的延迟将设置为1秒。一个有故障的节点将在每次崩溃之前创建25个项目,并在最后再创建25个。因此,每个节点总共将创建100个项目,然后等待其他节点,然后完成其运行。

./run.sh -h

更多详细信息。

请注意,如果正常工作的节点数量小于或等于故障节点数量的两倍,它们将无法自行推进协议。

脚本将尝试在预定义的IP地址启动节点,127.0.0.1:100XX,其中XX表示节点ID。如果端口不可用,节点将记录错误并继续尝试获取它,在连续尝试之间等待10秒。

运行此脚本将生成相应的日志文件node0.log, node1.log, ...,对应于后续节点。将创建一个名为aleph-bft-examples-ordering-backup的目录来存储崩溃恢复机制所需的数据,后续运行的日志将附加到现有日志文件中。当再次启动脚本时,缓存和日志将自动清除。

第二个示例blockchain旨在在区块链环境中对AlephBFT进行基准测试。它实现了一个简单的假设诚实参与的循环链。最简单的方法是使用提供的脚本,如下所示(假设我们在根目录中启动)

cd ./examples/blockchain
./run.sh 5

其中,再次强调,5表示将要启动的节点数量。在这里,我们只假设地址 127.0.0.1:43000 可用,因为网络实现包含一个简单的节点发现机制。每秒完成的交易数量将在这些文件中的最后一条日志消息中体现。

有关更多详细信息,请参阅

cargo run -- --help

依赖关系

该存储库主要包含自用代码。它使用 Rust 的异步功能实现,并且只依赖于标准库中的 futures 包。此外,它还有一些常见的依赖项,如 logrand,以及一个用于编码的大依赖项,即 parity-scale-codec。在未来工作中,我们计划消除这个依赖项。

工具链

此版本是在 nightly-2022-10-30 Rust 工具链下构建和测试的。如果您想使用其他版本,请编辑 rust-toolchain 文件,或者使用具有更高优先级的 覆盖

测试

存在许多单元测试和几个集成测试,可以通过标准命令 cargo test --libcargo test --lib --skip medium 来运行,如果您只想运行小型测试。或者,您可以运行 run_local_pipeline.sh 脚本。

Fuzzing

我们提供了模糊测试,通过为网络层创建任意数据并将其馈送到 member 实现中来尝试使整个应用程序崩溃。要运行这些测试,您需要安装 aflcargo-fuzzcargo-fuzz 要求您使用夜间 Rust 工具链。与 cargo-fuzz 不同,afl 需要所谓的语料库数据来操作,即一些不使应用程序崩溃的非空数据集。这两个工具都使用 LLVM 的仪器功能来根据代码覆盖率统计数据引导模糊测试过程。

cargo install cargo-fuzz
cargo install afl

cargo-fuzz/libfuzzer

cargo fuzz run --features="libfuzz" fuzz_target

afl

首先需要生成一些 seed 数据才能运行。

# create some random input containing network data from a locally executed test
mkdir afl_in
cargo build --bin gen_fuzz
./target/debug/gen_fuzz >./afl_in/seed

您可能需要重新配置操作系统才能继续 - 在这种情况下,请遵循终端中 afl 工具打印的说明。

cargo afl build --features="afl-fuzz" --bin fuzz_target_afl
cargo afl fuzz -i afl_in -o afl_out target/debug/fuzz_target_afl

gen_fuzz 二进制文件还可以验证 afl 工具的数据。

cargo build --bin gen_fuzz
./target/debug/gen_fuzz | ./target/debug/gen_fuzz --check-fuzz

代码覆盖率

您可以使用 gen_cov_data.sh 脚本来生成代码覆盖率摘要,然后使用 cov_report.sh 为每个文件生成详细报告。请确保首先使用 install_cov_tools.sh 安装所有所需的工具。

资源

  • 论文:[当前版本](https://arxiv.org/abs/1908.05156),[旧版本](https://arxiv.org/abs/1810.05256)
  • 文档:[crate 文档](https://docs.rs/aleph-bft),[参考](https://Cardinal-Cryptography.github.io/AlephBFT/index.html)

未来工作

  • 异步活性是一个重要的理论属性,为了实现它,AlephBFT的设计中包含了许多技术复杂性。然而,在实践方面,几乎没有证据表明在现实场景中对活性进行此类攻击是可能的。尽管如此,无论此类攻击的可能性有多小,我们都会非常重视它们,并计划在未来某个版本中为AlephBFT添加随机性。我们首先选择了一个没有随机性的版本,因为它提供了一个非常简单、同时安全且健壮的BFT共识协议。随机性会引入协议的一些复杂性,因此将其添加到经过充分测试的产品上是有意义的。协议的API将不会改变,我们将使随机性的使用可配置。
  • 我们认为将像共识协议这样的关键代码尽可能保持独立是很重要的,因此我们希望摆脱唯一的重大依赖项 - parity-scale-codec

许可证

AlephBFT是在Apache License 2.0的条款下许可的。

资金

本存储库中的实现由Aleph Zero Foundation资助。

依赖关系

~5–10MB
~114K SLoC