Schnorr签名

微信扫码分享

Schnorr 签名

Schnorr 签名是由德国数学家兼密码学家 Claus Schnorr 提出的一种数字签名方案。在比特币网络中,Schnorr 签名作为 Taproot 升级(BIP-340)的核心组成部分被引入,旨在解决传统椭圆曲线数字签名算法(ECDSA)在隐私性、效率和可扩展性方面存在的局限。

要解决的问题

在 Schnorr 签名引入之前,比特币使用 ECDSA 进行交易签名。虽然 ECDSA 安全可靠,但在处理多重签名(MultiSig)和复杂脚本时存在不足:

  1. 数据冗余与成本:在 m-of-n 多重签名中,需要分别提供 m 个独立的签名,这占用了大量的区块空间,导致交易费用增加。
  2. 隐私泄露:多重签名交易在链上可以被轻易识别并区分于普通交易,这暴露了钱包的安全策略和资金管理模式。
  3. 验证效率:ECDSA 签名必须逐个验证,无法进行批量处理,增加了节点的计算负担。
  4. 不可延展性问题:ECDSA 签名固有的延展性(Malleability)虽然可以通过 SegWit 缓解,但 Schnorr 从数学层面提供了更彻底的解决方案。

实现机制与原理

Schnorr 签名基于椭圆曲线离散对数问题(ECDLP),其数学结构以“线性”为核心特征。

线性特性与密钥聚合

Schnorr 签名的线性特性允许进行简单的加法运算。如果两个用户拥有私钥 $x_1$ 和 $x_2$,对应的公钥为 $P_1$ 和 $P_2$,那么聚合公钥可以是 $P_{agg} = P_1 + P_2$。对应的聚合签名也可以由各自的签名部分相加得出。

利用这一特性,比特币实现了 MuSig(多重签名聚合)方案。在链上,一个由多人共同签署的交易看起来与一个普通单密钥签署的交易完全一致。验证者只需验证一个聚合公钥和一个聚合签名,无需知道背后参与了多少个签名者。

批量验证

由于 Schnorr 签名的线性结构,节点验证器可以同时验证一组不相关的签名。验证 $N$ 个签名所需的时间明显少于单独验证 $N$ 次 ECDSA 签名的时间。这对于区块同步和验证大量交易的节点来说,显著提升了性能。

随机数生成

BIP-340 标准化了 Schnorr 签名在比特币中的实现,规定了确定性 nonce(随机数)生成方式,避免了因随机数生成器故障导致的私钥泄露风险,同时保持了与现有私钥体系的兼容性。

主要特点

  • 密钥聚合(Key Aggregation):允许多个签名者生成一个单一的公钥和签名,显著节省区块空间并降低交易费用。
  • 增强隐私性:所有的 Taproot 交易(无论是单签、多签还是复杂脚本)在链上看起来都一样,外部观察者难以区分资金的锁定条件。
  • 非延展性(Non-malleability):Schnorr 签名在数学上具有强不可延展性,消除了第三方在不使签名失效的情况下更改交易ID的可能性。
  • 批量验证(Batch Verification):允许网络节点更快地验证区块中的签名,提高了网络的吞吐量。
  • 安全性证明:相比 ECDSA,Schnorr 签名在随机预言机模型下有更严谨的安全证明。

推荐阅读

相关概念

  • Taproot:比特币的一次重要软分叉升级,集成了 Schnorr 签名、MAST(默克尔抽象语法树)等技术。
  • ECDSA:椭圆曲线数字签名算法,比特币早期使用的签名方案。
  • MAST:默克尔抽象语法树,允许将复杂的智能合约逻辑压缩为单个哈希值。