时间:2023-08-25|浏览:191
本文介绍了BIP-340提议使用的Schnorr签名与ECDSA签名相比,能够缩短6至9个字节,从而节省更多的区块链存储空间。
撰文:0xB10C,比特币开发者 翻译:ChenBoYu、HsuTzuHsiu
数字签名是比特币协议中的重要组成部分,占据了区块链存储数据的一大部分。本文详细介绍了已编码的椭圆曲线数字签名算法(ECDSA)签名大小在过去几年持续降低的情况,并对新提出的Schnorr签名与目前使用的ECDSA签名的长度进行了比较。
在比特币协议中,没有使用隔离见证(Segwit)的交易,数字签名存放在UTXO中input的SigScript栏位;而使用隔离见证的交易则会存放在Witness栏位。一个数字签名由编码过的r和s值以及说明哪一部分交易进行了签名的SigHash标志组成,其中r和s值都是256比特(32字节)的整数。
DER编码的ECDSA签名 比特币客户端一直依靠OpenSSL进行签名验证和编码。ECDSA签名采用了ANS.1编码规则中定义的唯一编码规则(DER)。虽然DER编码只允许一种唯一的方式来表示签名的字节序列,但OpenSSL库会将由DER标准衍生的其他编码同样视为有效。当OpenSSL库实现发生变化时,会导致一些节点拒绝来自使用旧版本库的节点的链接。因此,BIP-66提出了一个软分叉(Softfork)提案,只有严格遵循DER编码的签名才会被接受。
一个DER编码的ECDSA签名以一个0x30标识符开始,表示一个复合结构。接下来是一个长度字节,表示结构的长度,然后是复合结构本身。复合结构包含r和s的整数值,这些值用0x02标识符表示整数,并在后面跟随一个长度字节,定义各自的值的长度。
然而,ANS.1编码规则使用有符号整数(Signed),而ECDSA的r值和s值是无符号整数(Unsigned)。因此,当r值或s值的第一个比特为1时,会错误地判断数值。为了解决这个问题,我们在数值前加上了一个0x00字节,将无符号整数编码为正整数。在原始的r值与s值中,若第一个比特为1,则称其为高的,否则称其为低的。r值和s值的生成是随机的,在两个值都为高的情况下(两个值的第一个比特都为1),它们都需要在开头加上一个0x00字节。加上了两个额外的字节以及SigHash标志,签名的总长度为73字节。可以发现,对于同一个签名,r和s两个值都为高的概率是25%。直到2014年初,在比特币区块链上的签名中,大约25%为73字节、50%为72字节,大约25%为71字节。2014年3月Bitcoin Core v0.9.0发布后,具有高s值的签名比例开始减少。随着2015年10月Bitcoin Core v0.10.3和v0.11.1的发布,高s值的签名被认定为非标准,以消除可变动性向量。从2015年12月开始,几乎所有交易的签名中的s值都为低的。2018年10月发布的Bitcoin Core v0.17.0版本包含对Bitcoin Core钱包的改进,只产生71字节的签名。通过使用不同的nonce - ALaymansGuidetoaSubsetofASN.1,BER,andDER-AnRSALaboratoriesTechnicalNote-1993 - Createtheshortesttransaction-EternityWallBlog-2017 - ExactprobabilitiesofobtainingaDERencodedsignatureofacertainlength-EternityWallBlog
用戶喜愛的交易所
已有账号登陆后会弹出下载