#共识 #bft #区块链 #分布式系统 #异步 #交易

fedimint-aleph-bft

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

3 个版本 (破坏性更新)

0.36.0 2024 年 5 月 31 日
0.33.0 2024 年 1 月 24 日
0.30.0 2024 年 1 月 25 日

#1078 in 魔法豆

Download history 495/week @ 2024-04-16 186/week @ 2024-04-23 11/week @ 2024-04-30 42/week @ 2024-05-07 35/week @ 2024-05-14 277/week @ 2024-05-21 430/week @ 2024-05-28 290/week @ 2024-06-04 349/week @ 2024-06-11 526/week @ 2024-06-18 334/week @ 2024-06-25 349/week @ 2024-07-02 590/week @ 2024-07-09 717/week @ 2024-07-16 601/week @ 2024-07-23 251/week @ 2024-07-30

2,236 次每月下载
10 个仓库中使用(通过 fedimint-server

Apache-2.0

470KB
11K SLoC

Crate Docs Build Status Apache 2.0 Licensed cargo-audit

概述

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

此仓库包含 AlephBFT 的 Rust 实现,提供方便的 API,使应用程序可以无缝应用于各种问题。仓库的主要应用是 Aleph Zero 区块链 的共识引擎(有时称为“最终性设备”)。

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

文档

每个包都在 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 crate。此外,它还有一些常用的依赖项,如 logrand,以及一个较大的编码依赖项,即 parity-scale-codec。在未来的工作中,我们计划消除这个依赖项。

工具链

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

测试

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

模糊测试

我们提供了模糊测试,尝试通过为网络层创建任意数据并将其输入到 member 实现中来使整个应用程序崩溃。要运行这些测试,您需要安装 aflcargo-fuzzcargo-fuzz 需要您使用 nightly 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://Cardinal-Cryptography.github.io/AlephBFT/index.html)

未来工作

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

许可证

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

资金

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

依赖项

~5–11MB
~113K SLoC