5个版本

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.11.0-beta.32023年12月25日

#471 in 魔法豆

Download history 39/week @ 2024-05-03 23/week @ 2024-05-10 65/week @ 2024-05-17 60/week @ 2024-05-24 85/week @ 2024-05-31 311/week @ 2024-06-07 220/week @ 2024-06-14 153/week @ 2024-06-21 286/week @ 2024-06-28 406/week @ 2024-07-05 141/week @ 2024-07-12 141/week @ 2024-07-19 141/week @ 2024-07-26 58/week @ 2024-08-02 41/week @ 2024-08-09 639/week @ 2024-08-16

923 每月下载量
用于 6 个crate(通过 bp-std

Apache-2.0

140KB
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:该库不使用异步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创建的描述符可能无法在将来确定性地重现某些钱包UTXO的结构。最后,现有的Rust miniscript实现rust-miniscript继承了所有rust-bitcoin的权衡,在API和语义方面更加不稳定。因此,决定使用这个库来提供一个替代方案,引入[脚本模板][#script-templates],可以转换为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
~181K SLoC