技术的突破是推动区块链行业前进的引擎,BIAN中国区块链研究院与链闻 ChainNews 同为密切关注区块链与密码学等领域技术发展前沿的组织,故而联合推出「他山之石」专栏,向中文世界读者介绍全球范围最值得关注的区块链技术进展,以及在金融等产业最新的应用分析与动态,以期为中国的区块链行业「攻玉」提供借鉴和思考。

本文介绍了 BIP-340 提议使用的 Schnorr 签名与 ECDSA 签名相比,缩短了 6 到 9 个字节,可节省更多区块链空间

撰文:0xB10C,比特币开发者
翻译:Chen Bo Yu、Hsu Tzu Hsiu

数字签名是比特币协议中的重要构件,占区块链上存储数据的很大一部分。这篇文章详细介绍了已编码的椭圆曲线数字签名算法(ECDSA)签名大小在过去几年中是讲解持续的降低,以及对新提出的 Schnorr 签名与目前使用的 ECDSA 签名的长度进行了比较。

在比特币协议中,没有使用隔离见证 (Segwit)的交易,数字签名存放于 UTXO 中 input 的 SigScript 栏位,而使用隔离见证的交易则会存放于 Witness 栏位。一个数字签名由编码过的 r 和 s 值以及说明了对交易的哪一个部分进行了签名的 SigHash 标志组成,其中 r 和 s 值都是 256 比特(32 字节)的整数。

比特币客户端自第一个版本以来,都是依靠 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 比特币钱包。

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 – 1993Create the shortest transaction – Eternity Wall Blog – 2017Exact probabilities of obtaining a DER encoded signature of a certain length – Eternity Wall Blog

来源链接:b10c.me