-
更安全:在随机预言模中很容易证明 Schnorr 签名的安全性,而 ECDSA 不存在这样的证明。 -
无延展性困扰:ECDSA签名是可延展性的,第三方无需知道私钥,可以直接修改既有签名,依然能够保持该签名对于此交易是有效的。比特币一直存在延展性攻击,直到SegWit激活后才修复,前提是使用segwit交易,而不是传统交易。BIP62 和 BIP66 对此有详细描述。 -
线性:Schnorr签名算法是线性的!以这一特性作为基础,可以构建更高效和隐私性更强的区块链系统。使用 Schnorr 签名的各方可以生成对其各自密钥的签名聚合。例如,N个公钥进行签名,采用ECDSA的话,则有N个签名,验证同样需要做N次。若使用Schnorr,由于线性特性,则可以进行签名叠加,仅保留最终的叠加签名。例如同一个交易无论输入数量多少,其均可叠加为一个签名,一次验证即可。
QAMPLA
A: 当然可以。多重签名只是m of n的签名数量的模式。与签名算法无关。
A: 无法做到。组内有N把公钥,则必须对应有N个签名,缺一不可。每个人在生成签名的时候,在哈希函数里都代入的都是组公钥P。
A: 主要取决于两个:1. 签名算法本身 2. 椭圆曲线。目前,Schnorr与ECDSA都用的是曲线secp256k1,这个层面一样。至于签名算法本身安全性,Schnorr目前有安全证明,安全优于ECDSA。
- 提高签名数据的有效性:
由于签名是64字节的数据,与通常的70字节相比,交易可以减少4%的字节,该功能基本上提高了每笔比特币现金交易所需的签名数据的有效性(通过Schnorr签名将使区块链存储和带宽减少至少25%,使BCH网络更快,更加高效)。并且升级后,Schnorr签名给BCH带来隐藏普通支付渠道的能力。
- 隐私性的提升:
在升级之前很多用户就会故意使用多个签名来发送交易来提高隐私,而Schnorr签名会使所有用户的签名看起来和任何其他签名一样,这种结构导致了交易隐私性的大幅提升。Schnorr提供的属性以及BCH开发人员和基础设施提供商(如钱包)添加的一些延展程序将进一步增强隐私和可扩展性。
- 对抗垃圾交易攻击:
在过去曾出现一种垃圾交易攻击,攻击者希望通过尽可能多的交易空间来使比特币拥堵,他们的手段之一就是通过频繁地从多个来源发送交易使这个交易中包括数十个签名,这些签名占据了很多的空间,这是ECDSA签名留下的隐患。
Schnorr可以规避这类的垃圾交易攻击。如果每一笔交易只有一个签名,那么区块就能容纳更多交易,垃圾交易制造者要想制造攻击就必须发送更多交易,与更多人进行竞争,因此攻击成本就会相对更高。签名所占空间通常是一笔交易知名的一部分,所以攻击者不具优势。
下面来简单科普一下几种算法:
椭圆曲线数字签名算法(ECDSA,Elliptic Curve Digital Signature Algorithm)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟(椭圆曲线密码(ECC)由Neal Koblitz和Victor Miller于1985年发明),ECDSA首先由Scott和Vanstone在1992年为了响应NIST对数字签名标准(DSS)的要求而提出。
比特币目前使用的是 ECDSA 椭圆曲线数字签名算法,要对消息 m 进行签名,我们需对其进行哈希操作,并将此哈希视为一个数字:z = hash(m)。我们还需要一个随机或随机查找的数字 k。我们不喜欢信任随机数生成器(存在太多的故障,很多漏洞与糟糕的 RGN 有关),因此,我们通常会使用RFC6979,并根据我们的秘密和我们要签名的消息,计算确定性 K 值。
使用私钥 pk,我们可以为包含两个数字的消息 m 生成签名:r (随机点 R 的 x 坐标 = k×G) 和 s = (z+r⋅pk)/k。然后,使用我们的公钥 P = pk×G,任何人都可通过检查点 (z/s)×G+(r/s)×P 的 x 坐标等于 r,来验证我们的签名。
签名验证包括反转(1/s)和两点乘法,这些操作的计算量非常大。在比特币中,每个节点都必须验证所有交易。这意味着当你广播一笔交易时,数千台计算机将不得不验证你的签名。而简化验证过程将是非常有益的,即使签名过程会更加困难。
第二,每个节点必须分别验证每个签名。如果是 m-of-n 多重签名交易节点,则可能需多次验证相同的签名。例如,具有 7-of-11 多重签名输入的交易将包含 7 个签名,并且需要对网络中的每个节点进行 7-11 次的签名验证。同样,这样的交易会占用大量的空间,你必须为此支付大量的费用。
Schnorr 签名
Schnorr签名算法是由德国数学家、密码学家Claus Schnorr提出。并于1990年申请了专利,U.S. Patent 4,995,082,该专利与2008年2月失效。目前该算法可以自由使用。
Schnorr 签名的生成则略有不同,我们使用了一个点 R 和一个标量 s 来代替两个标量(r,s)。与 ECDSA 相似的是,R 是椭圆曲线(R=K×G)上的一个随机点。签名的第二部分计算略有不同 :
s = k + hash(P,R,m) ⋅ pk. 这里的 pk 是你的私钥,而 P = pk×G 则是你的公钥,m 是消息。然后可通过检查 s×G = R + hash(P,R,m)×P 来验证这个签名。
这个方程是线性的,所以方程可互相加减,并且仍然有效,这就给我们带来了几大关于 Schnorr 签名的好处。
Schnorr 签名的批量验证
要验证比特币区块链中的区块,我们需确保区块中的所有签名都有效。
对于 ECDSA 签名算法,每个签名都必须单独验证。也就是说,如果区块中有 1000 个签名,我们就需要计算 1000 次倒置和 2000 次点乘运算,总共约 3000 次繁重的计算任务。
而通过使用 Schnorr 签名,我们可以将所有签名验证方程相加,从而节省一些算力。对于有 1000 个签名的区块而言,我们需验证:
(s1+s2+…+s1000)×G=(R1+…+R1000)+(hash(P1,R1,m1)×P1+hash(P2,R2,m2)×P2+…+hash(P1000,R1000,m1000)×P1000)
这里我们有一堆加法(在算力上几乎是免费的)以及 1001 次点乘法。我们需要为每个签名计算大约一次繁重的计算。
Schnorr 签名的密钥聚合
我们希望让自己的比特币保持安全,所以我们可能希望使用至少 2 个不同的私钥来控制我们的比特币。比如说一个放在笔记本电脑或手机,另一个则放在硬件钱包 / 冷钱包。因此,当其中一个受到威胁时,我们仍然可以控制我们的比特币。
目前,它是通过 2-of-2 多重签名脚本来实现的,这需要在交易中包含两个单独的签名。而使用 schnorr 签名,我们可以使用一对私钥(pk1,pk2),并生成一个与共享公钥 P=P1+P2=pk1×G+pk2×G 对应的共享签名。要生成这个签名,我们需要在每个设备上选择一个随机数(k1,k2),生成一个随机点 Ri=ki×G,将它们相加以计算一个公共哈希 (P,R1+R2,m),然后从每个设备 (si = ki + hash(P,R,m) ⋅ pki) 中获取 s1 和 s2。然后我们可以将这些签名相加,并使用一对 (R, s) = (R1+R2, s1+s2) 作为我们对共享公钥 p 的签名。其他所有人都无法说出它是否是聚合签名,它看起来与普通 schnorr 签名完全相同。
这种构造有 3 个问题,第一,从用户界面的角度来看,要进行交易,我们需要进行几轮通信,计算公共 R,然后-签名。有了两个私钥,只需一次访问冷钱包就可以完成:我们在在线钱包上准备一个未签名的交易,选择 k1,将 R1=K1×G 与未签名的交易一起记下。然后我们将这些数据传送到冷钱包并签名。因为我们已经有了 R1,所以我们可以一次性在冷钱包上签署交易。从冷钱包中,我们得到了 R2 和 s2,并将其传输回在线钱包。在线钱包使用之前选择的 (k1, R1) 签署交易,结合签名并广播签名交易。这与我们现在的情况非常相似,但一旦添加第三个私钥,一切就会变得更加复杂。比方说,你有一笔财富,它是由 10 个私钥控制的,它们存储在世界各地不同的安全位置,然后,你需要进行一笔交易。目前,你只需要浏览所有这些位置一次,但如果你使用的是密钥聚合,则需要执行两次,以组装所有 RI,然后签名。在这种情况下,**在不进行聚合的情况下保留单独的签名,然后我们就需要 3 轮通信:
-
选择一个随机数 ki 和相应的 Ri=ki×G,然后只告诉每个人其哈希 ti=hash(Ri),这样每个人都可以确定在学习了其他随机数之后你不会改变主意; -
把所有的数字汇总起来,计算出共同的 R; -
签名;
文章链接:https://www.btchangqing.cn/181357.html
更新时间:2021年02月08日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。
要有未来,先把矿工养好
比特币牛 逼比特币
区块链真好。。。。。。。。。
10年后,比特币1000000?
帮你项项吧区块链
不是吧区块链
这行情,做tc的赚死了。。。
顶也~