官方微信赞助推广网推广标签      禁止一切违法信息推广,否则封号。本站内容均为会员发表,并不代表本站立场!

中国推广网

QQ登录

免注册,加入推广网

扫一扫,登录推广网

上一主题 下一主题

区块链知识:Schnorr 签名如何提升比特币

[复制链接]
跳转到指定楼层
楼主
小飞飞 发表于 2022-8-19 18:10:45

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

站长推荐:OKX 邀请码-62342543注册领取新手礼包! 交易手续费返现:20%! 赶紧注册吧!


OKX国内注册地址:https://www.tzvrsp.cn/join/62342543


OKX海外注册地址:https://okx.com/join/62342543


OKX备用注册地址:https://www.notion.so/OKX_OKEx-ce48c7ec5741496893fa56244a060183【复制链接到浏览器打开注册】

椭圆曲线签名算法

当前比特币的所有权体系用的是 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$。

- ECDSA 算法图解。为便于说明,椭圆曲线作在实数域上 -

这种算法是很常见的,也非常好用。但还有提升空间。首先,签名的验证包含除法($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 签名和验证 -

这个等式是线性的,所以多个等式可以相加相减而等号仍然成立。这给我们带来了 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 倍的性能提升了 —— 验证时只需为每个签名付出一次重运算。

- 两个签名的批量验证。因为验证等式是线性可加的,所以只要所有的签名都是有效的,这几个等式的和等式也必成立。我们节约了一些运算量,因为标量和点加法比点乘法容易计算得多。 -

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 轮交互:

选择一个随机数 ki 以及相应的随机点 Ri = ki * G,然后告诉每一个设备 Ri 的哈希值 ti=hash(Ri),然后每个设备都能确保你没有在知道其他人的随机数之后改变主意收集所有的数字 Ri 并计算公共的 R签名

第二个问题是已知的 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))$。我发现这就是密钥聚合最不方便的地方 —— 我们每次都要使用一个好的随机数生成器,这样才能安全地聚合。


分享到:  新浪微博新浪微博 QQ空间QQ空间
中国推广网 - 免责申明1、本主题所有言论和图片纯属会员个人推广行为,并不代表本站赞同其观点和对其真实性负责
2、本站不提供和不存在任何金钱交易(本站管理账号发布的帖子除外),谨防上当受骗!本站唯一管理账号:推广网官方
3、本站所有主题由该帖子作者发表,该帖子作者享有帖子相关版权并且依法承担一切因本文发表而直接或间接导致的民事或刑事法律责任

中国推广网提供免费推广,免费营销,免费发布广告信息的网络推广平台。
关闭

网站推荐上一条 /1 下一条

扫描二维码
把此页分享给朋友

小黑屋|广告服务|联系我们|推广帮助|(京ICP备16009988号)

中国推广网(推广论坛)是免费网络推广平台||免费推广就上中国推广网

技术支持:推广网官方

中国推广网·免费发广告平台

快速回复 返回顶部 返回列表