40 个版本
新 0.11.0-beta.7 | 2024 年 8 月 18 日 |
---|---|
0.11.0-beta.6 | 2024 年 6 月 8 日 |
0.11.0-beta.5 | 2024 年 3 月 19 日 |
0.11.0-beta.3.1 | 2023 年 12 月 30 日 |
0.5.0 | 2021 年 11 月 23 日 |
#2 在 #taproot
577 每月下载量
用于 31 个 crate (10 直接)
320KB
6K SLoC
比特币标准实现库
现代、简约且符合标准的钱包级别库: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-bitcoin
和rust-miniscript
,并且只能在那个生态系统中使用,继承了上述所有权衡。由于我们试图解决这些权衡,我们必须创建BDK的替代方案。
本项目与descriptor-wallet
有何关联?
描述符钱包是由同一作者较早之前的项目,试图通过在其之上构建来解决这个问题rust-bitcoin
的问题。随着最近v0.30版本的rust-bitcoin
发布,很明显,采用API破坏性更改的努力比从头创建一个新独立项目要高得多,而新项目可能以更高效、更优雅的方式解决rust-bitcoin
的问题。因此,决定停止使用descriptor-wallet
,并开始新的bp-wallet
项目。
设计
脚本模板
描述符
贡献
贡献指南可以在CONTRIBUTING中找到
更多信息
MSRV
最小支持的Rust编译器版本(MSRV)在rust-version
的Cargo.toml
中显示。
关于替代币的政策
不支持也不计划支持除比特币区块链/比特币协议之外的替代币和“区块链”;针对它们的拉取请求将被拒绝。
许可
这些库是在Apache 2.0开源许可的条款下分发的。有关许可详情,请参阅LICENCE文件。
依赖项
~14MB
~202K SLoC