转自:火币研究院本报告由火币区块链研究院出品报告发布时间2020年10月30日作者:袁煜明、马天元、赵文琦、陈乐
摘要:
10月15日,比特币核心开发者Pieter Wuille主导的3个提案(BIP340-342)的代码正式合入比特币代码的主分支[1]。三个提案分别包含了Schnorr,Taproot和Tapscript的内容。社区评价这次变更为隔离见证之后比特币上最大的技术更新。
Schnorr签名主要的目标是取代目前比特币现行的ECDSA签名。相比于比特币区块链目前采用的ECDSA,Schnorr具有一些优势:
(1)签名安全性高,其安全性可被数学证明,并具有不可延展性;
(2)签名可为多重签名的参与方提供隐私保护;
(3)签名的线性特征,可作为Taproot等技术的基础,进一步加强交易的隐私性;
(4)签名长度更短,且可聚合多签,能节省存储空间,实现变相比特币扩容;
(5)签名可批量验证,从而提高验证效率;
不过,它也有一些不足之处,在于:
(1)用户在使用前需要多轮交互;
(2)签名会消耗一些额外带宽和计算资源;
(3)签名对随机数的随机性要求非常高。
作为一项可能会替代椭圆加密算法ECDSA签名机制的技术更新,Schnorr签名是比特币底层技术开发的重要里程碑之一。此次代码加入后,意味着这项技术已经基本成型,接下来需要等待社区确定软分叉的正式激活时间,不过此时间点目前尚未有定论。
1.背景介绍
Schnorr签名机制最初由德国密码学家、数学家Claus-PeterSchnorr发明(见图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 secp256k1[2]、BIP 341:Taproot:SegWitversion 1 spending rules[3]、BIP 342: Validation of Taproot Scripts[4]。其中,第一个提案就是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签名技术被证明在数学上是安全的[5-6]。对于比特币这样高度依赖安全性的加密货币来说,能够证明安全性的技术肯定要比实践中暂未出现问题的技术更让人放心。同时,对于比特币来说,更重要的是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 ImprovementProposals),通常来说,它包括对比特币底层区块链技术更新、新特性引入和信息补充等。自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等学者的数学证明下[5-6],我们知道,在随机预言模型中,假设椭圆曲线离散对数问题很困难,想要突破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个公钥,这样可以大大减少多签在区块中占据的空间。
上图(图5)为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签名能为比特币以及区块链世界,带来更多新鲜技术活力。
本文链接:https://www.8btc.com/article/663419转载请注明文章出处
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。