Schnorr 签名
用更高效的 Schnorr 算法替换比特币的数字签名算法 (ECDSA) 长期以来一直是许多比特币开发人员愿望清单的首位。Schnorr 是一种利用椭圆曲线密码学的简单算法,它能够在保留所有功能和安全假设的同时,对现有方案进行多项改进。
值得注意的是,Schnorr 签名支持“原生多重签名”,它可以将多个签名聚合到一个签名中,该签名对于其各自输入的密钥之和有效。此功能提供了三个重要的好处
-
无论多重签名设置中参与者的数量如何,签名的大小都保持不变。50-of-50 事务的大小与使用单个公钥和签名的交易的大小实际上相同。因此,通过消除最初逐个验证每个签名的要求,此类方案的性能得到了显著提高。此外,Schnorr 签名的验证速度略快于 ECDSA。
-
需要验证和通过网络传输的数据量减少也转化为有趣的容量增长。考虑到下面显示的多重签名交易数量的历史增长,减少这些交易规模的潜力是对现有扩展工作的诱人补充。随着支付渠道的出现和进一步采用,我们应该预计这种趋势会持续下去。
-
从隐私的角度来看,Schnorr 允许隐藏多重签名的整个策略,使其与传统的单个公钥无法区分。在阈值设置中,参与者也无法透露他们是否授权了交易。
根据其多重签名设置分配未花费的 P2SH 输出。来源:p2sh.info
不幸的是,与 ECDSA 不同,Schnorr 算法自发明以来一直没有被标准化,这可能是因为最初对其施加的专利(现已过期)的原因。虽然系统的总体轮廓在数学上是合理的,但缺乏文档和规范使得实现更加困难。具体来说,将其应用于比特币的临时密钥对设计涉及需要进一步优化的安全考虑。
Pieter Wuille 在他的 Schnorr 签名扩展比特币米兰演示文稿中将主要挑战定义为“抵消”问题。一群用户创建对他们密钥之和有效的签名的可能性为恶意参与者打开了从整体中减去另一用户密钥的大门。它的工作原理是这样的
假设一个使用输入公钥 Q1 和 Q2 的 2-of-2 多重签名方案。恶意参与者在交互阶段可能不会宣布他们的密钥为 Q2 以与 Q1 组合,而是提供 Q2-Q1,从而有效地抵消另一个用户的密钥。发送到联合公钥的任何资金现在只能由 Q2 密钥的所有者花费,而 Q1 的所有者甚至不知道发生了什么。
幸运的是,现在可以使用一种解决方案,该解决方案涉及在签名之前将设置期间使用的每个密钥乘以基于自身和所有其他相关密钥的哈希值。此过程称为去线性化。此方案的安全证明目前正在接受同行评审,并将在一份即将发布的白皮书中正式描述。
在短期内,Schnorr 签名被认为是比特币协议中两个重要功能的可行替代方案:OP_CHECKSIG 和 OP_CHECKMULTISIG。
前者目前用于根据事务中的消息检查 ECDSA 签名与其各自公钥的对应关系。通过切换到检查 Schnorr 签名而不是 ECDSA 的等效项,该操作码可用于授权需要多个签名的支出,这通常需要调用 OP_CHECKMULTISIG。使用网络无法观察到的先验交互,签名者集合计算一个组合公钥以及一个通用签名,该签名由新的 OP_CHECKSIG 验证,并具有提高隐私和降低成本的好处。
后者涉及仅需要 n-of-m 个签名即可授权交易的阈值场景。OP_CHECKMULTISIG 的当前实现验证阈值策略所需的全部公钥和关联签名。因为计算量随参与者数量线性扩展,所以 Schnorr 提出了一个效率更高的方案,该方案用单个组合签名以及所需公钥的子集替换签名列表。
在对保护签名者免受恶意行为者攻击的去线性化方案进行更多评估之前,Schnorr 签名的进一步应用可能为时尚早,但上述功能的实现有望为更好地理解生产环境中的方案铺平道路。在经过额外的同行评审后,可能会在今年年底之前提出关于 Schnorr 签名实现的 BIP。
签名聚合
允许在一个输入上组合多个签名的 Schnorr 属性也适用于所有交易的多个输入的聚合。比特币开发者 Gregory Maxwell 是第一个使用之前基于 BLS 签名的提案的见解提出此想法的人。
为了正确理解此应用程序与上面描述的应用程序之间的区别,有必要考虑在每种情况下如何聚合签名。在原生多重签名设置中,签名者之间协作计算一个公共密钥及其关联签名。此交互发生在协议之外,并且仅涉及相关方。签名聚合背后的想法是使系统验证器(即比特币节点)能够在协议级别为所有交易的所有输入计算一个密钥和签名。
由于此方案将聚合范围扩展到确定性参与者集之外,因此它为恶意行为者利用“抵消”错误引入了新的攻击媒介。因此,上一节中强调的去线性化修复对于此方法的健全性至关重要。
在实现方面,该提案相当简单:修改 OP_CHECKSIG 和 OP_CHECKMULTISIG,以便它们可以堆叠公钥,对其进行去线性化,并且一旦所有关联的输入被验证,则为其各自的事务生成组合签名。
如果自创世区块以来已实施签名聚合,则可以很容易地评估可以节省的资源类型。假设除了每个事务一个之外,每个历史签名都将减少到 1 字节,分析表明该方法将导致存储和带宽至少减少 25%。n-of-n 阈值的增加使用可能会转化为更多节省,尽管在此分析中未考虑这些节省。
有关 Schnorr 签名的更多信息
- Pieter Wuille 关于 Schnorr 签名的扩展比特币米兰演示文稿的文字记录
- Pieter Wuille 演示的视频
- 2016 年 7 月比特币开发者和矿工聚会上关于 Schnorr 签名的讨论
- Schnorr 文档
- StackExchange - Schnorr 的影响是什么?
- Elements 项目:Schnorr 签名验证
- SF 比特币开发者研讨会:Gregory Maxwell 关于 Schnorr 多重签名
- 比特币核心开发者关于 Schnorr 签名的会议记录