Schnorr 签名与 ECDSA 有何不同:从字节数到批量验证 图 1
Schnorr 签名与 ECDSA 有何不同:从字节数到批量验证 · 图 1

同一个问题,两种解法

比特币签名要回答的问题是同一个:证明“我持有与这个输出绑定的私钥”,且不泄露私钥。从 2009 年到 2021 年,答案一直是 secp256k1 曲线上的 ECDSA;BIP340 定义、随 Taproot 在 2021 年 11 月激活块 709632 生效的,是同一曲线上的另一种方案——Schnorr 签名。两者安全性同级,差别全在工程性质上。

维度一:字节数与格式

BIP340 规定签名为 64 字节定长(r 与 s 各 32 字节),且只有一种哈希算法和一种默认 sighash;ECDSA 签名则是 DER 编码、常见长度 71 到 72 字节且可浮动,历史上还允许同一笔交易的不同输入混用多种 sighash 组合。定长的好处不止省空间:签名验证器少了一类畸形编码攻击面,离线签名设备的验算也更容易做对,见 比特币离线签名流程是什么?不联网怎么完成一次转账

维度二:密钥聚合

Schnorr 的公钥与签名具备线性结构,多个参与方的公钥可以线性相加合成一个“聚合公钥”,各方协作生成一个签名,在链上与单钥签名完全无法区分。ECDSA 做不到这一点,传统多签必须把 m-of-n 结构写在脚本里,链上能看出“这是 3 人中的 2 人签的”。BIP340 使用 x-only 公钥:只存 32 字节的横坐标,纵坐标由奇偶约定推出,地址侧的呈现归入 Bech32m 的 v1 程序,地址类型全景见 比特币地址类型是什么?。对钱包和隐私分析的影响是双向的:多方协作在链上更隐身,聚类推断更难,但聚合流程本身要求各方真实在线协作,实施时要先对齐 MuSig 类协议的安全约束。

维度三:批量验证

Schnorr 支持把多笔交易的签名合并成一次数学验证,节点同步区块时,成千上万签名的验证成本显著下降;ECDSA 只能逐笔验。对普通用户,这体现为同步更快、硬件钱包负担更轻;对网络,它给未来的扩容与隐私方案留了余地。Taproot 的脚本路径也统一采用 BIP340 签名(见 BIP341),这意味着多路径合约在链上同样可以表现为“只签了名字”,复杂条件平时不露痕迹,花的时候才展开,这是“先密钥、后脚本”的隐私设计核心,与 UTXO 基础可对照阅读 比特币 UTXO 是什么?和账户模型区别

边界与兼容

Schnorr 并非“更安全的 ECDSA”,两者在私钥泄露面前同样脆弱;它也不是全网络强制——P2PKH、P2WPKH 等老地址仍按 ECDSA 验证,主网长期双语共存。对签名器的要求更严:BIP340 采用确定性或加盐的 nonce 生成策略,实现错误(nonce 重用)仍然会直接泄露私钥,这是工程侧不能省事的红线。理解差异即可开始读 BIP340 原文,公式不多,语义清晰。

本文讨论协议与密码学机制,不构成投资建议。

签名之外:Taproot 输出还改了什么

容易被忽略的是 Taproot 输出把公钥或脚本哈希统一成 32 字节的承诺:地址里只放一个承诺值,密钥路径与脚本路径共享同一个外观。花费时走密钥路径,链上只见一个普通 Schnorr 签名,围观者无法知道你原本是否预留过退款脚本;走脚本路径才展开被执行的分支。这个“默认隐身、按需展开”的结构把多签、时间锁等复杂条件的链上足迹压到最小,也解释了为什么 BIP340 的 x-only 公钥设计如此执着于省掉那一个字节——承诺值与签名的每个字节都在为隐私和验证效率服务。再往工程侧看,节点验证 v1 输出时按新规则解释见证结构,老节点会把 v1 程序当作Anyone-can-spend 而依赖全验证节点的保护,所以升级窗口期内运行新版本全节点始终是参与共识的正确姿势。

边界条件值得单列。其一,签名方案再优雅,也救不了随机数管理失误:两次签名复用同一 nonce,私钥就能从两个签名的差值中直接解出,这是 BIP340 与 ECDSA 共享的古老死穴,选择设备时要把“确定性 nonce 实现与审计记录”列为硬指标。其二,批量验证是验证侧优化,受益前提是节点按新规则执行验证;轻钱包与中继服务仍须逐笔核对语义。其三,x-only 公钥要求签名器内部处理奇偶选择,派生工具与固件若不支持该约定就无法参与 v1 输出的密钥路径花费,接入旧硬件前先查厂商对 BIP340 的支持公告。