与代理预编译交互¶
概览¶
Moonbeam上代理预编译允许账户设置代理账户以作为代表执行有限数量的操作,例如治理、质押或余额转移。
若一个用户想要为另一个用户提供执行有限数量操作的权限,传统方式只有将第一个账户的私钥提供给第二个账户才能实现。而Moonbeam包含了能够启用代理账户的Substrate代理Pallet。代理帐户的作用是其提供了额外的安全层,可以为主帐户执行操作。举例来说,如果一个用户希望将其主账户安全存放于冷钱包中,同时仍想要访问钱包的部分功能(例如治理或质押),这是最好的选择。
要了解关于代理账户的更多信息以及如何在无需使用代理预编译的情况下根据自身需求设置代理账户,请查看设置代理账户页面。
目前代理预编译仅可在Moonbase Alpha上使用,且位于以下地址:
0x000000000000000000000000000000000000080b
代理Solidity接口¶
Proxy.sol
是一个接口,通过Solidity合约可以与代理Pallet交互。您无需熟悉Substrate API,您可直接使用您所熟悉的以太坊接口与之交互。
接口包含以下函数:
- addProxy(address delegate, ProxyType proxyType, uint32 delay) - 达到特定的
delay
区块数量(一般为0)后,为发送者注册一个代理账户。若调用者的代理已存在,此函数将会失败 - removeProxy(address delegate, ProxyType proxyType, uint32 delay) - 为发送者移除已注册的代理
- removeProxies() - 移除委托给发送者的所有代理账户
- isProxy(address real, address delegate, ProxyType proxyType, uint32 delay) - 若委托地址为
proxyType
类型的代理则返回布尔值true
,地址real
会有指定的delay
代理类型¶
可以委托账户的代理角色有多种类型,其中通过ProxyType
枚举在Proxy.sol
中表示。以下列表包含所有可能的代理以及可以代表主账户执行的交易类型:
- Any - 任何代理将允许代理账户执行任何类型的交易
- NonTransfer - 非转账代理将允许代理账户执行任何类型的交易,除余额转账以外
- Governance - 治理代理将允许治理账户执行任何治理类型的相关交易(包括民主或理事会Pallet)
- Staking - 质押代理将允许代理账户执行质押相关的交易
- CancelProxy - 取消代理允许代理账户拒绝和移除延迟的主账户代理公告
- Balances - 余额代理将允许代理账户仅执行余额转账
- AuthorMapping - 此类型的代理账户仅供收集人使用,将服务从一个服务迁移至另一个服务器
- IdentityJudgement - 身份验证代理将允许代理账户判断和验证波卡上账户相关的个人信息
注意事项
在Moonbeam使用预编译合约时,可能会出现一些意想不到的后果。 请参阅安全注意事项 页面了解更多信息。
与Solidity接口交互¶
查看先决条件¶
以下示例在Moonbase Alpha上演示,步骤也同样适用于Moonbeam和Moonriver。首先,您需要准备以下内容:
- 安装MetaMask并连接至Moonbase Alpha
- 拥有DEV的账户。 您可以每24小时一次从Moonbase Alpha水龙头上获取DEV代币以在Moonbase Alpha上进行测试
- 第二个账户,将作为代理账户(资金可选)
Remix设置¶
开始之前,获取Proxy.sol
副本,并执行以下步骤:
-
点击File explorer标签
-
复制文件内容并粘贴至名为
Proxy.sol
的Remix文件
编译合约¶
- 点击Compile标签(从上至下第二个)
- 然后编译接口,点击Compile Proxy.sol
访问合约¶
- 在Remix的Compile下方,点击Deploy and Run标签。请注意,您不是在此处部署合约,而是访问一个已经部署的预编译合约
- 确保在ENVIRONMENT下拉菜单中已选择Injected Provider - Metamask
- 确保在CONTRACT下拉菜单中已选择Proxy.sol。因为这是一个预编译的合约,因此您无需部署,但是您需要在At Address字段中提供预编译的地址
- 为Moonbase Alpha提供代理预编译的地址:
0x000000000000000000000000000000000000080b
并点击At Address - 代理预编译将出现在Deployed Contracts列表中
添加代理¶
若您的账户尚未设置代理,您可以通过代理预编译为您的账户添加代理。在本示例中,您将添加余额代理至账户。为此,您可以执行以下步骤:
- 展开代理预编译合约,您可以看到可用的函数
- 找到addProxy函数并点击按钮展开此部分
- 在delegate一栏输入您的第二个账户地址,将proxyType设置为
5
,将delay设置为0
- 点击transact按钮并在MetaMask确认交易
注意事项
在Remix中构建交易时,proxyType表示为uint8
,而不是预期的ProxyType
枚举。在Solidity中,枚举被编译为uint8
,因此当您将proxyType设置为5
时,这将指示ProxyType
枚举中的第6个元素,即余额代理。
查看代理是否成功添加¶
您可以确定一个帐户是否是主帐户的代理帐户。在此示例中,您将输入上一部分添加的代理参数以确定代理帐户是否添加成功:
- 找到isProxy函数并点击按钮展开此部分
- 在real一栏输入您的主账户地址,在delegate一栏输入您的第二个账户地址,将proxyType设置为
5
,将delay设置为0
- 点击call按钮
若一切无误,后台将输出true
。
移除代理¶
您可以通过代理预编译将代理从您的账户移除。在本示例中,您将从您的代理账户移除上一部分添加的余额代理。为此,您可以执行以下步骤:
- 展开代理预编译合约,您可以看到可用的函数
- 找到removeProxy函数并点击按钮展开此部分
- 在delegate一栏输入您的第二个账户地址,将proxyType设置为
5
,将delay设置为0
- 点击transact按钮并在MetaMask确认交易
交易确认之后,如果您重复 查看代理是否成功添加步骤,结果将显示false
。
这样就可以了!您已成功完成代理预编译。关于设置代理的其他参考资料可在设置代理账户页面和波卡文档库的代理账户页面找到。若您有任何关于代理预编预方面的问题,欢迎随时在Discord上与我们取得联系。
Created: September 30, 2022