11 个版本
0.0.11 | 2024 年 3 月 20 日 |
---|---|
0.0.10 | 2024 年 3 月 20 日 |
0.0.5 | 2024 年 2 月 29 日 |
0.0.4 | 2023 年 11 月 28 日 |
0.0.3 | 2023 年 10 月 30 日 |
#1619 in 魔法豆
每月下载量:741
在 dlctix 中使用
220KB
3.5K SLoC
MuSig2
该软件包提供了一种灵活的 Rust 实现 MuSig2,这是一个优化后的数字签名聚合协议,在 secp256k1
椭圆曲线上。
MuSig2 允许相互不信任的各方共同签署数据,并将它们的签名聚合为一个单一的聚合签名,该签名无法区分是由单个私钥生成的。该组共同控制一个 聚合公钥,只有当组内所有人都合作时才能创建签名(即 N-of-N 多签名方案)。MuSig2 优化以支持仅通过 两次网络通信往返 的安全签名聚合。
具体来说,此软件包实现了 BIP-0327,用于创建和验证符合比特币共识规则的签名,但该协议是灵活的,可以应用于任何 N-of-N 多签名用例。
⚠️ 测试版状态 ⚠️
此软件包处于测试版状态。最新版本是 v0.0.x
版本号。预期会有破坏性更改和安全修复。一旦此软件包稳定,我们将标记并发布 v1.0.0
。
概述
如果您还不熟悉 MuSig2,合作签署的过程如下
- 所有签署者相互分享他们的公钥。该组计算出一个 聚合公钥,他们共同控制。
- 在第一轮签名中,签名者之间生成和分享随机数(随机数)。这些随机数既有秘密版本也有公开版本。只有公开的随机数(也称为
PubNonce
)应该被分享,而相应的秘密随机数(也称为SecNonce
)必须保密。 - 一旦每个签名者都收到了其他每个签名者的公开随机数,每个签名者就会使用他们的秘密密钥和秘密随机数为一条消息创建一个部分签名。
- 在第二轮签名中,签名者之间分享他们的部分签名。可以验证部分签名以追究行为不当的签名者的责任。
- 一组有效的部分签名可以聚合成一个最终签名,它只是一个普通的Schnorr签名,在聚合的公钥下有效。
背骨选择
这个包不直接实现椭圆曲线点数学。相反,我们依赖于两个信誉良好的库之一
- 通过
secp256k1
的C语言绑定libsecp256k1
,通过secp256k1包,由Bitcoin Core团队维护。 - 通过k256包进行纯Rust实现,由RustCrypto团队维护。
可以使用其中之一。默认情况下,此包更喜欢依赖libsecp256k1
,因为这是任何地方都可以找到的最经过验证和公开信任的secp256k1曲线数学实现。但是,如果您需要纯Rust实现,则可以安装此包而不使用它,并使用纯Rust的k256
包代替。
cargo add musig2 --no-default-features --features k256
如果同时启用了k256
和secp256k1
功能,则我们默认使用libsecp256k1
绑定进行实际数学,但仍然提供特制实现,以便此包与k256
互操作。
此包使用secp
包及其类型在内部表示椭圆曲线点(例如公钥)和标量(例如私钥)
secp::Scalar
表示非零标量值。secp::Point
表示非无穷曲线点。secp::MaybeScalar
表示可能为零的标量。secp::MaybePoint
表示可能为无穷的曲线点。
根据启用的此包的功能,在以下类型和更高级类型(例如secp256k1::PublicKey
或k256::SecretKey
)之间实现转换特制。通常,我们的API可以接受或返回任何可以转换为等效的secp
表示的类型,尽管调用者也可以直接使用secp
。
文档
依赖项
~6.5MB
~76K SLoC