风险提示
风险提示: 律动 BlockBeats 提醒,根据银保监会等五部门于 2018 年 8 月发布《关于防范以「虚拟货币」「区块链」名义进行非法集资的风险提示》的文件,请广大公众理性看待区块链,不要盲目相信天花乱坠的承诺,树立正确的货币观念和投资理念,切实提高风险意识;对发现的违法犯罪线索,可积极向有关部门举报反映。或联系律动tousu@theblockbeats.com。
举报
简体中文 繁体中文
English(Google translation)
登录/注册
热门排行
热门搜索
没有找到搜索内容
查看更多
比特币签名的演变
科普 2020年11月22日 21:20
一文了解ECDSA和Schnorr
原文标题:《他山之石丨硬核讲解比特币签名如何一步步缩短》
原文编译:币安区块链研究院


数字签名是比特币协议中的重要构件,占区块链上存储数据的很大一部分。这篇文章详细介绍了已编码的椭圆曲线数字签名算法(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 库中这一特性发生变化时,会导致一些使用较新 OpenSSL 版本的节点拒绝来自使用旧版本库的节点的链。为此,BIP-66 提出了一个软分叉(Soft fork)的提案,只有严格遵循 DER 编码的签名才会被接受。


一个 DER 编码的 ECDSA 签名以一个 0x30 标识符开始,标识一个复合结构。接下来是一个长度字节,表示结构的长度,然后是复合结构本身。复合结构包含 r 和 s 的整数值,这些值用会将用来表示整数的 0x02 标识符放在开头,后面是一个长度字节,定义各自的值的长度。



比特币中 DER 编码的数字签名格式


然而 ANS.1 编码规则中使用的是有符号整数(Signed),而 ECDSA 中的 r 值和 s 值是无符号整数(Unsigned),因此当 r 值或 s 值的第一个比特被设置为 1 时数值会被错误的判断。为了解决这个问题,在数值前加上了一个 0x00 字节,让无符号整数被编码为一个正整数。在原始的 r 值与 s 值中,若第一个比特为 1 则我们称它为高的,否则被称为低的。



由高的 r 与高的 s 所组成的 73 字节比特币 ECDSA 签名


r 值和 s 值的产生是随机的,当两个值都为高时(两个值的第一个比特都为 1),它们都需要在开头加上一个 0x00 字节。加上了两个额外的字节以及 SigHash 标志,签名的总长度为 73 字节。可以发现到在同一个签名中,r 与 s 两个值都为高的概率是 25%。直到 2014 年初,在比特币区块链上的签名可以观察到大约 25% 为 73 字节、50% 为 72 字节和大约 25% 为 71 字节的分布。在 72 字节的签名中,两个值中一个是高的,另一个是低的,而在 71 字节的签名中,两个值都是低的。


2014 年 3 月 Bitcoin Core v0.9.0 发布后,具有高 s 值的签名比例开始减少。这个版本包含了对 Bitcoin Core 钱包的修改,让钱包只创建低 s 值的签名。随着 2015 年 10 月 Bitcoin Core v0.10.3 和 v0.11.1 的发布,高 s 值的签名被认定为非标准签名,以彻底消除可变动性向量。这就禁止了高 s 值的交易被转发或用于挖矿。从 2015 年 12 月开始,在比特币区块链上几乎所有交易的签名中的 s 值都为低的。



由高的 r 与低的 s 所组成的 72 字节比特币 ECDSA 签名


2015 年 12 月至 2018 年初,区块链上的签名几乎平均长度在 72 和 71 字节之间。72 字节的签名中有一个高的 r 值和一个低的 s 值,并且需要一个预置的 0x00 字节。而 71 字节的签名是由低的 r 值和低的 s 值组成。


2017 年 8 月底,隔离见证(Segwit)软分叉激活。隔离见证将包含签名等内容的 SigScript 移入 Witness 栏位中。虽然在计算交易的大小时,隔离见证交易的签名将不列入计算,但区块链上的签名大小实际上是不变的。



由低的 r 与低的 s 所组成的 71 字节比特币 ECDSA 签名


2018 年 10 月发布的 Bitcoin Core v0.17.0 版本包含了对 Bitcoin Core 钱包的改进,只产生 71 字节的签名。通过用不同的 nonce 重新签署交易,可以产生新的 r 值,直到找到一个低的 r 值。该技术已被其他项目采用,如 NBitcoin 库和 Electrum 比特币钱包。


Schnorr 签名


BIP-340 为比特币引入了 Schnorr 签名,而 BIP-341 提出了基于 Schnorr 签名、Taproot 和 Merkle 分支的第一个版本的 SegWit 输出类型及其支出规则。与 ECDSA 签名不同的地方是,Schnorr 签名不是 DER 编码的。



Schnorr 签名的格式


Schnorr 签名包含 32 字节的 r 值和 32 字节的 s 值。最常用的 SigHash 标志 SIGHASH_ALL 是默认的,不需要明确设置,而其他的 SigHash 标志被放在 s 值之后。使用默认 SIGHASH_ALL 标志的 Schnorr 签名的长度正好是 64 个字节,使用不同的 SigHash 标志的签名长度则为 65 字节。



一个 64 字节的 SIGHASH_ALL 比特币 Schnorr 签名


与 ECDSA 签名相比,Schnorr 签名缩短了 6 到 9 个字节。这些节省来自于被移除的编码开销和默认的 SigHash 标志。在 Schnorr 签名采用率为 20% 的情况下,假设每天花费的 800,000 个 UTXO input 中都只包含一个签名,那么每天可以节省 1MB 以上的区块链空间。


相关阅读


-A Layman』s Guide to a Subset of ASN.1, BER, and DER - An RSA Laboratories Technical Note - 1993


-Create the shortest transaction - Eternity Wall Blog - 2017


-Exact probabilities of obtaining a DER encoded signature of a certain length - Eternity Wall Blog


原文链接




比特币比特币签名

科普

学习,从这里开始

扫码下载律动APP

专业区块链研究机构 与资讯平台