本文档描述了BIP 340签名的半聚合技术,这是一种将多个签名聚合成单个聚合签名的非交互式过程。聚合签名的大小约为原始签名组合大小的一半。半聚合适用于需要验证多个签名的验证者,通过将签名压缩成单个聚合签名,可以减少发送给验证者的数据量。
BlockstreamResearch/ cross-input-aggregation Public
master
搜索此仓库
/
复制路径
BlameMore file actions
BlameMore file actions
halfagg: mention multi/threshold sig opcode use case
2024年2月22日
ce8c2f9 · 2024年2月22日
打开提交详情
185 行 (147 loc) · 17 KB
/
顶部
预览
代码
Blame
185 行 (147 loc) · 17 KB
复制原始文件
下载原始文件
轮廓
编辑和原始操作
Title: BIP 340 签名的一半聚合
Status: 实验性的
## 目录<br>永久链接:目录<br>- 简介 <br> - 摘要<br> - 版权<br> - 动机<br> - 设计<br>- 描述 <br> - 规范<br> - 测试向量<br> - 伪代码 <br> - 符号<br> - 聚合<br> - 增量聚合<br> - 验证聚合 |
本文档描述了 BIP 340 签名的一半聚合。 一半聚合是一种非交互式过程,用于将一组签名聚合为单个聚合签名。 生成的聚合签名的大小大约是原始签名组合大小的一半。
本文档基于 3-clause BSD 许可。
如果存在需要验证多个签名的验证者,则一半聚合适用。 签名可以压缩为单个聚合签名并发送给验证者,而不是将单个签名发送给验证者。 如果验证者可以成功验证聚合签名,则验证者可以确保单个签名可以通过验证。
一半聚合的目的是减小发送给验证者的数据的大小。 虽然 n 个 BIP 340 签名是 64*n 字节,但相同签名的一半聚合是 32*n + 32 个字节。 一半聚合的过程非常简单:它是输入签名、公钥和消息的纯函数。 它是非交互式的,不 需要其他方的合作,包括签名者或验证者。
在各种情况下,BIP-340 签名的一半聚合都很有用。 为了使本节简短并避免快速过时,我们专注于列出示例应用程序,并将特定于应用程序的权衡的详细讨论推迟到其他地方。
一个例子是闪电网络路由 gossip 协议,该协议截至撰写本文时 涉及包含 ECDSA 签名的消息。 如果签名方案更改为 BIP 340,则一半聚合可以减少 gossip 数据的总量。 节点可以组装一批消息,并将各个消息的签名一半聚合到批处理的单个签名中,而不是发送单个 gossip 消息。
一半聚合的另一个应用是在比特币共识协议中。 特别是,它已在 Graftroot 提案 的上下文中进行了讨论。 通过聚合替身脚本的签名和满足此脚本的签名,一半聚合将允许 Graftroot 花费与最佳情况 Taproot 花费一样有效。 此外,一半聚合提高了提议的比特币脚本操作码的效率,这些操作码验证多个签名,例如 OP_EVICT。 我们还可以想象添加一个比特币脚本操作码来验证一半聚合签名,从而实现更高效的非交互式多重签名和阈值签名。
一半聚合也可以应用于比特币交易输入中的签名,这个过程称为跨输入签名聚合 (CISA)。 这 将平均交易的大小减少了 20.6%,权重减少了 7.6%。 使用一半聚合的一个众所周知的缺点是,某些适配器签名协议的使用 可能不兼容。 通常,CISA 建议使用交互式完整签名聚合而不是非交互式一半聚合,因为创建有效交易已经需要合作,并且完整签名聚合效率更高。 但是,一半聚合和完整聚合之间的复杂性差异非常显着,因此基于一半聚合的 CISA 是一种合理的方法。
对比特币共识最具侵入性的应用将是全区块签名聚合。 它指的是区块生产者尽可能多地聚合交易签名的过程。 在最佳情况下,整个区块将只有一个一半聚合签名。 虽然从效率的角度来看这很有吸引力,但全区块聚合需要更多的研究(特别是,要特别注意处理 reorgs)。
Schnorr 签名一半聚合的想法是在全区块签名聚合的背景下,由 Tadge Dryja 于 2017 年在 比特币邮件列表中提出的。 该方案存在一个安全漏洞,该漏洞在不久之后由 Russell O'Connor 和 Andrew Poelstra 注意到 并进行了 修复。 2021 年,Chalkias、Garillot、Kondi 和 Nikolaenko 在随机预言机模型 (ROM) 中发布了一个安全证明,该证明将一半聚合的安全性降低到 Schnorr 签名的安全性。 Chen 和 Zhao 在第二年能够在 ROM 和代数组模型中生成一个严格的证明。 此外,他们提出了一种优雅的增量聚合方法,本文档中使用了该方法。
该规范是用 hacspec 编写的,hacspec 是一种用于形式规范的语言,也是 rust 的一个子集。 它可以在 hacspec-halfagg 目录 中找到。 请注意,该规范依赖于 hacspec 库和 BIP 340 的 hacspec 实现。
初步的测试向量在 tests.rs 中提供。
可以使用测试向量执行该规范,方法是在 hacspec-halfagg 目录 中运行 cargo test
(cargo
是 rust 包管理器)。
以下伪代码_不是_规范,仅旨在补充实际的 hacspec 规范。
使用以下约定,常量定义为 secp256k1。 我们注意到,将此规范调整为其他椭圆曲线并非易事,并且可能导致不安全的方案 [1]。
Aggregate 接受公钥、消息和签名三元组的数组,并返回一个聚合签名。 如果每个三元组 (p, m, s) 都有效(即,BIP 340 中定义的 Verify(p, m, s) 返回 true),则返回的聚合签名和 (p, m) 元组数组将通过 VerifyAggregate。 (但是,逆不成立:给定合适 Valid 三元组,可以构造 Aggregate 的输入数组,该数组包含无效的三元组,但 VerifyAggregate 将接受 Aggregate 返回的聚合签名。 如果不希望这样做,应在将输入三元组传递给 Aggregate 之前单独验证它们。)
输入:
Aggregate(pms0..u-1):
IncAggregate 接受一个聚合签名,一个与聚合签名相对应的公钥和消息元组数组,以及一个额外的公钥、消息和签名三元组数组。 它将额外的三元组数组聚合到现有的聚合签名中,并返回生成的新聚合签名。 换句话说,如果 VerifyAggregate(aggsig, pm_aggd) 通过,并且 pms_to_agg 中的每个三元组 (p, m, s) 都有效(即,BIP 340 中定义的 Verify(p, m, s) 返回 true),那么返回的聚合签名以及 pm_aggd 的 (p, m) 元组和 pms_to_agg 的数组将通过 VerifyAggregate。 (但是,逆不成立:给定一个合适的有效聚合签名和合适 Valid 三元组,可以构造 IncAggregate 的输入,该输入包含无效的聚合签名或无效的三元组,但 VerifyAggregate 将接受 IncAggregate 返回的聚合签名。 如果不希望这样做,则应在将输入三元组和输入聚合签名传递给 IncAggregate 之前单独验证它们。)
输入:
IncAggregate(aggsig, pm_aggd0..v-1, pms_to_agg0..u-1):
VerifyAggregate 针对公钥和消息元组数组验证给定的聚合签名。
输入:
VerifyAggregate(aggsig, pm_aggd0..u-1): 算法 VerifyAggregate(aggsig, pm_aggd0..u-1) 定义为:
验证算法与 BIP340 批量验证 相似。 与 BIP340 中一样,使用 用于计算多个 EC 乘积之和的有效算法 可以大大加快验证速度。
- 原文链接: github.com/ElementsProje...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!