40 个版本

0.11.0-beta.72024 年 8 月 18 日
0.11.0-beta.62024 年 6 月 8 日
0.11.0-beta.52024 年 3 月 19 日
0.11.0-beta.3.12023 年 12 月 30 日
0.5.0 2021 年 11 月 23 日

#2#taproot

Download history 98/week @ 2024-04-27 104/week @ 2024-05-04 83/week @ 2024-05-11 142/week @ 2024-05-18 143/week @ 2024-05-25 181/week @ 2024-06-01 263/week @ 2024-06-08 255/week @ 2024-06-15 244/week @ 2024-06-22 250/week @ 2024-06-29 407/week @ 2024-07-06 220/week @ 2024-07-13 159/week @ 2024-07-20 211/week @ 2024-07-27 94/week @ 2024-08-03 69/week @ 2024-08-10

577 每月下载量
用于 31 个 crate (10 直接)

Apache-2.0

320KB
6K SLoC

比特币标准实现库

Build Tests Lints codecov

crates.io Docs Apache-2 licensed

现代、简约且符合标准的钱包级别库:rust-bitcoin 和 LNP/BP 标准协会的 BDK 库的替代品。

库的主要目标是

  • 快速稳定 API:库将在开发的第一年内瞄准 v1.0 版本;这将使使用库的下游 crate 也能够稳定下来,并且不需要在每次发布新的 bp-wallet 版本时花费太多精力进行集成;
  • 不使用私钥:库使用描述符分析钱包状态,允许生成未签名的 PSBT,以及发布和分析(部分)签名的 PSBT,但不提供签名者或处理任何私钥材料(种子、助记词、xprivs、私钥)的方式;PSBT 文件必须使用某些外部签名者或硬件钱包进行签名;
  • 符合标准:库试图完全符合 BIP 中定义的现有比特币标准,并且不使用任何旧的方法或“区块链不是比特币”的做法(如 BLIPs 提供的);
  • 比特币共识和标准的分离:与共识相关的代码不是本库的一部分;所有可能具有共识意义的数据结构和业务逻辑,以及钱包所需的数据,都被分离到一个独立的 bp-primitives 库(bp-core 库的一部分)中,该库计划在比特币协议旁边进行更广泛的审计和 ossified(固化和完善);而本库将继续通过更好的 API 和匹配新的钱包标准而不断发展;
  • 广泛使用描述符:库专注于使用描述符定义钱包的所有部分;除了脚本公钥描述符外,它还支持 xpub 描述符、派生描述符、应用于整个脚本公钥描述符,以及 RBF 的输入描述符。您可以在下面的部分中了解更多有关特定描述符类型的信息;
  • 脚本模板:该库允许将任意脚本作为描述符的一部分提供,这允许支持 BOLT 闪电通道交易,并确保长期稳定性;您可以在下面了解更多关于脚本模板与 miniscript 的信息;
  • 有观点的高级钱包抽象:该库提供了一套高级钱包数据结构,抽象出了区块链级别的细节;有助于编写更少的样板业务逻辑;
  • 所有 Rust 项目和 FFI 中可用的 API:该库不使用异步 Rust、复杂的回调、线程等,这使得 API 保持简单,可以从任何 Rust 应用(如使用反应模式而不是异步)中使用;同时,该库的所有数据结构都是 Send + Sync,这意味着它们可以在任何多线程或异步环境中使用;
  • 抽象的区块链数据提供者:该库抽象了区块链索引器 API(Electrum、Esplora、Bitcoin Core 等),并使用该库结构提供了它们的实现;

常见问题解答

为什么不使用 rust-bitcoin

该库不依赖于 rust-bitcoin 仓库。这样做的原因是

  • 保持功能集小巧且特定于钱包rust-bitcoin 提供了“一站式”解决方案,涵盖了比特币生态系统的许多部分,如比特币点对点协议,这不是钱包所必需的;
  • 保持 API 稳定rust-bitcoin 每次发布都会显著破坏 API,自 2022 年初以来一直在不断重构——这个过程可能还需要几年;在每次主要更改后更新钱包库都很痛苦,需要大量开发者的时间和精力,还引入了破坏 API 的更改,阻止所有依赖库的稳定化;
  • 私钥材料的分离:在 Rust 中无法实现秘密密钥材料的常数时间生产,也无法防止编译器将其复制到机器内存中(例如,zeroise 和其他方法无法防止这种情况)。因此,在提供其他 API 的同时提供秘密密钥可能导致钱包设计不安全,应避免;
  • 共识代码与标准的分离rust-bitcoin 将共识相关的结构和高级钱包抽象并排放置,这与我们在该库中做出的设计决策相矛盾;
  • 引入强语义类型:例如,rust-bitcoin 没有区分不同形式的脚本(公钥、签名、见证等),而在这个库中,我们使用语义类型方法,为每个语义上不同的实体提供类型安全的变体,即使它们与其他实体具有相同的表示形式。

如列表所示,rust-bitcoin 的设计和维护方法与该项目的重大目标相矛盾——实际上,该项目是由 Maxim Orlovsky(自 2019 年第一季度至 2022 年第二季度是 rust-bitcoin 最活跃的贡献者)创建的,目的是通过不同的权衡来解决这些问题,为需要它的用户提供 rust-bitcoin 的替代方案。

为什么不使用 miniscript?

Miniscript非常适合多种用途,但它不能用于许多情况,包括BOLT-3闪电通道交易输出的表示,预taproot脚本不同分支中公钥的重用[1][ms-1]。Miniscript仍然不稳定,由于发现的错误而最近对其语义进行了更改[2][ms-2] [3][ms-3];这意味着在miniscript之前创建的描述符可能无法在将来确定性地再现某些钱包UTXOs的结构。最后,现有的Rust miniscript实现rust-miniscript继承了所有rust-bitcoin的权衡,在API和语义方面更加不稳定。因此,决定使用这个库来提供对miniscript的替代方案,通过引入[脚本模板][#script-templates],可以将其转换为miniscript表示,然后再转换回来,但使用一些外部提供的工具,而不是直接在此添加miniscript依赖。

为什么不使用BDK?

BDK很好,但它依赖于rust-bitcoinrust-miniscript,并且只能在那个生态系统中使用,继承了上述所有权衡。由于我们试图解决这些权衡,我们必须创建BDK的替代方案。

描述符钱包是由同一作者较早之前的项目,试图通过在其之上构建来解决这个问题rust-bitcoin的问题。随着最近v0.30版本的rust-bitcoin发布,很明显,采用API破坏性更改的努力比从头创建一个新独立项目要高得多,而新项目可能以更高效、更优雅的方式解决rust-bitcoin的问题。因此,决定停止使用descriptor-wallet,并开始新的bp-wallet项目。

设计

脚本模板

描述符

贡献

贡献指南可以在CONTRIBUTING中找到

更多信息

MSRV

最小支持的Rust编译器版本(MSRV)在rust-versionCargo.toml中显示。

关于替代币的政策

不支持也不计划支持除比特币区块链/比特币协议之外的替代币和“区块链”;针对它们的拉取请求将被拒绝。

许可

这些库是在Apache 2.0开源许可的条款下分发的。有关许可详情,请参阅LICENCE文件。

依赖项

~14MB
~202K SLoC