在目前的情况下,现有的区块链已采用了几种不同的系统,让多个所有者控制同一笔区块链token,以太坊是基于智能合约,而比特币则基于脚本(例如P2SH)。
- 基于智能合约的例子:以太坊、Tezos、EOS、Vechain、ETC;
- 基于脚本的例子:比特币、莱特币、Iota、 Cardano、Zcash[1]、NEO、DASH、Decred;
- 客户端内置:恒星(Stellar)和瑞波(Ripple);
- 自定义密码系统:GRIN[2]和门罗[3];
一、签名是如何工作的
为了在任何区块链上发送有效的交易,必须采取几个步骤:
- 构造一笔有效交易;
- 使用帐户或UTXO的相应私钥签署交易;
- 将签名的交易提交到网络;
- 矿工(或节点验证者)核实交易和签名;
- 交易被放置到一个区块当中,并更新相关的区块链状态;
二、非密码技术及其问题
智能合约:虽然基于智能合约的多重签名帐户提供了很大的灵活性(无限定制),但从历史上看,它们在代码、语言、虚拟机和编译器方面都存在缺陷。由于与人类有关的错误,数亿美元的区块链token被永久锁定了。
脚本:与智能合约平台不同,比特币具有更原始的脚本语言。区别也很明显:非图灵完备、非编译、没有虚拟机,也没有“状态”的概念。这是否会使加密货币变得不那么有用,这一争论将在其他地方展开。但更重要的是,其对多重签名有特定的操作码。在比特币和比特币相关分叉中,有一个特殊的脚本被称为支付到脚本哈希(Pay-to-Script-Hash),其被用于创建多重签名帐户。在这里,读者可找到一个深入的解释。
比特币的多重签名地址和以太坊的多重签名钱包都要求在发送交易时提交所有相关签名。我们今天将探讨的一些方案,只需要提交一个签名,从而节省了宝贵的链上空间,并可能使地址与单个私钥地址无法区分(增加隐私性)。
三、各类加密签名技术
在本文当中,我们会探索各种技术,将多重签名添加到区块链协议当中。注意,这些技术均不是什么万能药,因为每种方案都会存在各种权衡,在确定哪种技术最适合特定情况之前,我们需要去彻底探索。
1、沙米尔秘密共享算法(SSS)
注:这不是经典意义上的多重签名,尽管这里讨论的是为其他形式的密码多重签名提供反例。
这里使用一个私钥来派生n个碎片,其中的m是重建私钥所需的。此方案通常用于密钥恢复,如果用户丢失了私钥,则可使用用户分发给不同朋友的碎片重建原始密钥。但是,它不适用于多重签名,这是因为:
- 必须生成私钥才能派生碎片;
- 在签署交易之前,必须从碎片重新组装私钥;
这意味着存在一个可信生成和重新组装的步骤,这是一个故障点。另外,个人碎片持有者没有发言权,他们提供的只是碎片。可信硬件可减轻可信生成和签名问题,但这会导致诸如侧通道攻击、可用性等问题。
尽管如此,应注意SSS的一些独特特性,其可在不修改基础密钥/私钥的情况下创建尽可能多的不同的共享集。因此,如果Alice最初拥有10个秘密,而非朋友关系的Bob是一个秘密持有者,那么Alice可重新生成9个秘密,并将其交给其余的受信任方(他们希望销毁旧的持有部分,使Bob的秘密持有毫无用处)。
2、门限ECDSA
在门限ECDSA方案中,我们消除了沙米尔方案存在的一个漏洞。在这里,我们描述了Steven Goldfeder在其ECDSA MPC论文中开创的一项最新建设,在密钥生成和签名效率方面,这项建设超过了以前的ECDSA工作。
使用分布式密钥生成(DKG)方案,所有密钥持有者都参与一个交互过程,该过程为自己生成一个私钥,并生成一个公钥。这样可确保任何一方都不会知道真正的私钥。在此构造密钥生成之前,只能使用一个可信方,因为对于大于两个的参与方来说,计算时间太长了。
据目前所知的是,Keep Network和Kzen Networks在运用这种阈值ECDSA方案。
3、门限ED25519
ECDSA的一个问题是,由于签名算法的复杂性,阈值签名是很复杂的。然而,对于其他签名方案,如EdDSA(Edwards曲线数字签名算法),尤其是曲线Edwards25519,其签名方案ED25519具有相对更有效和更直接的阈值签名。用户生成自己的密钥,然后有一个聚合步骤来创建单个公钥,交易签名有三轮交互协议。
Kzen Networks已经为ED25519门限签名实现了一个参考库,恒星(Stellar)[4]、Near Protocol以及Cosmos使用了相同的曲线,但不实现加密门限签名。
4、Schnorr签名
在比特币中,Schnorr签名是签名聚合的一种形式。相比使用P2SH,其与密钥数成线性增长关系,而签名聚合允许使用恒定大小的签名。验证者不需要知道签名者的个人公钥,从而增加了隐私性。在这方面,Blockstream正大力推动将这种技术应用于比特币。
在Schnorr签名方案论文(第5.3节)中,有几种方法可实现m-of-n多重签名,并进行各种权衡,在某些方案中,用户提供自己的密钥,而在其他方案中,必须有一个DKG。一般来说,至少有一轮的密钥生成和交易签名通信,交易签名也不能很好地扩展到大的m或n。
5、BLS签名方案
所谓BLS签名,其全称为(Bohen-Lynn-Shacham)签名方案,这种方案在大签名集的情况下来说是非常有效的。也就是说,我们可以有2-of-10或2-of-1000多重签名方案,而在设置和签名时间上和普通签名方案几乎没有任何区别。对于设置阶段,唯一需要做的就是为每个私钥生成成员密钥,这只需要一轮通信因为用户提供自己的私钥,所以可以使用HD派生等技术来轻松管理多个密钥。用户离线签署交易,单个聚合器汇总签名并提交。
使用成员密钥的这种特殊构造是相当新的,另一种方法是利用沙米尔秘密共享方案(dfnity和dash在用),但是需要一个可信方或DKG。BLS签名方案的一个缺点在于,其签名验证会是缓慢的,它比ECDSA要慢上一个数量级。
四、权衡空间
当从远处观察这些技术时,我们可能会认为某些技术会优于其他技术。不幸的是,当我们潜入到权衡领域时,我们会发现,情况并非如此。一些技术对于较大的签名者组而言更可取,一些技术则更适合于低带宽环境。在这里,我们探索一个非详尽的属性列表,以分析以上各类技术。
原像:是否有必须拆分的私钥?
可信设置:是否存在生成密钥的单个实体,或者是否存在分布式密钥生成方案?
检测多重签名:区块链的查看者能否确定特定地址是否为多重签名地址?
HD派生:是否可以为相关的加密过程设置硬件确定性密钥?
(用户可以使用像bip32这样的技术,这样他们只需要记住自己的种子,而不需要记住一堆私钥)
权重:是否可以为特定的私钥分配不同的权重?(例如:1-of-2 多重签名,其中密钥持有人A的权重为2,密钥持有人B的权重为1,表示A不需要B签名,但B始终需要A)。
能见度
- 签名者的隐私:区块链的查看者能否确定谁是交易的特定签名者?
- 签名大小:多重签名交易是否需要更多的链上空间,空间大小是否随签名者的数量而变化?
时间
- 密钥生成时间:生成密钥需要多长时间,密钥生成时间是否根据参与方数量增加?
- 密钥生成回合:如果密钥生成是交互的,参与者需要交互多少次?
- 验证时间:验证签名需要多长时间?
- 签名时间:签署交易需要多长时间?
签名
- 交互式:签署交易需要多少轮通信?
- 曲线效率:尽管其中一些技术适用于所有曲线,但有必要考虑曲线效率和辅助因子选择等问题。
图:以上方案的权衡考虑,注意每个方案都有几个构造,导致会有不同的属性。
五、未来发展
尽管有很多不同的技术可以为区块链启用多重签名帐户,但我们必须认识到协议中的设计注意事项。其中一些技术需要更改底层协议,而另一些则不需要。协议设计者应意识到在用户体验和未来的密码技术进步校对中的隐含权衡。
有趣的事实:签名比发送交易有更多的用途。它们可用于权益证明系统中的区块签名、具有较小区块链的聚合签名以及交易压缩。
六、有趣的问题
现在,您大概了解了一些关于加密多重签名的知识,在决定实现协议时应选择哪种签名方案时,这里有一些问题是值得探讨的:
- 是否存在希望能够区分多重签名帐户和链上单个签名帐户的用例;
- 门限密码系统提供了一种属性,在该属性中,单个密钥签名者是未知的,这在哪里有益或有害?
- 有没有可能有一个允许选择性公开的签名方案,在某些交易公开签名者,而在其他交易则不公开?
- 有没有可能有一个只显示签名者的一个子集而非全部签名者的签名方案?
- 是否可能有一个方案,其中签名方无法确定交互步骤中的其他签名方是谁?
- 当无法使用HD钱包时,密钥管理如何工作?
- 对于BLS方案,人们可使用HD密钥,但是需要生成其他成员密钥。当用户丢失其成员密钥时,协议应该是什么样的?
- 多重签名应该完全位于加密领域,还是应该在智能合约/脚本和加密之间保持平衡?
- 是否存在签名大小根本不重要的情况,因为签名被丢弃,或者存在一种新的压缩形式?
脚注
[0]从技术上讲,假设存在加密签名,所有区块链都具有原生多重签名的形式。然而,对于任意的签名算法,寻找一个有效的门限签名方案是相当困难的。
[1]zcash目前使用P2SH,在即将到来的Blossom更新中,它将切换到自定义加密结构。
[2]GRIN是加密货币中唯一使用基于密码学的多重签名方案,类似于比特币的保密交易。该方法的一个缺点是,其是按照他们的协议定制的,很难概括。
[3]门罗币只支持n-of-n和(n-1-of-n)多重签名方案,前者与Splitkey非常相似。
[4]恒星(Stellar)有多重签名,但没有在密码学中实现,而是通过使用他们的脚本语言来实现的。
[5]注意,对于UTXO模型,有一个一次性交互步骤来生成公钥,这对于用户想要花费的解锁脚本而言是必需的。