波卡的代理账户(下)
如何查看你的代理
要查看你的代理,请在Polkadot-JS UI中的"账户"(Accounts)菜单中操作,在被代理的账户旁边会有一个蓝色图标。将鼠标悬停在上面,你会看到代理概览。点击它,你将看到该账户的所有代理的列表。
此外,你还可以在Polkadot-JS Apps(详情请参见:
https://polkadot.js.org/apps/?rpc=wss://rpc.polkadot.io#/chainstate)的"Chain State"选项卡(位于开发者Developer菜单下方)中查看代理。如果你是在Kusama账户上创建的代理,需要使用左上角的导航按钮相应地更改网络。在这个页面上,应选择代理模块,以返回公告和代理函数。代理函数将允许你查看为一个账户或所有账户创建的代理(可以使用切换开关启用此功能)。代理公告是时间锁定代理(time lock proxy)宣布它们将要执行的操作。
代理押金
创建代理需要使用本地货币(如DOT或KSM)进行抵押。这是因为在链上添加代理需要一些存储空间,该存储空间必须在网络中的每个节点上进行复制。由于成本高昂,这些功能可能会使网络遭受拒绝服务攻击的风险。为了防止这种攻击,代理在其生命周期内需要保留抵押金,以消耗存储空间。当代理被移除时,存储空间也会被释放,因此抵押金将会返还。
n个代理所需的抵押金额计算公式如下:
代理押金基数+代理押金系数*n
【ProxyDepositBase】+【ProxyDepositFactor】*n
其中,代理押金基数【ProxyDepositBase】是为了让一个账户拥有代理列表(在存储中创建一个新项)而需要保留的金额。对于每个代理,还需要额外保留由代理押金系数【ProxyDepositFactor】定义的金额(向存储位置追加33字节)。【ProxyDepositBase】是20.008DOT,【ProxyDepositFactor】是0.033DOT。
延时代理
我们可以通过给代理设置延迟时间来为代理增加一层安全性。延迟时间以区块为单位进行量化,波卡的区块时间大约为6秒。延迟值为10表示十个区块,即大约延迟一分钟。代理将使用【proxy.announce】外源(Extrinsic)来公告其预期的操作,并在执行之前等待延迟时间定义的区块数量。代理将在公告中包含预期函数调用的哈希值。在此时间窗口内,控制代理的账户可以取消预期的操作。
这可以由代理自身使用【proxy.removeAnnouncement】外源(Extrinsic)或由被代理的账户使用【proxy.rejectAnnouncement】外源(Extrinsic)进行操作。现在我们可以使用代理,因为任何恶意行为都可以在延迟期内被察觉并撤销。延时结束后,代理可以使用【proxy.proxyAnnounced】外源(Extrinsic)来执行已公告的调用。
注:
请参阅此视频教程(详情请参见:
https://www.youtube.com/watch?v=3L7Vu2SX0PE)以了解如何设置和使用延时代理。视频将通过下面的示例进行演示。
使用延时代理公告n个调用还需要进行抵押,计算公式如下:
公告押金基数+公告押金系数*n
【announcementDepositBase】+【announcementDepositFactor】*n
其中,【announcementDepositBase】是为了一个账户公告代理调用而需要保留的金额。对于每个代理调用,还需要额外保留由【announcementDepositFactor】定义的金额。【announcementDepositBase】是20.008DOT,【announcementDepositFactor】是0.066DOT。
例如Eleanor将Bob设置为延时代理。这样,如果Bob提交一个改变奖励目标的外源(Extrinsic),Eleanor可以拒绝该外源(Extrinsic)。这意味着Eleanor监控着Bob,并且在延时期内可以发现已公告的外源(Extrinsic)。Eleanor可以在链上检查由她账户的代理进行的所有代理调用的公告。在Polkadot-JS UI中,转到Developer>Storage>Proxy>Announcements以检查由代理账户发出的调用的哈希值和启用执行的区块高度。
注:
如果尝试在延时窗口内使用【proxy.proxyAnnounced】来执行调用,你会收到错误消息"Proxy unannounced",因为公告将在延迟后进行。还请注意,常规的【proxy.proxy】调用不能与延时代理一起使用,你需要先公告调用,然后在单独的事务中执行公告的调用。
代理调用
代理调用,被用于代理来调用代理账户。在纯代理的情况下,这些调用非常重要,因为任何与纯代理签署交易的尝试都会失败。了解更多详细信息,请参阅有关匿名代理的专门章节(详情请参见:
https://wiki.polkadot.network/docs/learn-proxies#anonymous-proxy-pure-proxy)。
嵌套代理调用
顾名思义,嵌套代理调用是在代理调用内部进行的代理调用。如果有被代理账户本身也是代理的情况下,就需要这样的调用。在下面的示例图中,Alice拥有一个存款(Stash)账户,该账户有一个质押代理账户P-C。P-C是一个纯代理,最初由Charly创建,并且现在是P-C的任意代理,并代表其签署所有转账。
例如,要绑定更多的资金,Charly需要向P-C提交一个【prox.proxy】外源(Extrinsic),然后P-C会提交一个【proxy.proxy】外源(Extrinsic)到Alice,其中包括一个【staking.bondExtra】外源(Extrinsic),指定需要绑定的额外通证数量。如果Charly想要离开,新的账户可以在Charly离开之前接替他的位置作为任意代理,无需更改质押代理账户。此外,只有Alice才能将P-C从质押代理列表中移除,并且P-C只能执行与质押相关的任务。例如,P-C无法从Alice的账户中转出资金。
可以使用Polkadot-JS UI中的外源(Extrinsic)选项卡进行代理调用。嵌套代理调用可以通过单独调用每个【proxy.proxy】外源(Extrinsic)来完成,或者在某些情况下,只需调用最后一个【proxy.proxy】外源(Extrinsic)即可。在上面的示例图中,从P-C向Alice提交代理调用将自动请求Charly的签名。因此,一个代理调用将触发第二个代理调用,因为Charly是P-C的唯一任意代理,而P-C无法进行签名。而如果我们想要使用Bob的账户,我们将需要提交所有三个代理调用。
匿名代理(纯代理)
注意:
Polkadot-JS UI中的账户选项卡无法处理复杂的代理设置(例如,一个代理->多重签名->另一个多重签名的纯代理)。这些复杂的设置必须直接在外源(Extrinsics)选项卡(详情请参见:
https://polkadot.js.org/apps/#/extrinsics)中完成。
我们建议你首次测试功能时使用Westend(详情请参见:
https://wiki.polkadot.network/docs/learn-DOT#getting-tokens-on-the-westend-testnet)测试网络。通过在测试网络上进行复杂的代理设置,你可以轻松地在主网络上复制该过程。
注意:资金损失风险
在使用波卡上的匿名代理进行任何操作之前,请仔细阅读以下文本,并在Westend测试网络上进行实验。
匿名代理与其他代理类型非常不同。到目前为止,我们描述的代理是由主账户分配为代理的现有账户。这些代理代表主账户行事,减少了主账户私钥的暴露。请记住,我们越频繁地使用账户的私钥来签署交易,就越将该密钥暴露于互联网上,增加了该账户的可见性。因此,代理的目的是将潜在攻击者的注意力从主账户转移开来,因为大部分时间都会使用代理的私钥代表主账户执行操作。
匿名代理是由主账户创建的新账户(而不是分配的)。其次,主账户代表匿名代理充当任何代理。匿名代理是无私钥、非确定性的账户,因为它们没有私钥,但有一个随机生成的地址。从某种意义上说,没有人拥有匿名代理,因为没有人拥有控制它们的私钥。
注:将匿名代理更名为纯代理
匿名代理并不是匿名的,因为它们有一个由主账户生成的地址,该主账户作为任何代理代理它们。即使任意代理发生变化,仍然可以通过使用区块浏览器向后追踪找到生成匿名代理的人。因此,有必要更改匿名代理的名称。人们提议将其称为无私钥账户,因为它们没有私钥,是被代理的账户。然而,多重签名账户也是无私钥的(但是具有确定性)。此外,即使匿名代理是被代理的账户,它们仍然可以通过代理调用来充当代理并控制其他账户(参见下面的多重签名示例)。因此,选择的名称是纯代理。如果你想了解更多有关更名纯代理的原因,请参阅此PR(详情请参见:
https://github.com/paritytech/substrate/pull/12283)中的讨论或波卡论坛(https://forum.polkadot.network/t/parachain-technical-summit-next-steps/51/14)上的讨论。
从现在起,我们将使用"纯代理"而不是"匿名代理"。
创建和移除纯代理
注:
要创建纯代理,请参阅此帮助文章(详情请参见:
https://support.polkadot.network/support/solutions/articles/65000182196),或观看此技术说明视频(详情请参见:
https://www.youtube.com/watch?v=T443RcCYP24)。
注:移除纯代理
删除纯代理的步骤与删除其他代理的步骤不同。请访问此帮助文章(详情请参见:
https://support.polkadot.network/support/solutions/articles/65000182196)上的“删除匿名代理”部分,或观看此技术说明视频(详情请参见:
https://www.youtube.com/watch?v=T443RcCYP24)。
注:有关纯代理的说明视频
通过我们的技术说明视频(详情请参见:
https://www.youtube.com/watch?v=YkYApbhU3i0)了解更多关于纯代理的内容。
纯代理的使用
纯代理的使用严格依赖于纯代理与任意代理之间的关系。请注意,任意代理不一定是最初创建纯代理的人。因此,纯代理并不真正归属于某个人,但它们可以被控制。一旦纯代理与其任意代理之间的关系被破坏,纯代理将无法访问(即使在Polkadot-JS UI上可见)。此外,纯代理是非确定性的,这意味着如果我们丢失一个纯代理,我们从同一主账户创建的下一个纯代理将具有不同的地址。
纯代理无法签署任何内容,因为它们没有私钥。然而,尽管它们没有私钥,也无法直接签署任何交易,但它们可以在【proxy.proxy】调用(proxy calls)中充当代理(或更准确地说,代理通道)。例如,可以在多重签名中使用纯代理。使用代理调用,可以使用任意代理调用纯代理,然后纯代理将进行多重签名调用。稍后将详细介绍。
警告:
一旦解除与任意代理的关系,纯代理将无法访问。此外,纯代理无法签署任何内容。
为什么要使用纯代理?
尽管纯代理存在复杂性和相关风险,但它们具有以下重要优势。
1. 增强安全性
纯代理无法被盗取,因为它们没有私钥。唯一具有对纯代理完全访问权限的账户是任意代理。如果任意代理是多重签名账户,则可以进一步增加安全性。
2. 简化和保证组织层面的账户管理
注:账户管理的教程视频
可以查看此视频教程(详情请参见:
https://www.youtube.com/watch?v=YkYApbhU3i0),了解这种情景下的操作过程。该教程需要对Polkadot-JS UI的Extrinsic Tab有一定熟悉。
使用纯代理的最大好处可能是在公司层面上管理复杂的账户关系。我们以公司X的Charlie、Dan和Eleanor拥有的3个账户为例。Charlie持有属于公司X的资金,但他想要离开公司并将经济责任转移给Eleanor。Dan是Charlie的委托代理。
如果没有纯代理,Charlie必须执行以下步骤(请参见下方图表左侧):
(1)将Dan从委托代理中移除,需要1个签名。
(2)停止提名并解绑所有资金,需要2个签名。
(3)将资金转移到Eleanor,需要1个签名。
然后Eleanor将Dan添加为委托代理(1个签名)。整个过程需要5个签名。这里我们只是举了一个简单的例子,实际上,使用多重签名账户和多个代理时,该过程会更加耗时和繁琐。
使用纯代理(如上图右侧所示),Charlie只需将Eleanor添加为纯代理的任意代理,并删除自己(或者Eleanor可以删除他)。该过程只需要2个签名(1个签名用于添加新的任意代理,1个签名用于删除旧的任意代理)。资金仍然保留在纯代理中,无需停止提名或解绑资金。而且,与纯代理的任意代理关系保持不变。
因此,如果我们使用纯代理,在代理数量增加时,我们始终只需要签署两次(在多重签名账户中不一定适用)。而如果我们不使用纯代理,代理越多,就需要越多的签名来将它们从旧的存储库中分离出来并连接到新的存储库中(参见下图)。
3. 多重签名账户管理
纯代理可用于高效管理多重签名(multisigs)账户。事实上,多重签名是确定性的,这意味着一旦创建了多重签名,签名人就无法更改。如果其中一个签名人想要离开多签账户,就必须创建一个新的多签账户。这很不方便,尤其在企业级管理中,可能需要经常更换多签账户中的签名人。纯代理允许在签名人更改时保持相同的多重身份。
情景一:在多重签名中有一个匿名代理
注:教程视频
你可以参阅此视频教程(详情请参见:
https://www.youtube.com/watch?v=iGRoGstB_pQ),了解这种情景下的操作过程。该教程需要对Polkadot-JS UI的Extrinsic Tab有一定熟悉。
可以将纯代理放置在多重签名中,然后交易将由任意代理代表纯代理(被代理账户)进行签名。让我们以下图为例。Alice、Bob和Anon是多签名ABC的一部分,它是一个阈值为2的多重签名账户。P-C是由Charlie创建的纯代理,现在作为任意代理行动,因此代表P-C签署任何转账。纯代理无法直接签名,因为它没有私钥。
因此,例如,要将资金从多签名账户发送到Dan,Charly需要向P-C提交【proxy.proxy】外源(Extrinsic),然后P-C将提交【multisig.asMulti】外源(Extrinsic)到ABC,其中包含有关【balances.transferKeepAlive】外源(Extrinsic)的调用数据,用于将一些资金从ABC转移到Dan。然后,Alice可以通过提交一个包含有关【balances.transferKeepAlive】外源(Extrinsic)的调用数据的【multisig.asMulti】外源(Extrinsic)来批准转账,将一些资金从ABC转移到Dan。
如果Charly想要离开多签账户,可以向P-C添加一个新的任意代理,并将Charly删除(由他自己或新的任意代理执行)。请注意,多签名账户也包含Bob,在这个特定的示例中没有做任何操作。
注:调用代理
要在多重签名中使用纯代理,你需要使用Extrinsic Tab并生成一个【proxy.proxy】外源(Extrinsic)。如果你尝试使用纯代理签署多重签名交易,你将收到警告。请记住,如果没有私钥,你无法直接签署某些内容。
情景二:由匿名代理组成的多重签名
注:教程视频
你可以查看此视频教程(详情请参见:
https://www.youtube.com/watch?v=F82C3zDNJyk),了解这种情景下的操作过程。该教程需要对Polkadot-JS UI的Extrinsic Tab有一定熟悉。
在上面的图示中,显示了一个仅由纯代理(P-A、P-B和P-C)组成的多重签名。在这种情况下,Alice、Bob或Charly可以随时离开多重签名,而不需要创建新的多重签名。例如,如果Bob离开多重签名,程序将要求将其他人添加为P-B的任意代理,然后Bob可以自行删除(或新的任意代理可以将Bob删除)。
在上面的图示中,Alice向P-A提交【proxy.proxy】外源(Extrinsic),然后P-A提交包含有关从ABC到Dan转移一些通证的【balances.transferKeepAlive】外源(Extrinsic)的【multisig.asMulti】外源(Extrinsic)。然后,Charly执行相同的操作以确认交易。请注意,Charly将需要支付一些计算费用,用于执行交易所需的计算量。