#descriptor #wallet #bitcoin #taproot #psbt

bp-std

比特币标准的现代轻量级实现,无 rust-bitcoin/miniscript 依赖

8个版本

新版本 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.42024年2月26日
0.10.0-beta.12023年10月9日

#669 in 神奇豆子

Download history 36/week @ 2024-05-04 26/week @ 2024-05-11 63/week @ 2024-05-18 53/week @ 2024-05-25 92/week @ 2024-06-01 318/week @ 2024-06-08 208/week @ 2024-06-15 187/week @ 2024-06-22 247/week @ 2024-06-29 420/week @ 2024-07-06 143/week @ 2024-07-13 117/week @ 2024-07-20 159/week @ 2024-07-27 50/week @ 2024-08-03 31/week @ 2024-08-10 766/week @ 2024-08-17

1,008 每月下载量
用于 6 crates

Apache-2.0

390KB
7K 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库的一部分),该库计划将与比特币协议一起进行更广泛的审计和 ossification(固话),同时本库将继续随着更好的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稳定:自2022年初以来,rust-bitcoin的每个版本都显著破坏了API,一直在不断重构,这个过程可能持续几年;每次重大更改后更新钱包库都是痛苦的,需要大量开发者的时间和精力,以及引入API破坏性更改,防止所有依赖库稳定;
  • 私钥材料的分离:在Rust中,无法实现秘密密钥材料的常数时间生成,以及防止编译器将其复制到整个机器内存中(如zeroise和其他方法并不能阻止这种情况)。因此,将密钥与其他API一起提供可能会导致钱包的非安全设计,应该避免;
  • 共识代码与标准的分离rust-bitcoin将共识相关结构和更高层的钱包抽象放在一起,这与我们在本库中做出的设计决策相矛盾;
  • 引入强语义类型:例如,rust-bitcoin没有区分不同形式的脚本(公钥、签名、见证等),而在这个库中,我们使用语义类型方法,为每个语义上不同的实体提供类型安全的变体,即使它们与其他实体具有相同的表示。

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

为什么不使用miniscript?

Miniscript非常适合多种用途,但它不能用于许多情况,包括表示BOLT-3闪电通道交易输出、在不同分支的重用公钥[1][ms-1]。Miniscript也存在不稳定的问题,由于发现了一些漏洞,其语义最近发生了变化[2][ms-2] [3][ms-3];这意味着以前使用miniscript创建的描述符可能无法在将来确定性地重现某些钱包UTXO的结构。最后,现有的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)在Cargo.tomlrust-version中显示。

关于替代币的政策

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

许可

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

依赖关系

~13MB
~201K SLoC