第三章 | 满足 multisig(多签)权限
阅读我们发表的《EOSIO 多签和权限总览》和《使用 eosc 更改帐户的权限结构》之后,你现在应该熟悉了怎么更改帐户的权限结构。如果你已选择利用原生的 multisig 功能来提高账户安全性,我们现在必须讨论如何收集所需的签名以满足多签权限,以向区块链推送交易。
两个**:
让我们看一下这个有2个 active (活跃)权限的帐户:
要满足 active 权限,你需要让这两个列出的 active **都签署交易。如果你将这两个**都放在一个同一个 eosc 保险库文件中,就不需要把交易拿到不同地方去签:像 eosc 这样的工具可以一次做两个签名。然而,这不会增加安全性(只会增加安全感)。增加安全性的是将这些**保存在不同的地方,每个**以不同的方式进行保护。
让我们看一下你持有其中一个**而另一个人拥有另一个**的情况,使用 eosc 中的签名功能。我们首先制定我们想要执行的交易:
eosc transfer [ACCOUNT1] [ACCOUNT2] 0.5 --expiration 3600 --skip-sign --write-transaction collect.json
此命令创建的交易是从 ACCOUNT1 转 0.5 个 EOS 到 ACCOUNT2,并且签署时间为1小时(3600秒)。它指示应用程序不对交易进行签名,只将其写入名为 collect.json 的文件中,我们现在要用它来收集签名。
我们将此文件给两个**的持有者,并让他们使用此命令对其进行签名:
eosc tx sign collect.json --offline-sign-key [PUBLIC_KEY] --write-transaction collect-signed.json
这个命令使他们每个人用他们的**签名到一个保存他们签名的新文件。
通过使用 \--offline-sign-key 标和 eosc 生成的交易,该操作可以完全离线完成,进一步降低了**通过网络泄露的风险。
签名过后我们再检查 json 时,它的一部分将会改变:
将变为:
等我们有了两个签名文件,我们就可以将其中一个文件的签名复制并粘贴到另一个文件中,以便该数组包含必要的签名:
由于两个必需的**的签名都收集到了,我们现在可以将交易文件推送到链上。
eosc tx push collect-signed-both.json
两个帐户
现在让我们看一个名为 msigexample1 的帐户,该帐户具有以下 active 权限:
为了满足其 active 权限,它需要收集两个帐户的 active 权限的签名。这就是 eosio.msig 合约设计的初衷。你不再需要拿着一个文件到处收集签名,相反,签名会被收集到 eosio.msig 合约表中的临时行中。
在这种情况下,帐户 msigexample1 已使用了它的 active 来授权对于 msigexample2 和 msigexample3 的 active 权限的收集。那么接下来的第一步是创建一个类似于上一个例子的交易文件:
eosc transfer msigexample1 [RECIPIENT] 0.1234 --expiration 3600 --skip-sign --write-transaction msig.json
然后,你可以将此交易提交为 msig,同时向 msigexample2 和 msigexample3 请求签名。
eosc multisig propose msigexample1 collectsigs msig.json --request msigexample2,msigexample3
现在,两个请帐户必须在交易创建所时定义的到期时间内批准这个 msig。他们会使用命令执行此操作:
eosc multisig approve msigexample1 collectsigs [ACCOUNT_NAME]
要确认 multisig 将执行的内容,你可以运行以下命令:
eosc multisig review msigexample1 collectsigs
如果你想跟踪签名的进度,可以使用以下命令:
eosc multisig status msigexample1 collectsigs
在第一个屏幕截图中,你可以看到列出的"Requested approvals(请求的批准)"。其中一个帐户签署了提案后,你会看到它填上了这个第二个屏幕截图中的"Provided approvals (提供的批准)"部分。收集完两个签名后,现在是时候执行提案了。
请注意,即使你从其他帐户拿到了签名,你也只需要足够的批准来满足原始交易的授权(在本例中为 [email protected])。
执行 msig,运行:
eosc multisig exec msigexample1 collectsigs [ACCOUNT_NAME]
有趣的是,任何帐户都可以调用 exec 命令来执行被批准的 msig 上,不需要必须是被请求权限的账户。
我们现在学会了在自定义帐户的权限结构,以及如何使用 eosc 以及 eosio.msig 合约的强大功能来满足这些权限。在下一篇文章中,我们将介绍嵌套权限以及如何利用它们。
第一章 | EOSIO 多签和权限总览
第二章 | 使用 eosc 更改帐户的权限结构
第三章 | 满足 multisig(多签)权限
第四章 | 嵌套权限和 linkauth (链接验证)
第五章 | 收集一个 multisig (多签)签名