#描述符 #钱包 #比特币 #taproot #psbt

描述符

比特币描述符库(比特币协议栈的一部分)

24个版本

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.32023年12月25日
0.5.0 2021年11月23日

#256 in 神奇豆

Download history 81/week @ 2024-04-30 82/week @ 2024-05-07 69/week @ 2024-05-14 127/week @ 2024-05-21 123/week @ 2024-05-28 288/week @ 2024-06-04 179/week @ 2024-06-11 247/week @ 2024-06-18 223/week @ 2024-06-25 428/week @ 2024-07-02 309/week @ 2024-07-09 168/week @ 2024-07-16 200/week @ 2024-07-23 238/week @ 2024-07-30 73/week @ 2024-08-06 301/week @ 2024-08-13

826 每月下载量
用于 30 个crate(7直接使用)

Apache-2.0

130KB
2.5K 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文件必须由某些外部签名人或硬件钱包进行签名;
  • 符合标准:库试图提供与现有BIPs中定义的比特币标准的完全兼容性,并避免使用任何遗留方法或“区块链非比特币”的做法(如BLIPs中提供的那些);
  • 比特币共识和标准的分离:与共识相关的代码不属于本库;所有可能具有共识意义且对钱包所需的数据结构和业务逻辑都分离到一个独立的 bp-primitives 库(bp-core 库的一部分),该库计划在比特币协议的同时进行广泛的审计和标准化(而此库将继续通过更好的API和匹配新的钱包标准而不断发展);
  • 广泛使用描述符:本库专注于使用描述符定义钱包的所有部分;除了脚本公钥描述符外,它还支持xpub描述符、派生描述符、作为整体应用于脚本公钥描述符,以及RBF的输入描述符。您可以在下文的相关部分中了解更具体的描述符类型;
  • 脚本模板:本库允许将任意脚本作为描述符的一部分提供,这支持BOLT闪电通道交易,并确保长期稳定性;您可以在下文了解更多关于脚本模板与miniscript的信息;
  • 具有偏见的顶层钱包抽象:本库提供了一组高层次的钱包数据结构,抽象掉了区块链级别的细节;有助于编写更少的样板业务逻辑;
  • 适用于所有Rust项目和FFI的API:本库不使用async rust、复杂回调、线程等,这使得API保持简单,可以从任何Rust应用程序(如使用响应式模式而非async的应用程序)中使用;同时,本库的所有数据结构都是 Send + Sync,这意味着它们可以在任何多线程或async环境中使用;
  • 抽象区块链数据提供者:本库抽象了区块链索引器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中创建的描述符可能无法在未来确定性复现某些钱包UTXO的结构。最后,现有的Rust miniscript实现rust-miniscript继承了所有rust-bitcoin的权衡,并且在API和语义方面更加不稳定。因此,决定使用这个库来提供一个与miniscript不同的替代方案,引入[脚本模板][#script-templates],可以从miniscript表示转换为,也可以从miniscript表示转换为——但使用外部提供的工具而不是直接在这里添加miniscript作为依赖项。

为什么不使用BDK?

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

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

设计

脚本模板

描述符

贡献

贡献指南可在CONTRIBUTING中找到

更多信息

MSRV

最小支持的Rust编译器版本(MSRV)在Cargo.tomlrust-version中显示。

关于替代币的政策

除了比特币区块链/比特币协议之外的替代币和“区块链”不受支持,也不计划支持;针对这些目标发出的拉取请求将被拒绝。

许可

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

依赖关系

~13MB
~201K SLoC