21 个版本 (10 个重大变更)
0.106.0+26.0 | 2024年3月1日 |
---|---|
0.104.0+24.2 | 2024年2月5日 |
0.100.0+0.20.2 | 2023年12月14日 |
0.20.2-0.5.0 | 2022年7月22日 |
0.16.1 | 2018年3月10日 |
#992 in 神奇豆子
每月下载量 24,263
用于 42 个crate (21 直接)
7.5MB
96K SLoC
包含 (晦涩的 autoconf 代码, 80KB) depend/bitcoin/configure.ac, (晦涩的 autoconf 代码, 20KB) configure.ac, (晦涩的 autoconf 代码, 6KB) configure.ac
比特币的 libbitcoinconsensus
与 Rust 绑定
此项目使用 cargo 从比特币的 C++ 源代码构建 libbitcoinconsensus
库,并提供其 API 的 Rust 绑定。
libbitcoinconsensus
允许使用比特币独特的脚本引擎进行交易验证。比特币应用程序应使用 libbitcoinconsensus
库,以避免接受比特币网络节点不会接受的交易。
此项目通过使用 cargo 创建 libbitcoinconsensus
库来简化 Rust 开发者的生活。无需直接处理陈旧的 C++ 工具链。这也简化了共识库的交叉编译,例如为移动应用程序。
libbitcoinconsensus
指的是来自另一个库(secp256k1)的代码。该库的快照也被包含在比特币源代码中,因此它可能被集成到 libbitcoinconsensus
中。然而,典型的比特币启用应用将需要访问更多的 secp256k1 函数。项目 rust-secp256k1 提供了 cargo 构建和 Rust 绑定,因此我们依赖于它,而不是将比特币嵌入式源代码编译到 libbitcoinconsensus
中。这引入了风险,因为两个 secp256k1 源代码之间的差异可能会破坏与比特币的共识。
版本号
我们使用[轻微滥用]语义版本控制。第一个 Major.Minor.Patch
数字跟踪分发的比特币核心代码(见下文),第二个 Major.Minor.Patch
数字跟踪这个软件包。例如,如果我们通过 Patch
版本升级比特币核心代码,我们也会提升我们的 Patch
版本。
这种做法的一个副作用是,crates.io
会以黄色显示我们的发布版本,就像它们是预发布版本一样,这是由于我们使用了 -
,在语义版本控制中,这表示预发布版本。
分发包比特币核心
我们使用一个脚本来分发包比特币核心代码,该脚本接受比特币核心版本号进行分包:./vendor-bitcoin-core.sh 0.21.1
MSRV
此软件包的 MSRV 是 1.48.0。
Githooks
为了帮助开发者在使用 CI 之前捕获错误,我们提供了一些 githooks。如果您还没有在本地配置 githooks,您可以在存储库的根目录中运行以下命令来使用此存储库中的 githooks:
git config --local core.hooksPath githooks/
或者,在您的 .git/hooks
目录中添加指向我们提供的任何 githooks 的符号链接。
API
API 非常基本,直接暴露比特币的 API。这是故意的,以保持此项目的最小占用空间,不添加额外的运行时依赖。您将需要一个其他 Rust 库来序列化比特币交易和脚本。
验证比特币交易的单个支出(输入)
verify(spent_output_script: &[u8],amount: u64,spending_transaction: &[u8],input_index: usize) -> Result<(), Error>
参数
- spend_output_script: 要支出的比特币交易输出脚本
- amount: 被支出输出金额,以 satoshis 为单位
- spending_transaction: 支出比特币交易,以比特币的线格式序列化
- input_index: 在 spending_transaction 中的输入索引
示例
(随机选择的)比特币交易 aca326a724eda9a461c10a876534ecd5ae7b27f10f26c3862fb996f80ea2d45d 支出了一个输入,即 95da344585fcf2e5f7d6cbf2c3df2dcce84f9196f7a7bb901a43275cd6eb7c3f 的第一个输出,金额为 630482530 satoshis。
线格式中的支出交易是
spending=02000000013f7cebd65c27431a90bba7f796914fe8cc2ddfc3f2cbd6f7e5f2fc854534da95000000006b483045022100de1ac3bcdfb0332207c4a91f3832bd2c2915840165f876ab47c5f8996b971c3602201c6c053d750fadde599e6f5c4e1963df0f01fc0d97815e8157e3d59fe09ca30d012103699b464d1d8bc9e47d4fb1cdaa89a1c5783d68363c4dbc4b524ed3d857148617feffffff02836d3c01000000001976a914fc25d6d5c94003bf5b0c7b640a248e2c637fcfb088ac7ada8202000000001976a914fbed3d9b11183209a57999d54d59f67c019e756c88ac6acb0700
被支出交易的第一个输出的脚本是
spent=76a9144bfbaf6afb76cc5771bc6404810d1cc041a6933988ac
(伪代码)调用
verify(spent, 630482530,spending, 0)
应返回 Ok(())
注意:仅对Segwit交易检查已花费金额。上面的示例不是Segwit,因此验证将成功,不论金额多少。