区块链知识:Schnorr签名如何提高比特币?
在看Blockstream写的MuSig论文时,我一直在想象这对我这个比特币用户意味着什么。我发现Schnorr'的签名真的很棒,很方便。,但是有些功能很讨厌。在下面这篇文章里,我希望和你分享我的想法。然而,让';让我们先快速复习一下。
目前比特币的所有权体系使用ECDSA(椭圆曲线签名算法)。签署消息$m$时让';s先哈希这条消息,得到一个哈希值,也就是$z=hash(m)$。我们还需要一个随机数(或者至少是一个看似随机的数)$k$。这里我们不';t不想信任随机数生成器(太多的错误和漏洞都与不合格的随机数生成器有关),所以我们通常使用RFC6979,根据一个我们知道的秘密值和我们想要签名的消息计算出一个确定性的k。
使用私钥$pk$我们可以为消息$m$生成一个签名,签名由两个数字组成:$r$(随机点的x坐标$R=k*G$)和$s=(zr*pk)/k$。
然后有了我们的公钥$P=pk*G$,任何人都可以验证我们的签名,即检查$(z/s)G(r/s)P$的x坐标确实是$r$。
– ECDSA 算法图解。为便于说明椭圆曲线是在实数域上做的——
这个算法很常见,非常好用。但仍有改进的余地。首先,签名验证包括除法($1/s$)和两次点乘,这些运算的计算量非常大。在比特币网络中,每个节点都要验证每一笔交易,所以当你在网络中发送一笔交易时,整个网络中成千上万的节点都要验证你的签名。所以,即使签名的过程开销变大,让验证签名变得更容易仍然是非常有益的。第二,当节点验证签名时,应该单独验证每个签名。在m-n多重签名事务中,节点必须多次验证同一个签名。例如,7-11多重签名交易包含七个签名,并且网络中的每个节点必须分别验证这七个签名。。另外,这个交易量也很大,用户必须为此支付多得多的手续费。
Schnorr签名的生成方式略有不同。它不是两个标量$(r,s)$,而是一个点$R$和一个标量$s$。。类似于ECDSA签名,R是椭圆曲线上的随机点$R=k*G$。签名S的第二部分的计算过程也有些不同:$S=KHASH(P,R,M)PK$。这里pk是你的私钥,$P=pk*G$是你的公钥,M是消息。验证过程是检查$s*G=Rhash(P,R,m)*P$。
-图解Schnorr'的签名和验证-
这个方程是线性的,因此可以对多个方程进行加减运算,等号仍然成立。这给我们带来了Schnorr签名的很多好的特性。
验证区块链中的块时,我们需要验证块中所有事务的签名是否有效。如果其中一个无效,无论哪一个都是——,我们必须拒绝整个区块。ECDSA的每个签名都必须经过特别验证。,也就是说如果一个块包含1000个签名,那么我们需要计算1000次除法和2000次点乘,总计约3000次重运算。
但带有Schnorr签名。我们可以把所有的签名验证方程加起来,节省一些计算。在包含1000个事务的块中,我们可以验证:
$(S1S2…s1000)G=(R1…r1000)(哈希(P1,R1,m1)P1哈希(P2,R2,m2)P2…哈希(P1000,r1000,m1000)P1000)$
这里是一系列的点加法(从计算机操作的角度来看,几乎是免费的)和1001点乘法。性能几乎提高了3倍。验证时每个签名只需要重新计算一次。
– 两个签名的批量验证。因为验证方程是线性相加的,只要所有签名都有效,这些方程的和方程也将成立。我们节省了一些计算,因为标量和点加法比点乘法更容易计算。
我们希望安全地保存我们的比特币。所以我们可能要用至少两个不同的私钥来控制比特币。一个用在笔记本电脑或手机上(在线钱包、热钱包),一个放在硬件钱包/冷钱包里。即使其中一个被泄露,我们仍然控制着自己的比特币。
目前这种钱包是通过2-2多重签名脚本发行的。也就是说,一个事务需要包含两个独立的签名。
使用Schnorr签名,我们可以使用一对密钥(pk1,pk2)。并使用共享公钥$P=P1P2=pk1*Gpk2*G$来生成公共签名。在生成签名时,我们需要在两台设备上分别生成一个随机数(k1,k2)。并生成两个随机点$Ri=ki*G$,然后分别加上$hash(P,R1R2,m)$即可。,可以得到s1和s2(因为$si=kihash(P,R,m)*pki$)。最后,将它们相加得到签名$(R,s)=(R1R2,s1s2)$这是我们的共享签名,可以用共享公钥验证。其他人可以';我根本看不出这是否是一个聚合签名。它看起来就像一个普通的Schnorr签名。然而,这种方法有三个问题。
第一个问题在UI上。为了发起一个事务,我们需要在两个设备上发起多轮交互。在两个私钥的情况下,我们只需要访问一次冷钱包:我们可以在热钱包中准备要签名的交易。,选择k1并生成$R1=k1*G$,然后将待签名的交易连同这些数据一起发送到冷钱包并签名。因为R1已经有了,在冰冷的钱包里只需一个回合就能完成签名交易。我们从冰冷的钱包里找到了R2和s2。,又回到了热钱包。热钱包使用前述的(k1,R1)签名交易,并且该交易可以通过将两个签名相加而向外广播。
这和我们现在在经验上能做的没什么区别,每多加一个私钥,问题就变得更复杂。。假设你有一笔财富,由10个私钥控制,10个私钥存放在世界不同的地方。你这时候发交易多麻烦啊!在当前的ECDSA算法中,你只需要访问每个设备一次。但是,如果你用Schnorr'的密钥聚合,您需要得到所有的ri并对它们进行两次签名。在这种情况下,可以不使用聚合,但最好是分别对每个私钥进行签名,这样只需要一轮交互。
文章写完,我得到了ManuDrijvers的反馈:在一个可证明安全的多重签名方案中,你需要三轮交互:
选择一个随机数ki和对应的随机点RI=Ki*G。然后告诉每个设备Ri的哈希值是ti=hash(Ri),然后每个设备就可以保证你不';了解别人之后,不要改变你的想法';s随机数,收集所有数Ri,计算公开的R签名
。第二个问题是已知的流氓键攻击。这篇论文解释得非常好,所以我赢了';不要细说。如果你的一个设备被黑客攻击(例如,你的热钱包被劫持),你假装你的公钥是$(P1-P2)$。那么你只需要私钥pk1就可以控制两个私钥共享的资金。一个简单的解决方案是在设置设备时使用私钥对相应的公钥进行签名。还有第三个主要问题。你可以';t符号带有明确的k。。如果您使用确定性K,黑客可以通过简单的攻击获得您的私钥。攻击是这样的:一个黑客入侵了你的笔记本电脑,完全控制了其中一个私钥(比如pk1)。我们认为资金仍然是安全的,因为使用我们的比特币需要pk1和pk2的聚合签名。因此,我们像往常一样启动交易,准备一个待签名和R1的交易,并将其发送到我们的硬件钱包。硬件钱包签名后,它会将(R2,s2)发送回热钱包.热钱包出现错误,无法完成签名和播放。所以我们又试了一次,但这次被黑的电脑使用了另一个随机数,——R1';我们在硬件钱包中签署了相同的交易,并发送(R2,s2')回到被黑的电脑。这次没有下文。——我们所有的比特币都不见了。
在这次攻击中,黑客获得了同一笔交易的两个有效签名:(R1,s1,R2,s2)和(R1';s1',R2,s2').。这个R2是一样的,但是$R=R1R2$和$r'=R1R2$不一样。。这意味着黑客可以计算出我们的第二个私钥:$S2-S2';=(hash(p,R1R2,m)-hash(p,R1';R2,m))pk2$或$pk2=(S2-S2';)/(hash(p,R1R2,m)-hash(p)。。我发现这是键聚合最不方便的地方。——我们每次都要用好随机数发生器,这样才能安全聚合。
MuSig解决了其中一个问题,流氓键攻击将不再起作用。。这里的目标是聚合多方/设置的签名和公钥,但你不';不需要证明你有对应于这些公钥的私钥。
聚合签名对应于聚合公钥。但在MuSig,我们不';不要直接添加所有共同签名者的公钥。而是都乘以一些参数,这样聚合公钥$p=hash(l,p1)p1…hash(l,pn)pn$。在这里,公共数$L=hash(P1,…,Pn)$——是基于所有公钥的。。L的非线性性质阻止攻击者构造特殊的公钥来发起攻击。即使攻击者知道他的$hash(L,Patk)Patk$应该是什么。他可以';不要从中推导出Patk,就像你想从公钥推导出私钥一样。
签名构造的其他过程与上述过程非常相似。当生成签名时每个联合签名者选择一个随机数ki,并与其他人共享$Ri=ki*G$。然后他们把所有的随机点加起来,得到$R=R1…Rn$然后生成签名$si=kihash(p,r,m)hash(l,pi)PKI$。因此,总签名是$(R,s)=(R1…Rn,s1…sn)$而验证签名的方法和之前一样:$sG=Rhash(P,R,m)P$。
您可能已经注意到,MuSig和keyaggregation要求所有签名者对交易进行签名。。但是如果你想做一个2-3多重签名脚本呢?这个时候我们可以使用签名聚合吗,还是必须使用通常的OP_CHECKMULTISIG和单独的签名??(译者';s注:OP_CHECKMULTISIG是比特币验证椭圆曲线多重签名脚本的操作码)
先说答案是可以的,只是协议会略有不同。。我们可以开发一个类似OP_CHECKMULTISIG的操作代码,只需要检查聚合签名是否对应公钥Merkel树中的一个元素。例如
如果我们想用公钥P1、P2和P3组成一个2-3多重签名脚本,我们需要用这些公钥的所有成对组合(P1、P2)、(P2、P3)和(P1、P3)构建一个默克尔树。并在锁脚本中发布默克尔根。
在消费比特币时,我们需要提交一个签名和一个证据,证明这个签名对应的公钥位于这个根所标记的默克尔树中。对于2-3个多签名合同树中只有三个元素,证据只需要两个哈希,我们要用的公钥组合的哈希值,和一个邻居';对于7-11多重签名脚本,公钥组合是11!/7!/4!=330种,证据需要8个哈希值。。一般来说,证据中包含的元素数量大致与多签名密钥的数量成正比,即$log2(n!/m!/(n-m))$.
但与默克尔';的公钥树,我们不';不必局限于m-n多重签名脚本。。我们可以用公钥的任意组合生成一棵树。例如,如果我们有一台笔记本电脑、一部手机、一个硬件钱包和一个助记符,我们就可以构建一棵默克尔树。,允许我们使用笔记本电脑硬件钱包、手机硬件钱包或单独的助记符来使用比特币。。这就是当前OP_CHECKMULTISIG所能';除非你用"IF-Else";流控制来构造更复杂的脚本。
– 聚合公钥的默克尔树。不仅多重签名-
Schnorr签名很棒,它解决了分组验证中的一些计算开销问题,还赋予了我们密钥聚合的能力。后者用起来不方便,但我们反正也不是强迫大家都用。我们仍然可以使用常见的多重签名方案,并使用单个非聚合签名。我可以';迫不及待地使用Schnorr's签名,并希望比特币协议能尽快纳入这个签名方案。
另外,我真的很喜欢MuSig。这是一个优雅的方案,该文件很容易理解。我强烈建议你在业余时间阅读全文。
以上是区块链知识:Schnorr签名如何增强比特币的细节。更多关于Schnorrsignature如何提高比特币的信息,请关注dadaqq.coM其他相关文章(www.dadaqq.coM)!
本站提醒投资有风险,入市需谨慎。此内容不作为投资理财建议。