协议演进 / BIP/比特币改进提案 / BIP-461

BIP-461 确定性 ECDSA 签名

把 ECDSA 签名定成只由私钥与消息决定的唯一结果:随机数按 RFC 6979 确定性导出,并做 low-r 磨制与 low-s 规范化,签名至多 70 字节。本 BIP 目前处于草案状态。

一、档案卡

档案卡
编号BIP-461
标题Deterministic ECDSA Signatures
作者Liam Gilligan <[email protected]>
指定日期2026-08-12
讨论日期2026-06-09
层级Applications(应用)
类型Specification(规范类)
状态Draft(草案)
阅读版https://bips.dev/461
官方原文https://github.com/bitcoin/bips/blob/master/bip-0461.md

二、放在哪一族

签名算法族,管的是 ECDSA 这条老线——即 Taproot 之前比特币一直使用的签名方案(Schnorr 签名见 BIP-340,只用于 Taproot)。

它不改验证规则,只规范签名者一侧如何生成签名,与几个既有文档相邻:BIP-66 规定了链上 ECDSA 签名必须采用的严格 DER 编码,本提案的字节数讨论正以该编码为前提;随机数的确定性导出直接采用 IETF 的 RFC 6979,这是 libsecp256k1 的默认随机数函数、也是 Bitcoin Core 显式请求的函数(原文脚注语)。可以说,本提案是把 Bitcoin Core 与 libsecp256k1 中已经存在的确定性签名、低 r 磨制等实践,写成一份可供任何实现逐字对照、可供不同签名器互相校验的正式规范。

三、它要解决什么

在现行共识规则下,一条 ECDSA 签名有两个自由度:签名者自由选择随机数(nonce)k,由此定下 r;给定 r 后,s 又有两个互补的合法取值。一个作恶的签名者(例如被植入后门的签名设备固件)可以利用这份自由,把密钥材料藏进看似正常的签名里——原文脚注点名的 Dark Skippy 就是这类手法:恶意固件把种子材料编码进随机数,攻击者只要在链上收集到这些签名,就能恢复出种子。

随机或各行其是的签名算法堵不上这个洞,因为没有对照标准:你无法证明某个签名“本不该长这样”。

确定的、标准化的算法把自由度清零,泄漏随之变成可检测的行为:把同一把私钥装进两个独立实现的签名器,对同一条消息各签一次,结果应当逐字节相同;一旦不同,就证明至少有一个签名器没有按规范行事。原文强调,正是“标准化”使这种交叉核对成为可能——非标准算法没有第二个实现可供比对。

附带的收益是体积:规范同时强制 low-r 与 low-s 后,DER 编码的签名至多 70 字节(带签名哈希标志 71 字节),而任意合法 ECDSA 签名的上限是 72 字节(带标志 73 字节)。

四、规则本身

4.1 定义

设 n 为 secp256k1 曲线阶,半阶(half curve order)为 (n − 1) / 2。

4.2 随机数导出:nonce_rfc6979

输入私钥 sk(32 字节)、消息哈希 msghash(32 字节)、附加数据 extra(可为空)与尝试计数 count(≥ 0)。算法按 RFC 6979 第 3.2 节的 HMAC-SHA256 发生器执行:先把 msghash 按模 n 约减为 h(即 RFC 6979 的 bits2octets),以 V 全为 0x01、K 全为 0x00 起步,依次把 sk、h、extra 喂入 HMAC 更新 K 与 V;count 每增加一次,就再多绕发生器一轮,最后输出 V 作为随机数候选。

两个计数不要混淆:count 是 RFC 6979 发生器内部的重试计数,候选随机数越界或算出的 r、s 为零时递增,实践中几乎恒为 0;4.4 中的磨制计数 i 则是整条签名层面的重试,二者相互独立。

4.3 基本签名与验证:sign 与 verify

sign(sk, msghash, extra):取 d = int(sk),d 为 0 或不小于 n 则失败;对 count = 0, 1, … 依次导出随机数 k,k 越界则跳过;算 R = k·G、r = x(R) mod n,r 为 0 则跳过;算 s = k⁻¹ · (d · r + int(msghash)) mod n,s 为 0 则跳过;返回 (r, s)。

verify(sig, P, msghash) 就是标准 ECDSA 验证:检查公钥点在曲线上且非无穷远,r、s 在 (0, n) 内,再以 w = s⁻¹、u1 = w · int(msghash)、u2 = w · r 算 R = u1·G + u2·P,要求 R 非无穷远且 x(R) mod n = r。本提案没有改动验证的任何一步。

4.4 确定性签名:DeterministicSign

输入只有私钥与消息哈希,输出被完全确定:

  1. 私钥越界(为 0 或 ≥ n)则失败;
  2. 以 extra 为空调用 sign,得 (r, s);这是磨制计数 i = 0 的一签;
  3. 当 r ≥ 2^255(即非 low-r)时循环:第 i 次重试取 extra = bytes_le(4, i) ‖ 28 字节零(i 以 4 字节小端编码写入 32 字节缓冲,其余补零,此细节源自 Bitcoin Core 的既有写法),重新调用 sign,i 加一;i 达到 2^32 则失败(实践中不可能);
  4. 若 s > 半阶,令 s = n − s(low-s 规范化);
  5. 返回前用 verify 自验一遍 (r, s),验不过则中止——防止计算故障产生可能泄露私钥信息的无效签名(原文注明此步效仿 BIP-340,可因成本省略,不影响测试向量与互操作);
  6. 返回 (r, s)。

因为 low-r 出现的概率约为二分之一,磨制平均只需约两次签名运算,代价很低。

4.5 为什么选这套磨法

为什么用 RFC 6979:磨制要求随机数导出既由私钥与消息确定、又能接受一个计数器以便为同一消息派生新的无关随机数。RFC 6979 正是 IETF 为 ECDSA 制定的确定性随机数标准,其第 3.6 节明确允许附加数据输入,并举例说可以用签名计数器;不重复的附加数据足以保证各次随机数在密码学上互不相关。

为什么不用每次随机取数:随机取数也能磨出 low-r,但结果不可复现,第 3 节的交叉核对防线就此失效,泄漏检测无从谈起。原文承认随机性对故障注入有一定防护(BIP-340 对 Schnorr 签名即有此类建议),但 ECDSA 在比特币中的既成实践是确定性导出。

为什么不磨得更小:要让 r 再省出一整个字节,须令其高 9 位全为零,平均需约 512 次签名运算,太贵;且做的人少,反而会在链上暴露身份。原文同理否决了用 secp256k1 的 λ 自同态加速磨制的建议:本来平均只多算一次点乘,自同态省不下多少,却徒增复杂度。

体积账:对比只做 low-s 规范化、不磨制的签名器,low-r 磨制在旧式输入中平均每签名省 0.5 虚拟字节,SegWit v0 输入省 0.125 虚拟字节,2-of-3 P2SH 输入平均省 2.5 虚拟字节(单个 high-r 签名会把输入脚本长度前缀从 1 字节撑到 3 字节)。原文还指出,即便不看省费,统一磨制也值得:不磨制的签名器会因其 high-r 签名在链上可被识别。

五、谁必须动

普通持币人:无需任何操作,地址与交易格式不变。真正的受益方式是制衡签名设备:同一私钥在两个独立签名器上对同一消息签名,结果应当一致,不一致即说明至少一方未按规范行事。

钱包与签名设备开发者:需要按 4.2–4.4 逐字实现随机数导出、磨制循环的 extra 构造、low-s 规范化与返回前自验,并用原文测试向量自查。任何一步的字节级偏差都会使签名与其它实现对不上,交叉核对随之失效。

全节点与矿工:无事可做。按本规范生成的签名是普通合法签名,验证路径与共识规则毫无变化。

共识层:零改动。原文的向后兼容一节只有一句结论:本规范生成的签名能在现行共识规则下通过验证,完全向后兼容。反过来,不按本规范签出的签名在共识层面依然合法——规范约束的是签名者的行为,不是验证者的判定。

六、现在算不算数,以及一个常见误读

状态为 Draft(草案)。它是一份签名者侧的行为规范草案:不设激活、不改共识,测试向量与参考算法以原文为准。原文脚注显示,其核心构件并非新发明——RFC 6979 已是 libsecp256k1 的默认随机数函数,Bitcoin Core 亦显式请求之,low-r 磨制早在 Bitcoin Core v0.17.0(PR #13666)即已引入。本提案的增量在于把这些实践收束为一份统一、可交叉核对的规范,并把 low-r 磨制的附加数据构造等细节定死。至于其它钱包与签名设备是否已按全规范实现,原文没有统计,本页不臆测。

常见误读:

“确定性签名是一种新的签名格式,不按它签的交易会被网络拒绝。”

不对。验证规则一个字没改:DeterministicSign 的输出就是普通 ECDSA 签名,与随机签名在验证者眼中毫无区别,不存在“新格式”或版本切换。high-r 签名也从不是无效签名——原文脚注仅提到 high-s 交易因现行标准性策略不被默认中继,那是策略而非共识。本提案的约束力来自可复现性:同一私钥、同一消息只应有一种正确输出,偏离者会在双签名器核对中现形,而不是在链上被拒。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。