快捷搜索:  创意文化园  as  2004  1836  2373  21087  test  1837

新二皇冠最新手机登录(www.9cx.net):一文读懂Schnorr署名若何提升比特币

USDT交易所

www.usdt8.vip),全球頂尖的USDT場外擔保交易平臺。

,

在阅读 Blockstream 撰写的 MuSig 论文时,我一直在想象,这对于我一个比特币用户来说,到底意味着什么。我发现 Schnorr 署名的一些特征着实是异常棒而且便利,但某一些特征则异常烦人。在这篇文章里,我希望能跟列位分享我的想法。不外,我们先快速回首一下。

椭圆曲线署名算法

当前比特币的所有权系统用的是 ECDSA(椭圆曲线署名算法)。在署名一条新闻 m 时,我们先哈希这条新闻,得出一个哈希值,即 z = hash(m) 。我们也需要一个随机数(或者至少看似随机的数)k 。在这里,我们不希望信托随机数天生器(有太多的错误和破绽都与不及格的随机数天生器有关),以是我们通常使用 RFC6979,基于我们所知的一个隐秘值和我们要署名的新闻,盘算出一个确定性的 k。

使用私钥 pk ,我们可以为新闻 m 天生一个署名,署名由两个数组成:r(随机点 R = k * G 的 x 坐标)和 s = (z r*pk)/k。

然后,使用我们的公钥 P = pk * G ,任何人都可以验证我们的署名,也就是检查 (z/s)×G (r/s)×P 的 x 坐标确为 r。

这种算法是很常见的,也异常好用。但另有提升空间。首先,署名的验证包罗除法(1/s)和两次点乘法,而这些操作的盘算量都异常大。在比特币网络中,每个节点都要验证每一笔生意,以是当你在网络中发出一笔生意时,全网几千个节点都要验证你的署名。因此,纵然署名的历程开销变得更大,让验证署名变得更简朴也照样异常有利益的。

其次,节点在验证署名时,每个署名都要单独验证。在一个 m-n 的多签生意中,节点必须多次验证统一个署名。好比一笔 7-11 的多署名生意,内里包罗了 7 个署名,网络中的每个节点都要划分验证 7 个署名。另外,这种生意的体积也异常大,用户必须为此支出多得多的手续费。

Schnorr 署名

Schnorr 署名的天生方式有些许差异。它不是两个标量 (r, s),而是一个点 R 和一个标量 s 。类似于 ECDSA 署名,R 是一个椭圆曲线上的随机点 R = k * G。而署名的第二部门 s 的盘算历程也有一些差异: s = k hash(P,R,m) ⋅ pk 。这里 pk 就是你的私钥,而 P = pk * G 是你的公钥,m 就是那条新闻。验证历程是检查 s * G = R hash(P,R,m) * P。

这个等式是线性的,以是多个等式可以相加相减而等号仍然确立。这给我们带来了 Schnorr 署名的多种优越特征。

1. 批量验证

在验证区块链上的一个区块时,我们需要验证区块中所有生意的署名都是有用的。若是其中一个是无效的,无论是哪一个 —— 我们都必须拒绝掉整个区块。

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 次点乘法。已经是险些 3 倍的性能提升了 —— 验证时只需为每个署名支出一次重运算。

新二皇冠最新手机登录

www.9cx.net)实时更新发布最新最快最有效的新二皇冠最新手机登录网址,包括新2手机网址,新2备用网址,皇冠最新网址,新2足球网址,新2网址大全。

2. 密钥天生

我们想要平安地保管自己的比特币,以是我们可能会希望使用至少两把差其余私钥来控制比特币。一个在条记本电脑或者手机(在线钱包,热钱包)上使用,而另一个放在 硬件钱包/冷钱包 内里。纵然其中一个泄露了,我们照样掌控着自己的比特币。

当前,实现这种钱包的做法是通过 2-2 的多署名剧本。也就是一笔生意需要包罗两个自力的署名。

有了 Schnorr 署名,我们可以使用一对密钥 (pk1,pk2),并使用一个共享公钥 P = P1 P2 = pk1 * G pk2 * G 天生一个配合署名。在天生署名时,我们需要在两个装备上划分天生一个随机数 (k1, k2),并以此天生两个随机点 Ri = ki * G,再划分加上 hash(P, R1 R2, m),就可以获得 s1 和 s2 了(由于 si = ki hash(P, R, m)* pki )。最后,把它们都加起来即可获得署名 (R, s) = (R1 R2, s1 s2),这就是我们的共享署名,可用共享公钥来验证。其他人基本无法看出这是不是一个聚合署名,它跟一个通俗的 Schnorr 署名看起来没有两样。

不外,这种做法有三个问题。

第一个问题是 UI 上的。要提议一笔生意,我们需要在两个装备上提议多轮交互 —— 为了盘算配合的 R,为了署名。在两把私钥的情形下,只需接见一次冷钱包:我们可以在热钱包里准备好待署名的生意,选好 k1 并天生 R1 = k1 * G,然后把待署名的生意和这些数据一同传入冷钱包并署名。由于已经有了 R1,署名生意在冷钱包中只需一轮就可以完成。从冷钱包中我们获得 R2 和 s2,传回给热钱包。热钱包使用前述的 (k1,R1) 署名生意,把两个署名加总起来即可向外广播生意了。

这在体验上跟我们现在能做到的没有什么区别,而且每当你加多一把私钥,问题就会变得加倍庞大。假设你有一笔财富是用 10 把私钥配合控制的,而 10 把私钥划分存放在天下各地,这时刻你要发送生意,该有多穷苦!在当前的 ECDSA 算法中,每个装备你都只需要接见一次,但若是你用上 Schnorr 的密钥聚合,则需要两次,以获得所有的 Ri 并署名。在这种情形下,可能不使用聚合,而使用各私钥单独署名的方式会好一些 —— 这样就只需要一轮交互。

文章完成后,我获得了 Manu Drijvers 的反馈:在一个可证实平安性的多署名方案中,你需要 3 轮交互:

第二个问题是已知的 Rogue 密钥攻击。这篇论文解说得异常好,以是我就不赘述了。也许意思是若是你的其中一个装备被黑(好比你的热钱包被挟制),并冒充自己的公钥是 (P1 - P2),那就可以仅凭私钥 pk1 便控制两个私钥共享的资金。一个简朴的解决方案是,在设置装备时,要求使用私钥对响应的公钥署名。

另有第三个重大问题。你没法使用确定性的 k 来署名。若是你使用了确定性的 k,则只需一种简朴的攻击,黑客即可获得你的私钥。攻击如下:某个黑客黑入你的条记本电脑,完全控制了其中一把私钥(好比 pk1)。我们感受资金仍是平安的,由于使用我们的比特币需要 pk1 和 pk2 的聚合署名。以是我们像往常一样提议生意,准备好一笔待署名的生意和 R1,发送给我们的硬件钱包,硬件钱包署名后将 (R2, s2)发回给热钱包 …… 然后,热钱包失足了,没法完成署名和广播。于是我们再试一次,但这一次被黑的电脑用了另一个随机数 —— R1' 。我们在硬件钱包里署名了统一笔生意,又将 (R2, s2')发回给了被黑的电脑。这一次,没有下文了 —— 我们所有的比特币都不翼而飞了。

在这次攻击中,黑客获得了统一笔生意的两个有用的署名:(R1, s1, R2, s2) 和 (R1', s1',R2,s2')。这个 R2 是一样的,然则 R = R1 R2 和 R' = R1' R2 是差其余。这就意味着黑客可以盘算出我们的第二个私钥:s2-s2'=(hash(P,R1 R2,m)-hash(P,R1' R2,m))⋅pk2 或者说 pk2=(s2-s2')/(hash(P,R1 R2,m)-hash(P,R1' R2,m))。我发现这就是密钥聚合最晦气便的地方 —— 我们每次都要使用一个好的随机数天生器,这样才气平安地聚合。

3. Musig

MuSig 解决了其中一个问题 —— rogue key 攻击将不能再奏效。这里的目的是把 多方/多个设置的署名和公钥聚合在一起,但又无需你证实自己具有与这些公钥相对应的私钥。

聚合署名对应着聚合公钥。但在 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 = ki hash(P,R,m) ⋅ hash(L,Pi) ⋅ pki 。因此,聚合署名是 (R, s)=(R1 … Rn, s1 … sn) ,而验证署名的方式与以前一样:s×G = R hash(P,R,m)×P 。

4. 默克尔树多署名

你可能也注重到了,MuSig 和密钥聚合需要 *所有署名者署名一个生意*。但若是你想做的是 2-3 的多署名剧本呢?这时刻我们能够使用署名聚合吗,照样不得不使用通常的 OP_CHECKMULTISIG 和划分署名?(译者注:OP_CHECKMULTISIG 是比特币验证椭圆曲线多署名剧本的操作码)

先说谜底,是可以的,然则协议上将有些许的差异。我们可以开发一个类似于 OP_CHECKMULTISIG 的操作码,只不外是检查聚合署名是否对应于公钥默克尔树上的一个元素。

举个例子,若是我们想用公钥 P1、P2 和 P3 组成一个 2-3 的多署名剧本,我们需要用这几把公钥的所有两两组合 (P1, P2)、(P2, P3)、(P1, P3) 来构建一棵默克尔树,并把默克尔树根宣布在锁定剧本中。

在破费比特币时,我们需要提交一个署名和一个证据,证实这个署名所对应的公钥位于由这个树根符号的默克尔树上。对于 2-3 多署名合约来说,树上只有 3 个元素,证据只需 2 条哈希值 —— 谁人我们想用的公钥组合的哈希值,另有一个邻人的。对于 7-11 多署名脚原本说,公钥组合有 11!/7!/4!=330 种,证据需要 8 条哈希值。通常来说,证据所包罗的元素数目与多署名的密钥数目大要成正比 ,为 log2(n!/m!/(n-m)) 。

但有了默克尔公钥树,我们就不必局限于 m-n 多署名剧本了。我们可以做一棵使用随便公钥组合的树。举个例子,若是我们有一个条记本电脑,一个手机,一个硬件钱包和一个助记词,我们可以构建一棵默克尔树,允许我们使用 条记本电脑 硬件钱包、手机 硬件钱包 或者单独的助记词来使用比特币。这是当前的 OP_CHECKMULTISIG 做不到的 —— 除非你使用 “IF - Else” 式的流程控制来组织更庞大的剧本。

结论

Schnorr 署名很棒,它解决了区块验证中的一些盘算开销问题,也给了我们密钥聚合的能力。后者在使用时有些未便利,但我们不是在强迫人人使用它 —— 无论若何,我们都可以依旧使用通俗的多署名方案,使用单独的、不聚合的署名。

我迫在眉睫想使用 Schnorr 署名,希望比特币协议能尽快纳入这种署名方案。

另外,我也至心喜欢 MuSig,它是个优雅的方案,论文也浅易易懂。我强烈建议列位有闲之时通读全文。

查看更多
发表评论
sunbet声明:该文看法仅代表作者自己,与本平台无关。请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片

您可能还会对下面的文章感兴趣: