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

no-std bitcoint4

用于使用和与比特币交互的通用库

3 个版本

0.30.3 2024年6月4日
0.30.2 2024年5月28日
0.30.1 2024年5月27日

#2141 in 魔法豆

Download history 306/week @ 2024-05-23 199/week @ 2024-05-30 41/week @ 2024-06-06 3/week @ 2024-06-13

139 次每月下载
4 个包(2个直接) 中使用

CC0 许可证

1.5MB
30K 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反序列化和除了Input Finalizer角色的所有功能。使用 rust-miniscript 完成。

与比特币核心进行JSONRPC交互时,建议使用 rust-bitcoincore-rpc

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

已知限制

共识

此库 不得 用于共识代码(即完全验证区块链数据)。技术上支持这样做,但这样做是非常不推荐的,因为此库与比特币核心参考实现之间有许多已知和未知的不同之处。在基于共识的加密货币(如比特币)中,所有各方使用相同的规则来验证数据至关重要,而此库无法实现与核心相同的规则。

鉴于C++和Rust的复杂性,这不太可能得到修复,目前也没有修复的计划。当然,欢迎提交修复特定共识不兼容性的补丁。

支持16位指针大小

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

文档

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

贡献

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

更多信息请参阅./CONTRIBUTING.md

最低支持的Rust版本(MSRV)

此库应始终能在带有任何功能组合(除no-std外)的Rust 1.41.1或带有no-stdRust 1.47上编译。

要使用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

拉取请求(Pull Requests)

每个PR至少需要两个审阅才能合并。在审阅阶段,维护者和贡献者可能会留下评论并要求更改。请尽量处理这些评论,否则您的PR可能在较长时间的不活跃后关闭而不合并。如果您的PR尚未准备好审阅,请通过在标题前添加WIP: 来标记它。

CI流水线

CI流水线在运行到每个MR之前需要获得批准。

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

Githooks

为了帮助开发者在运行CI之前捕获错误,我们提供了一些githooks。如果您尚未在本地配置githooks,您可以在仓库根目录中运行以下命令来使用此仓库中提供的githooks:

git config --local core.hooksPath githooks/

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

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

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

通常情况下,那些提高跨链兼容性的事情(例如,支持跨链原子交换)比那些只支持单个区块链的事情更有可能被接受。

发布说明

请参阅 CHANGELOG.md

许可协议

本项目的代码采用Creative Commons CC0 1.0 Universal license许可。我们使用SPDX许可列表SPDX IDs

依赖项

~5–7.5MB
~85K SLoC