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日

#5 in 魔法豆

Download history 338/week @ 2024-04-27 86/week @ 2024-05-04 44/week @ 2024-05-11 371/week @ 2024-05-18 229/week @ 2024-05-25 216/week @ 2024-06-01 571/week @ 2024-06-08 658/week @ 2024-06-15 757/week @ 2024-06-22 543/week @ 2024-06-29 594/week @ 2024-07-06 213/week @ 2024-07-13 173/week @ 2024-07-20 201/week @ 2024-07-27 100/week @ 2024-08-03 77/week @ 2024-08-10

590 每月下载量
11 个crate(3个直接) 中使用

Apache-2.0

43KB
641

比特币标准实现库

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库的一部分),该库计划将与比特币协议一起进行更广泛的审计和规范化(而此库将继续通过更好的API和符合新的钱包标准来进化);
  • 广泛使用描述符:库侧重于使用描述符定义钱包的所有部分;除了脚本公钥描述符外,它还支持xpub描述符、派生描述符(应用于整个脚本公钥描述符),以及RBF的输入描述符。您可以在下面的章节中了解更多关于特定描述符类型的信息;
  • 脚本模板:该库允许将任意脚本作为描述符的一部分提供,这允许支持BOLT闪电通道交易,并确保长期稳定性;您可以在下面的内容中了解更多关于脚本模板与miniscript的信息;
  • 具有意见的高级钱包抽象:该库提供了一套高级钱包数据结构,这些结构抽象了区块链级别的细节;有助于编写更少的样板业务逻辑;
  • 所有Rust项目和FFI中都可用的API:该库不使用异步Rust、复杂回调、线程等,这允许保持API简单,可从任何Rust应用程序(如使用响应式模式而不是异步的应用程序)中调用;同时,库中的所有数据结构都是Send + Sync,这意味着它们可以在任何多线程或异步环境中使用;
  • 抽象的区块链数据提供者:该库抽象了区块链索引器API(Electrum、Esplora、Bitcoin Core等),并使用此库结构提供了它们的实现。

常见问题解答

为什么不使用rust-bitcoin

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

  • 保持功能集小且针对钱包特定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作为依赖项。

为什么不使用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中显示。

关于替代币的政策

不支持也不计划支持除比特币区块链/比特币协议之外的替代币和“区块链”;针对这些替代币的pull requests将被拒绝。

许可

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

依赖项

~13MB
~199K SLoC