MuSig1的交互性问题
与基于CHECKMULTISIG的钱包相比,MuSig1最大的缺点在于,它需要签名者之间的交互,更准确地说,创建签名需要三轮通信,而每一轮通信都由来回传递的消息组成。下图显示了两个签名者的交互过程。你可以想象一个签名者使用的是一个桌面钱包,而另一个签名者使用的是Blockstream Green cosigner,或者签名者共享一个他们试图关闭的闪电网络通道。

相比之下,使用CHECKMULTISIG的钱包只需要一轮通信:它们接收一笔交易并返回一个签名。例如,如果使用MuSig1在闪电网络中转发支付,隐 私将得到改善,但支付所需的时间明显更长了。随着通信延迟的增加,这个问题就变得更加严重了。而存储在安全保险箱中的MuSig1签名设备,需要其所有者访问两次才能创建签名。
MuSig2允许非交互式签名
而最新提出的MuSig2多重签名方案,旨在成为MuSig1的继承者,它提供了与MuSig1相同的功能和安全性,但可以消除签名者之间几乎所有的交互。使用MuSig2,签名者只需要进行两轮通信就可以创建签名,而且关键的是,在签名者知道他们想要签名的消息之前,可以对其中一轮进行预处理。一旦有消息需要签名,例如一笔比特币交易,那么其过程与今天基于CHECKMULTISIG的钱包相同:将交易转移给签名者,然后接收一个签名。总的来说,MuSig2保留了MuSig1的简单性和效率,只增加了少量的额外计算。
MuSig家族
几周之前,研究者们讨论了MuSig-DN,它是一个使用了零知识证明的两轮通信协议,相比MuSig2而言,它要复杂得多。而MuSig-DN的优点在于它支持确定性nonce,从而避免了在签名会话和轮次之间保持状态的需要(即无状态)。

这就提出了在给定应用中使用哪个方案的问题。上表说明,我们没有理由选择MuSig1,而是应该选择MuSig2。实际上,我们希望大多数应用选择MuSig2而不是MuSig-DN,因为简单性是采用的主要因素。在创建可互操作的实现时,尤其如此,因为所有签名者都必须同意使用相同的协议。此外,对非交互式签名的支持显著提高了可用性。
另一方面,如果签名会话需要存储在持久介质上,那么MuSig-DN方案的无状态属性是有益的。为了演示这种情况下MuSig2的风险,假设我们执行以下一系列事件:
开启一个MuSig2签名会话;
将会话保存到一个硬 盘驱动器;
执行硬 盘驱动器备份;
完成签名会话;
恢复备份;
再次完成会话;
结果是,我们创建了两个具有相同nonce的签名,其可用来窃取我们的密钥。因此,MuSig2的实现者必须要小心,以确保不会发生上述情况。相比之下,MuSig-DN方案就可以防止这种攻击。
构造两轮多重签名的挑战
构造一个简单的只需要两轮通信的Schnorr多重签名方案,并且在并发会话(即,如果某个签名者同时参与多个签名会话)下仍然是安全的,这是一个尚未解决的研究问题。所有以前的尝试(包括早期版本的MuSig1论文)都会受到Drijvers等人发现的一种巧妙的攻击。在这种情况下,攻击者与受害者签名者打开许多会话,并能够获得受害者不打算签名消息的签名。
让我们快速看看,是什么让MuSig2在并发会话下变得安全。其中,在MuSig1中,每个签名者i创建一个nonce,而在MuSig2中,每个签名者创建两个nonce R_i,1和R_i,2,在第一轮通信时将它们发送给其他签名者,并有效地使用这些nonce的随机线性组合R_i = R_i,1 + b*R_i,2,代替之前单独的nonce R_i。而系数b是应用于所有签名者nonce、聚合公钥和消息的哈希函数的输出。在MuSig1中,聚合的nonce是R = R_1 + … + R_n。如果任何签名者更改了他们的任何nonce,则其他每个签名者都将使用他们两个nonce的不同的随机线性组合。这可以防止已被发现的针对其他两轮多签名方案的攻击。所有细节你可以在MuSig2论文中找到。
关于下一步
目前blockstream希望用MuSig2取代secp256k1zkp库中的MuSig1实现,它将更为简单,更重要的是,它更易于使用。根据开发者的说法,使用工具箱中的MuSig2,一些协议将从中受益,例如“无脚本脚本闪电网络”以及门限签名。如果比特币社区选择采用Taproot软分叉,则MuSig2会适用于Blockstream的一系列产品,比如Blockstream Green和c-lightning,它也适用于Liquid 锚定机制。

