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 神奇豆子

Download history 5562/week @ 2024-03-14 5671/week @ 2024-03-21 4320/week @ 2024-03-28 3907/week @ 2024-04-04 5644/week @ 2024-04-11 5450/week @ 2024-04-18 5327/week @ 2024-04-25 3792/week @ 2024-05-02 5666/week @ 2024-05-09 5876/week @ 2024-05-16 5189/week @ 2024-05-23 6243/week @ 2024-05-30 7933/week @ 2024-06-06 6553/week @ 2024-06-13 5706/week @ 2024-06-20 3203/week @ 2024-06-27

每月下载量 24,263
用于 42 个crate (21 直接)

Apache-2.0

7.5MB
96K SLoC

C++ 54K SLoC // 0.2% comments C 36K SLoC // 0.0% comments Automake 1.5K SLoC // 0.1% comments Visual Studio Project 1K SLoC Shell 1K SLoC // 0.2% comments M4 774 SLoC // 0.2% comments GNU Style Assembly 753 SLoC // 0.1% comments Rust 329 SLoC // 0.0% comments Python 169 SLoC // 0.1% comments Visual Studio Solution 162 SLoC

包含 (晦涩的 autoconf 代码, 80KB) depend/bitcoin/configure.ac, (晦涩的 autoconf 代码, 20KB) configure.ac, (晦涩的 autoconf 代码, 6KB) configure.ac

Status

比特币的 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,因此验证将成功,不论金额多少。

无运行时依赖