当前位置:网站首页>为什么 Schnorr 签名被誉为比特币 Segwit 后的最大技术更新

为什么 Schnorr 签名被誉为比特币 Segwit 后的最大技术更新

2020-11-08 11:21:23 osc_cgh49c55

本报告由火币区块链研究院出品   
报告发布时间 2020 年 10 月 30 日  
作者:袁煜明、马天元、赵文琦、陈乐

10 月 15 日,比特币核心开发者 Pieter Wuille 主导的 3 个提案(BIP340-342)的代码正式合入比特币代码的主分支。三个提案分别包含了 Schnorr、Taproot 和 Tapscript 的内容。社区评价这次变更为隔离见证之后比特币上最大的技术更新。

Schnorr 签名主要的目标是取代目前比特币现行的 ECDSA 签名。相比于比特币区块链目前采用的 ECDSA,Schnorr 具有一些优势:

  1. 签名安全性高,其安全性可被数学证明,并具有不可延展性;
  2. 签名可为多重签名的参与方提供隐私保护;
  3. 签名的线性特征,可作为 Taproot 等技术的基础,进一步加强交易的隐私性;
  4. 签名长度更短,且可聚合多签,能节省存储空间,实现变相比特币扩容;
  5. 签名可批量验证,从而提高验证效率;

不过,它也有一些不足之处,在于:

  1. 用户在使用前需要多轮交互;
  2. 签名会消耗一些额外带宽和计算资源;
  3. 签名对随机数的随机性要求非常高。

作为一项可能会替代椭圆加密算法 ECDSA 签名机制的技术更新,Schnorr 签名是比特币底层技术开发的重要里程碑之一。此次代码加入后,意味着这项技术已经基本成型,接下来需要等待社区确定软分叉的正式激活时间,不过此时间点目前尚未有定论。

1 背景介绍

Schnorr 签名机制最初由德国密码学家、数学家 Claus-Peter Schnorr 发明(见图1),Schnorr 数字签名也因他的名字而命名。Schnorr 的安全性基于特定的离散对数问题,长期以安全性和简单性而闻名。但是 Schnorr 为他的签名注册了专利,因此,这项技术虽好,但是很长一段时间内,一些应用无法直接使用它。

直到 2008 年时,Schnorr 签名的专利才过期。同时,业界也没有广泛接受的具体实现方案,所以在同年发布比特币白皮书的中本聪,在当时并没有选择 Schnorr 签名方案,而是选择了当时更为成熟的 ECDSA 签名方案。随着 Schnorr 技术专利的过期,这项技术逐渐落地,在比特币社区 Pieter Wuille 等核心开发者的推动下,社区内开始认真考虑应用 Schnorr 签名替代现行的 ECDSA 签名,并以软分叉的方式进行升级。

在 2018 年 7 月,比特币核心开发者 Pieter Wuille 就提议了升级 Schnorr 的 BIP,随后 Blockstream 和开源社区亦参与了相关开发工作。在比特币正式采用之前,比特币的分叉币 BCH 中已通过硬分叉提前部署了 Schnorr。即在 2019 年 5 月,BCH 就已经将签名方案升级为了 Schnorr 签名。之所以它会被更早激活,主要是因为它是通过硬分叉完成的升级,而比特币不能采用硬分叉的方案,需要更为精巧设计的软分叉方案。

后来,Pieter Wuille 又进一步提出了 Taproot/Schnorr 软分叉升级提案,并于今年 1 月被正式发布,即本文提到的 BIP 340-342。而此次,Schnorr 的升级提案已正式被合并入代码库。一起被合并进 Bitcoin 主干的三个提案分别是 BIP 340:Schnorr Signatures for secp256k1BIP 341:Taproot:SegWitversion 1 spending rulesBIP 342: Validation of Taproot Scripts

其中,第一个提案就是 Schnorr 签名的主提案。Taproot 是默克尔树式的抽象语法树升级,它与 Schnorr 签名一起,将允许比特币以隐私方式执行更多的智能合约脚本;而最后一个提案是在比特币上对前两个提案的补充,主要对原本的比特币脚本进行了升级,以支持 Schnorr 签名、批量验证以及签名哈希等。不过值得注意的是,Schnorr 算法目前仍然没有被业界标准化,此次 BIP 340 的提案采用的 Schnorr 仍然是基于比特币量身定做开发的。

2 Schnorr签名 与 BIP提案

2.1 Schnorr 签名到底是什么?

Schnorr 本质是一种密码学签名技术,我们可以简单理解为,在比特币系统中,Schnorr 将是 ECDSA 的替代升级方案。

ECDSA 的全称是椭圆曲线数字签名算法(EllipticCurve Digital Signature Algorithm)。它在比特币中的作用我们的并不陌生,我们在比特币网络中的每一次签名都用到了 ECDSA 技术。比如说,Alice 想发送一笔交易,必须要让矿工确认只有 Alice 拥有私钥,拥有这笔资产的处置权。因此 Alice 需要用 ECDSA 前去生成一个独一无二且无法被修改的签名,以证明 Alice 拥有私钥,同时确认交易部分的具体金额。而等到 Schnorr 正式激活后,这项工作将由 Schnorr 接替。本过程见图 2。

2.2 为什么我们需要更换签名方案?

在过去的 10 年时间内,ECDSA 运作情况良好,看起来能够胜任这份生成签名的关键性工作。但是有一个问题一直萦绕着 ECDSA,即目前业界暂时没有能够给出一个严谨的数学和密码学证明,来证明 ECDSA 是数学安全的。与之形成对比的是,Schnorr 可以。在满足一定条件的状态下,Schnorr 签名技术被证明在数学上是安全的。对于比特币这样高度依赖安全性的加密货币来说,能够证明安全性的技术肯定要比实践中暂未出现问题的技术更让人放心。

  • DavidPointcheval,Security Arguments for Digital Signatures and Blind Signature
  • YannickSeurin,On the Exact Security of Schnorr-Type Signatures in the Random OracleModel

同时,对于比特币来说,更重要的是 Schnorr 签名具备“线性”的特征,该特征允许将多个用户的公钥通过线性计算聚合成一个公钥,并能生成与之对应的聚合签名。

为什么说“线性”的特性对于当前的比特币来说十分重要呢?ECDSA 本身是不支持多重签名的,比特币现在是通过 P2SH 脚本来处理,但是 P2SH 类的脚本会向网络暴露多签交易的存在并揭示所有的签名者。使用 Schnorr 签名可以将多签聚合为一个签名,增强交易的隐私性,并节省解锁脚本内因多签带来的空间占用,节约宝贵的链上空间,实现变相扩容。整体而言,如果得到广泛普及,有可能能够带来比特币性能 5%~20% 左右提升。

此外,由于签名被聚合成一个,在验签的时候也只需要进行一次验证,这会降低计算的成本。这部分的技术细节我们将在下一章详细讲述。

Schnorr 签名对于比特币来说意义重大,还在于它能成为 Taproot 这类的技术基石。Taproot 也是此次第二个提案 BIP 341 的内容,Taproot 源自于 MAST(Merkelized Abstract Syntax Tree),它可以用基于默克尔树的形式来表达复杂脚本。我们知道,默克尔树的重要特性之一,就在于其可以在不揭示无关分支的真实数据的情况下,快速验证某个节点值的存在性,因此被广泛用于存储区块链中的交易、状态数据等。基于这一特性的 Taproot,可以在不揭示脚本中未被使用到的分支条件情况下,完成脚本的运行。而对比来看,P2SH 则需要揭示出所有的脚本内容。

结合 Schnorr 签名的技术,Taproot 甚至可以实现让一个有复杂脚本的交易(包括闪电网络的交易、多签交易、多判断分支的交易等)看起来就像一个普通的 P2PKH 的交易。支持复杂脚本,保护脚本隐私,不暴露签名者,让一个有复杂判断条件的交易看起来像普通交易一样简单,并且无法从形式上进行区分,这就是 Taproot 与 Schnorr 结合的效果。

2.3 Schnorr 会以什么样形式进行?

和此前众多的 BIP 类似,此次 Schnorr 以软分叉的方式进行。

BIP 的全称是比特币改进提案(Bitcoin Improvement Proposals),通常来说,它包括对比特币底层区块链技术更新、新特性引入和信息补充等。自 2009 年中本聪发布第一版比特币区块链客户端之后,大多数技术更新都以 BIP 形式被添加到比特币技术中。目前,比特币社区已采纳百余个 BIP 提案,比如:隔离见证(BIP 144)、P2SH 多签结构(BIP 49)和助记词(BIP 39)等。

硬分叉和软分叉的区别大家可能并不陌生,在硬分叉中,社区由于对某些特性和技术出现强烈分歧时,会导致主链分成两条链,且新老两类客户端相互不兼容,例如 BTC 和 BCH,BCH 和 BSV 等。而一次软分叉升级中,如 Segwit 升级等,虽然社区可能会有分歧产生,但它仍能保持一条链,新老两类客户端能够在一定程度上兼容。

硬分叉有时会带来社区强烈的动荡,因此比特币社区长期对主动硬分叉升级持保留态度,尽可能地避免通过硬分叉升级。本次比特币的 Schnorr 升级,将会通过软分叉完成,这是它很可能得到社区顺利激活的重要原因。

替换 ECDSA 签名看起来是非常大的变动,为什么 Schnorr 能够通过软分叉完成呢?这要从 Schnorr 本身说起。

Schnorr 的安全性基于一个假设:即某个特定离散对数问题非常难以解决,而且此安全性可通过数学手段证明。换句话说,只要此假设成立,则 Schnorr 签名的难破解性,将等于该离散对数问题的难破解性。

同时,一个椭圆曲线中,也存在和该离散对数非常相似的难题。过去比特币底层区块链技术中的椭圆曲线数字签名算法(ECDSA)的安全性,也基于椭圆曲线离散对数问题(ECDLP)的难解性。

Schnorr 签名仍然利用原来比特币采用的椭圆曲线,不过其采用了一种新的计算方法,由此能够最大程度上和不想升级的版本兼容,实现软分叉升级。

另一方面,Schnorr 对 Segwit 客户端改动非常小,而目前 Segwit 客户端的普及率超过 90%。根据 luke.dashjr 统计,截至 2020 年 10 月,比特币网络节点中超过 90% 的节点已经把客户端更新为 0.16 版本以上,即 Segwit 升级后的版本。Segwit 将签名信息从交易信息中隔离开,并作为单独的结构附加到结尾。因为签名信息只起到验证作用,不影响交易的关键参数:如转账地址、数量等。Schnorr 签名主要影响签名信息,对于升级了 Segwit 特性的客户端来说,Schnorr 签名只涉及到以单独结构附在结尾的签名验证信息,因此影响较小。

综上所述,Schnorr 签名可以以软分叉升级的形式被添加到比特币区块链底层上,无需硬分叉,不会给社区带来分裂。拒绝 Schnorr 签名的客户端仍然可以正常加入网络,完成打包等操作。软分叉作为一种区块链账本的升级手段,虽然实现难度更大,往往需要精巧的设计以绕开某些规则,但是它兼容性更好,不会导致共识分裂,是一种循序渐进的、温和的更新方式。

由于软分叉的温和升级特点,再加上 Schnorr 弊端较小,由核心开发人员(Bitcoin Core)推动,因此它具有较高的激活可能性。

3 Schnorr签名技术细节解析

接下里,让我们对 Schnorr 签名的技术细节进行解析:

3.1 安全性高

Schnorr 签名的安全性从数学上得到了证明,而 ECDSA 暂时还没有被证明。虽然过去很多年以来,ECDSA 一直没有出现安全问题,就好比一座从来没有喷发过的火山,长久沉寂,但是你不知道它会不会有一天突然爆发。而一个得到数学证明的算法一定是要比可能还有“隐患”的算法更加令人信任。

在 David Pointcheval、Yannick Seurin 等学者的数学证明下,我们知道,在随机预言模型中,假设椭圆曲线离散对数问题很困难,想要突破 Schnorr 签名的唯一方法就是解决离散对数问题。

因此从某种程度上来说,Schnorr 签名更加安全,更加可信(trustless)。

此外,Schnorr 签名具有不可延展性,这一特性在与 ECDSA 的对比中能得到充分展现,ECDSA 是一个可延展的签名算法。具体来说,基于 ECDSA 生成的签名,对于一个给定的消息,攻击者在不知道密钥的情况下,可生成同样有效的新签名。比特币上还专门提出了 BIP 146 以应对该问题。但 Schnorr 签名天然具有不可延展性,可以直接规避这一安全问题。

3.2 支持签名的聚合,节省存储空间

签名的聚合,主要指的是对多重签名的聚合。多重签名(简称多签)是 Bitcoin 中的一种控制资金使用权限的技术。例如我们常见的“2 of 3”多签,要求被授权的 3 方中至少要有 2 方对交易进行了签名,这笔资金才能被使用。

例如上面的图 4 就是一笔“2 of 3”多签的输入脚本,可以看到红框中就是 2 个 ECDSA 的签名,有了这 2 个签名,这笔资金就可以被合法的使用。但是 ECDSA 的多签没有对签名做任何的聚合,只是简单的把每个签名都放在输入脚本中,并且 2 个签名者的公钥也需要分别放在输入脚本中。假如有一个“9 of 10”多签,就需要在区块中存放 9 个签名和 9 个公钥,这是很占用空间的。

但如果使用 Schnorr 签名,就可以改善这一问题。Schnorr 签名通过一种叫做密钥聚合(Key Aggregation)的技术,可以将任何一笔“m of n”多签中的 m 个签名聚合为 1 个签名,同时 m 个签名者的公钥也可以聚合为 1 个公钥。无论 m 多大,在输入脚本中都只需要填写 1 个签名和 1 个公钥,这样可以大大减少多签在区块中占据的空间。

 

上图为 Pieter Wuille 对 Bitcoin 历史数据做的一个模拟测算,将 Bitcoin 历史数据中所有的多签都替换成 Schnorr 的聚合签名后,可以显著降低 Bitcoin 区块的存储空间。

上面提到的还只是 Schnorr 聚合签名中的一种,即“对 UTXO 单个输入中的多个签名进行聚合”。事实上,Schnorr 签名还有更强大的功能,可以“对 UTXO 多个输入中的多个签名进行聚合”,从而使整个 UTXO 只有一个 Schnorr 签名。不过这种聚合的前置条件比较苛刻,实施起来比较复杂。

3.3 签名长度更短,节省存储空间

根据 Pieter Wuille 提出的方案,Bitcoin 中使用的 Schnorr 签名算法,公钥的长度为 32 字节,签名长度为 64 字节。而 Bitcoin 目前使用的 ECDSA 签名算法,公钥长度为 33 字节,签名最长会达到 72 字节。Bitcoin 区块寸土寸金,节省一点空间都是意义重大的。

例如图 3 中这笔 2 个输入 2 个输出的 UTXO,其中红框选中的部分就是输入中填入的 ECDSA 签名,长度为 72 字节;之后紧跟的就是 33 字节的公钥。那么采用 Schnorr 签名之后,签名和公钥所占的空间就可以减少为 64 字节和 32 字节。

事实上 Schnorr 签名还有一种变种,可以把签名缩短到 48 字节,但由于不支持批量验证,Pieter Wuille 并不推荐使用。

3.4 更强的隐私保护

Schnorr 可以用于多把密钥聚合成一把,它能让比特币“多重签名”钱包发出的交易只展示聚合后的一把,这令多重钱包更为简洁和隐私。过去,用户基于 ECDSA 签名使用“多重签名”钱包时,因为要展示多把公钥,因此容易被暴露此钱包的多重签名情况。但是如果基于 Schnorr 签名,多把密钥在链下进行聚合,可以让一笔多重签名的交易看起来和正常交易(即单签名交易)无异。

还是上面那个“2 of 3”多签的例子,可以看到提供签名的 2 方的公钥都被暴露出来了,也就是说,哪 2 方参与了多签是公开的。但如果采用 Schnorr 的聚合签名,公钥也被聚合为了 1 个,这样就不会暴露是哪 2 方参与了多签。聚合后的多签甚至和一个正常的“单签”看起来也没有区别,这就意味着外界看来甚至不知道这是一笔多签。这大大保护了多签参与者的隐私。

3.5 签名可批量验证,提高验证效率

Schnorr 签名,由于具有线性性质,天然的就可以支持批量验证。其实原理并不复杂,Schnorr签名的验证过程,就是判断一个等式是否成立。而批量验证,就是当有 n 个这样的等式需要验证,我们可以把它们的左边全部加起来,右边也全部加起来,这样只需要验证一次等式是否成立,就可以判断 n 个签名是不是都合法。

并且原本验证 n 个等式时,计算需要做 n 次乘法,现在可以合并为,只需要做 n-1 次加法和 1 次乘法,大大的提高了验证效率。

Schnorr 签名的这种线性性质是天然具备的,因此即使来自于不同的用户、不同 Tx,甚至不同区块的签名,都可以合在一起进行批量验证。一个新的全节点,在同步区块数据时,需要做大量的验证工作,如果 Bitcoin 采用 Schnorr 签名,通过批量验证就可显著提高全节点的同步速度。

3.6 一些不足之处

前面讲的都是 Schnorr 签名的优势。事实上,带来这些好处也是有代价的。因为 Schnorr 聚合私钥签名的特点,它需要参与方进行多轮交互,这相比过去的 ECDSA 会更麻烦一些。而且它对随机数的要求比较高,必须确保随机数不容易被攻击者猜到,一些传统的伪随机数生成方式不一定适合。同时,PC 计算这些签名和生成随机数的过程还是比较繁琐的,因此也会造成发送交易这一步骤的少许延迟,并要求 PC 消耗更多的计算带宽资源。但是,以目前的技术而言,这些问题都可以在一定程度进行解决和克服。

4 总结

Schnorr 签名相比 ECDSA 更加安全可信,而且还顺便带来了比特币链上空间的扩容,使得比特币性能得到小幅提升,同时,Schnorr 签名还能保护多签、闪电网络等技术的参与方的隐私,结合 Taproot 还能使得更多智能合约脚本得以增加隐私性。

目前来看,提案由 Core 组成员推动,以软分叉方式进行温和升级,未来一段时间顺利激活的概率很大,也期待 Schnorr 签名能为比特币以及区块链世界,带来更多新鲜技术活力。 



版权声明
本文为[osc_cgh49c55]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4380905/blog/4708044