术语表 /交易与手续费
数字签名
又称签名、ECDSA 签名、Digital signature。
- 数字签名是什么?
- 数字签名是用私钥生成的证明,表明授权某笔比特币交易的人掌控着这些币所锁定的密钥,并且交易详情未被篡改。
比特币已不再只使用 ECDSA。以1、3或 bc1q 开头的地址中的币,用71或72字节的 ECDSA 签名解锁;以 bc1p 开头的地址中的币,使用64字节的 Schnorr 签名,自2021年11月起生效。无论哪种方式,签名证明的都是对某个密钥的掌控,而不能证明持有者是谁。
运作方式
生成签名需要三个要素:一个私钥、一个称为 nonce 的一次性随机数,以及按该输入所选标志裁剪后的交易摘要。
结果是在椭圆曲线 secp256k1 上计算得出的一对数字,比特币自首个版本起一直使用这条曲线。验证时使用公钥反向执行同样的运算,节点在脚本操作码 OP_CHECKSIG 中完成这一过程。整个过程中没有任何内容被加密,签名也不会泄露其背后私钥的任何信息。
目前使用的两种方案对这对数字的封装方式不同。ECDSA 签名采用 DER 封装,因此长度是71或72字节而不是固定长度,其最后一个字节根本不属于签名本身:它是说明交易哪些部分被覆盖的标志。BIP340 规定的 Schnorr 签名固定为64字节,没有封装,适用默认值时标志字节完全省略,因此只有签名者想要特殊设置时才会出现65字节。
nonce 是容易出问题的环节。同一个密钥两次使用相同的 nonce,私钥就能用中学代数推算出来,这并非理论上的担忧:2013年8月11日,bitcoin.org 发布了一份公告,说明 Android 的一个缺陷导致受影响手机上的钱包应用生成重复的数值,并因此造成了币被盗。如今钱包根据密钥和消息以确定性方式生成 nonce,ECDSA 遵循 RFC 6979,BIP340 中则有等效规则。
在哪里会遇到它
您发出的每一笔支出都至少包含一个签名。在区块浏览器中,它是隔离见证输入的见证数据中,或传统输入的解锁脚本中那一长串十六进制字符串,ECDSA 签名末尾的 01 是标志,不属于数学运算的一部分。
签名也可以用在交易之外。用某个地址背后的密钥对一条普通消息签名,无需转移一聪,即可证明您掌控该地址,交易所借此核实提币目的地,储备金证明的声明也是这样编制的,点对点交易平台上的卖家则借此表明某个地址确实属于自己。最初的格式只适用于以1开头的地址;BIP322 将消息签名推广到了如今使用的所有地址类型。
每当有人要求您签署某样东西时,这一区别都很重要。签署的消息无法转移币。对交易的签名却可以转移全部的币,而要分辨对方要求的是哪一种,唯一可靠的办法是看硬件钱包的屏幕,而不是网站的页面。
数字签名 vs 签名哈希
签名哈希是输入,签名是输出。钱包先构建一个覆盖交易特定部分的摘要,再对该摘要签名,因此对于摘要未涵盖的部分,签名完全不能说明任何问题。这不是技术细节,而正是 sighash 标志存在的全部原因,也说明了同一笔交易上的两个签名为何可能在保护完全不同的内容。