多签账户简介
多签账户(multisig)可以在基于Substrate的区块链上创建。一个多签账户由一个或多个地址和一个阈值组成。阈值定义了需要达成共识的签名者(参与地址)数量,同意提交外源(Extrinsic)才能成功调用。
例如,Alice、Bob和Charlie建立了一个阈值为2的多签账户。这意味着即使Charlie不同意,Alice和Bob也可以执行任何调用。同样,Charlie和Bob也可以执行任何调用而不需要Alice的同意。阈值通常是小于成员总数的数字,也可以等于成员总数,但这意味着他们都必须同意。
注:更多关于多签账户的信息
请查阅此帮助页面(详情请参见:
https://support.polkadot.network/support/solutions/articles/65000181826-how-to-create-and-use-a-multisig-account)“如何创建多签账户”部分。我们建议你在Polkadot的测试网络Westend(详情请参见:
https://wiki.polkadot.network/docs/maintain-networks#westend-test-network)上尝试教程。
多签账户有以下几种用途:
- 保护你的资金:使用额外的签名者作为双重身份验证机制来保护你的资金安全。一个签名者可以位于一台计算机上,另一个可以位于另一台计算机上或者冷存储设备上。这会降低你与链的交互速度,但安全性可以提高很多。
- 决策委员会:企业和基金会等法人实体使用多重签名来共同管理实体的资金。
- 群体参与治理:一个多签账户可以执行与普通账户相同的操作。在Kusama的治理中,多签账户可以作为一个议会成员,社区成员可以作为一个实体进行投票。
多签账户创建后无法修改。要更改成员集合或阈值,需要解除当前的多签账户并创建一个新账户。因此,多签账户地址具有确定性,也就是说你总是可以通过知道成员和阈值来计算出多签账户的地址,而不需要账户存在。这意味着可以向一个尚不存在的地址发送通证,如果指定为接受者的实体以相同的阈值组成一个新的多重签名账户时,他们就可以立刻使用这些通证。
编者注:
这段话的意思是可以把多重签名账户地址想象成一个保险箱,这个保险箱有一个特殊的锁,需要多把钥匙才能打开。这些钥匙分别属于不同的人,他们都是这个保险箱的共同拥有者。这个保险箱里面放着一些钱,只有当达到一定数量的人同意时,才能取出这些钱。
多重签名账户地址的生成方法是固定的,也就是说,只要知道了这个保险箱里有几把钥匙,还有需要几个人同意才能取钱,就可以算出这个保险箱的编号,而不用等到保险箱真的造好了。这样做的好处是,可以先给一个还没造好的保险箱打钱,然后等到指定的人以同样的条件造了一个新的保险箱后,他们就可以马上用这些钱。
使用Polkadot-JS UI创建多签账户
账户(Accounts)选项卡的多签交易
注:参阅视频教程
请参阅此视频教程(详情请参见:https://youtu.be/-cPiKMslZqI),了解如何在Polkadot-JS UI(详情请参见:
https://polkadot.js.org/apps/#/accounts)的账户(Accounts)选项卡上使用多签账户进行交易。
你可以直接在Polkadot-JS UI(详情请参见:
https://polkadot.js.org/apps/#/accounts)的账户(Accounts)选项卡上创建多签账户,并使用此账户发送资金。更多信息,请参阅此帮助文章(详情请参见:
https://support.polkadot.network/support/solutions/articles/65000181826-how-to-create-and-use-a-multisig-account)。
外源(Extrinsic)选项卡的多签交易
多签账户可进行三种类型的操作:
- 执行【asMulti】调用。用于开始或结束一个多重签名交易。
- 审批【approveAsMulti】调用。用于审批一个外源(Extrinsic)操作,并传递给下一个签名者(有关更多信息,请参见下面的示例)。
- 取消【cancelAsMulti】调用。
注:请查阅此页面(详情请参见:
https://polkadot.js.org/docs/substrate/extrinsics/#multisig),了解更多有关多签账户操作的详细信息。
在只需要一次审批的情况下,应使用便捷方法【as_multi_threshold_1】。该函数仅将其他签名者和原始调用作为参数。请注意,Polkadot-JS UI不支持此调用,因为不可能创建【阈值=1】的多签账户。如果你想创建一个阈值为1的多签账户,可以使用由Parity Technologies开发的txwrapper-core(详情请参见:
https://github.com/paritytech/txwrapper-core)。这里有一个详细的多重签名示例(详情请参见:
https://github.com/paritytech/txwrapper-core/tree/main/packages/txwrapper-examples/multisig),你可以尝试并更改它,以了解其工作原理。
但除了简单的一次审批外,在执行之前,你可能还需要一个以上的签名者审批调用。当你创建新的调用或审批多重签名时,你需要存入一笔小额保证金。存款将保留在合约中,直到调用被执行。存款是为了建立多重签名调用在链上占用的存储空间的经济成本,防止用户创建永远不会执行的悬空多重签名操作。存款将被保留在调用者的账户中,因此多签钱包中的参与者应该要有备用资金。
存款取决于阈值【threshold】参数,计算公式如下:
存款=存款基数+阈值*存款因子
其中,存款基数(depositBase)和存款因子(depositFactor)是Runtime代码中设置的链常量(以DOT为单位)。当前,存款基数等于20.088DOT,存款因子等于0.032DOT。
注:视频教程(使用多签账户示例)
请参阅本视频教程(详情请参见:https://youtu.be/T0vIuJcTJeQ),了解如何使用Polkadot-JS UI(详情请参见:
https://polkadot.js.org/apps/#/explorer)中的外源(Extrinsic)选项卡与多签账户进行交易。
让我们以波卡上的多重签名为例,假设签名阈值为2,有3名签名者:Charlie、Dan和Eleanor。首先,Charlie将通过调用【multisig.asMulti】外源(Extrinsic)在链上创建多重签名交易。在本例中,他要进行的是一个余额转账(【balances.transferKeepAlive】extrinsic),从多重签名账户CDE转账到Frank的账户。在这个过程中,Charlie需要存入【DepositBase+(2*DepositFactor)=20.152DOT】的保证金,同时等待Dan或Eleanor中的任一人审批该余额转账调用,使用【multisig.approveAsMulti】或【multisig.asMulti】外源(Extrinsic)。
如果Dan提交【multisig.approveAsMulti】外源(Extrinsic),他就审批了Charlie的调用,但会将最终审批权交给Eleanor。因此,在这种情况下,尽管多重签名的阈值是2,所有3/3个签名者都需要参与交易审批。Eleanor需要提交【multisig.asMulti】或【multisig.approveAsMulti】外源(Extrinsic),以从CDE账户向Frank转移资金。
或者,Dan或Eleanor可以在Charlie之后提交【multisig.asMulti】外源(Extrinsic)以转移资金。在这种情况下,2/3的签名者将参与交易审批。审批Charlie调用的账户无需支付保证金,一旦转账成功或取消,Charlie将收到他的保证金。要取消交易,Dan或Eleanor可以使用【multisig.cancelAsMulti】外源(Extrinsic)。
请注意,多重签名是确定性的,这意味着多重签名地址是根据签名者的地址和多重签名钱包的阈值生成的。无论签名者账户的顺序如何,多重签名的地址始终相同,因为账户地址按升序排序。
注:提供给多重签名钱包的地址是经过排序的
公钥签名者的钱包地址按字节逐位比较并升序排序后,用于生成多重签名地址。例如,考虑以下三个地址:A、B和C,分别以【5FUGT】【5HMfS】和【5GhKJ】开头。如果我们按照特定顺序(首先是A,然后是B和C)创建ABC多重签名钱包,实际的账户顺序将是ACB。在外源(Extrinsic)选项卡中,如果我们使用C发起多重签名调用,其他签名者的顺序将首先是A,然后是B。如果我们首先放置B,然后是A,交易将失败。
在使用Polkadot-JS UI(详情请参见:
https://polkadot.js.org/apps/#/accounts)的外源(Extrinsic)选项卡执行多重签名交易时,这会产生一些影响。如果其他签名者的顺序错误,交易将失败。如果直接从账户(Accounts)选项卡执行多重签名,则不会发生此问题(建议使用该方法)。Polkadot-JS UI支持多签账户,可在账户生成(Account Generation)页面(详情请参见:
https://wiki.polkadot.network/docs/learn-account-generation#multi-signature-accounts)文档中找到相关信息。关于更多创建多签账户以及如何使用Polkadot-JS UI中的账户(Accounts)选项卡(详情请参见:https://youtu.be/-cPiKMslZqI)和外源(Extrinsic)选项卡(详情请参见:https://youtu.be/T0vIuJcTJeQ)进行交易,你可以查阅我们的视频教程。
多重签名与Multix工具
注:视频教程
有关如何使用Multix(详情请参见:
https://multix.chainsafe.io/?network=kusama)进行多签账户操作的更多信息,请参阅本视频教程(详情请参见:
https://www.youtube.com/watch?v=APxPsawebJw)和本文(详情请参见:
https://blog.chainsafe.io/multix-a-simple-interface-to-manage-complex-multisigs-on-polkadot-97328be26f9d?gi=abd0f3fbabb7)
Multix工具(详情请参见:
https://multix.chainsafe.io/?network=kusama)是一个易于使用的界面,用于管理复杂的多重签名。该工具是开源的波卡/Kusama技术堆栈(详情请参见:
https://wiki.polkadot.network/docs/build-open-source#user-interface)的一部分。与Polkadot-JS UI相比,Multix除了用户友好外,还具有多项优势:
- 当有人创建多签账户时,所有签名者都会在其界面上看到多签账户。
- 无需传递调用数据以确认交易。此类信息会从链上检索,并显示给用户。
- 借助纯代理(pure proxies)(详情请参见:
https://wiki.polkadot.network/docs/learn-proxies#anonymous-proxy-pure-proxy)的强大功能,可以添加和删除签名者或调整阈值,而无需创建新的多重签名,并且Multix提供了一个直观的界面来处理纯代理。
解码多重签名调用数据
注:在签署交易之前,了解签署内容的具体细节非常重要。请查阅帮助文档中的"如何使用多签账户"(详情请参见:
https://support.polkadot.network/support/solutions/articles/65000181826-how-to-create-and-use-a-multisig-account),了解如何解码多重签名调用数据。