#bitcoin #transaction #script #key #deserialize #input #block

no-std bitnet

通用库,用于使用和与比特币互操作

6 个版本

0.31.9 2023 年 12 月 15 日
0.31.5 2023 年 12 月 15 日
0.30.9 2023 年 12 月 15 日

#2288神奇豆

CC0 许可证

1.5MB
25K SLoC

Rust Bitcoin

Rust Bitcoin logo by Hunter Trujillo, see license and source files under /logo

支持反序列化、解析和执行与比特币相关的数据结构和网络消息的库。

Crate Info CC0 1.0 Universal Licensed CI Status API Docs Rustc Version 1.41.1+ Chat on IRC Lines of code

文档

支持(或应支持)

  • 比特币协议网络消息的反序列化
  • 区块和交易的反序列化
  • 脚本反序列化
  • 私钥和地址创建、反序列化和验证(包括完整的 BIP32 支持)
  • PSBT v0 反序列化和除了输入最终化器角色之外的所有功能。使用 rust-miniscript 进行最终化。

对于与 Bitcoin Core 的 JSONRPC 交互,建议使用 rust-bitcoincore-rpc

建议始终使用 cargo-crev 来验证每个依赖项的可靠性,包括此依赖项。

已知限制

共识

此库 不能 用于共识代码(即完全验证区块链数据)。技术上支持这样做,但这样做非常不可取,因为此库与 Bitcoin Core 参考实现之间存在许多已知和未知的不同之处。在像比特币这样的基于共识的加密货币中,所有各方都必须使用相同的规则来验证数据,而这个库无法实现与 Core 相同的规则。

鉴于 C++ 和 Rust 的复杂性,这种情况可能永远无法解决,也没有计划这样做。当然,欢迎提交修复特定共识不兼容性的补丁。

16 位指针大小的支持

不支持 16 位指针大小,我们也不能保证它们将被支持。如果您关心它们,请告诉我们,这样我们就可以了解对此的兴趣有多大,并可能决定支持它们。

文档

目前可以在 docs.rs/bitcoin 上找到。欢迎贡献补丁以添加使用示例和扩展现有文档。

贡献

贡献通常受到欢迎。如果您打算进行较大更改,请在提交PR之前在问题中进行讨论,以避免重复工作和架构不匹配。如果您有任何问题或想要讨论的想法,请加入我们的 #bitcoin-rust 频道,在 libera.chat

有关更多信息,请参阅 ./CONTRIBUTING.md

最低支持的Rust版本(MSRV)

此库应始终在 Rust 1.41.1Rust 1.47(使用 no-std)上编译,支持任何功能组合(除 no-std)。

要使用MSRV构建,您需要固定一些依赖项(也包括 no-std

cargo update -p serde --precise 1.0.156
cargo update -p syn --precise 1.0.107

安装Rust

可以使用您选择的软件包管理器或 rustup.rs 安装Rust。前者被认为更安全,因为它通常不涉及对CA系统的信任。但您应该意识到,您分发中提供的Rust版本可能已过时。通常这对 rust-bitcoin 来说不是问题,因为我们支持比当前稳定版更旧的版本(见MSRV部分)。

构建

默认启用了 cargo 功能 std。必须启用至少一个功能:stdno-std 或两者。

启用 no-std 功能不会禁用 std。要禁用 std 功能,您必须禁用默认功能。 no-std 功能仅启用此crate在不需要 std 的情况下可用的附加功能。两者可以同时启用而不冲突。

可以使用 cargo 构建和测试此库

git clone [email protected]:rust-bitcoin/rust-bitcoin.git
cd rust-bitcoin
cargo build

您可以使用以下命令运行测试

cargo test

有关更详细的说明,请参阅 cargo 文档

构建文档

我们使用nightly工具链构建文档,您可能希望使用以下shell别名来检查您的文档更改是否正确构建。

alias build-docs='RUSTDOCFLAGS="--cfg docsrs" cargo +nightly rustdoc --features="$FEATURES" -- -D rustdoc::broken-intra-doc-links'

测试

为感兴趣的人提供了单元和集成测试,以及基准测试。对于项目开发人员,特别是寻找可以工作的内容的新贡献者,我们进行了以下操作

  • 使用 Hongfuzz 进行模糊测试
  • 使用 Mutagen 进行突变测试
  • 使用 Kani 进行代码验证

总是有更多的测试要编写和更多的错误要找到,我们非常欢迎对我们的测试工作做出贡献。请考虑将测试代码视为一等公民,我们确实接受改进和清理测试代码的PR。

单元/集成测试

像任何其他Rust项目一样运行: cargo test --all-features

基准测试

我们使用自定义Rust编译器配置条件来保护基准测试代码。要运行基准测试,请使用以下命令: RUSTFLAGS='--cfg=bench' cargo +nightly bench

突变测试

我们已经开始使用mutagen进行突变测试。要运行这些测试,首先使用以下命令安装最新的开发版本:cargo +nightly install --git https://github.com/llogiq/mutagen然后使用以下命令运行:RUSTFLAGS='--cfg=mutate' cargo +nightly mutagen

代码验证

我们已经开始使用kani,使用以下命令安装:cargo install --locked kani-verifier(无需运行cargo kani setup)。使用以下命令运行测试:cargo kani

拉取请求

每个拉取请求至少需要两个审查才能合并。在审查阶段,维护者和贡献者可能会留下评论并要求修改。请尽量处理它们,否则您的PR可能在没有合并的情况下长时间处于不活跃状态。如果您的PR尚未准备好审查,请在标题前加上WIP: 以标记。

持续集成管道

每个MR在运行之前都需要获得批准。

为了加快审查过程,可以使用act在本地运行CI管道。由于当前不支持缓存,使用act时将跳过fuzzCross任务。我们不会主动支持act,但会合并修复act问题的PR。

Git钩子

为了帮助开发者捕捉在运行CI之前出现的错误,我们提供了一些git钩子。如果您还没有在本地配置git钩子,您可以通过在存储库的根目录下运行以下命令来使用此存储库中的钩子:

git config --local core.hooksPath githooks/

或者,在您的.git/hooks目录中添加指向我们提供的任何git钩子的符号链接。

关于替代币/替代链的政策

欢迎提交补丁,通过向现有枚举添加常量来添加对非比特币加密货币的支持(例如,设置网络消息魔数序列)。任何更复杂的内容将根据具体情况考虑,因为替代币领域包括经常出现和消失的项目,并且设计得相当糟糕,保持代码库的可维护性是一个很大的优先事项。

一般来说,那些提高跨链兼容性的东西(例如,支持跨链原子交换)比那些只支持单一区块链的东西更有可能被接受。

发布说明

请参阅CHANGELOG.md

许可协议

本项目的代码在Creative Commons CC0 1.0 Universal license下许可。我们使用SPDX license listSPDX IDs

依赖关系

~5–8MB
~88K SLoC