1. 首页
  2. 区块链资讯

他山之石丨硬核讲解比特币签名如何一步步缩短

手艺的突破是推动区块链行业前进的引擎,币安中国区块链研究院与链闻 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 字节)的整数。

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 值都为低的。

慢雾:攻击者利用 Pickle Finance 合约漏洞「假钱换真钱」

链闻消息,慢雾安全团队针对以太坊 DeFi 项目 Pickle Finance 遭受攻击,损失约 2000 万 DAI 分析称,攻击者通过调用 Controller 合约中的 swapExactJarForJar 函数时,伪造 _fromJar 和 _toJar 的合约地址,通…安全,DeFi,Pickle Finance

他山之石丨硬核讲解比特币签名如何一步步缩短由高的 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

泉源链接:b10c.me

原创文章,作者:链大大,如若转载,请注明出处:http://www.chaindada.com/chain/25579.html