使用作者映射预编译交互¶
概览¶
Moonbeam上的作者映射预编译合约允许收集人候选人通过熟悉且易于使用的Solidity接口,将会话密钥映射至用于支付区块奖励的Moonbeam地址。这将使候选人使用Ledger或任何与Moonbeam兼容的以太坊钱包完成作者映射。但是,建议您在实体隔离的设备上生成您的密钥。更多信息请参考收集人要求页面的账户要求部分。
要成为收集人候选人,您必须运行一个收集人节点。在生成您的会话密钥并将其映射到您的账户之前,您也需要加入一个候选人池,提交一笔保证金并完全同步您的节点。在映射会话密钥时需要支付一笔额外的费用。
预编译位于以下地址:
0x0000000000000000000000000000000000000807
0x0000000000000000000000000000000000000807
0x0000000000000000000000000000000000000807
注意事项
在Moonbeam使用预编译合约时,可能会出现一些意想不到的后果。 请参阅安全注意事项 页面了解更多信息。
作者映射Solidity接口¶
AuthorMappingInterface.sol
是一个Solidity接口,允许开发者与预编译的方法交互。
- removeKeys() — 移除作者ID和会话密钥。替代已弃用的
clearAssociation
extrinsic - setKeys(bytes memory keys) — 接受调用
author_rotateKeys
的结果,这是您的Nimbus和VRF密钥的串联公钥,并立刻设置作者ID和会话密钥。在密钥轮换或迁移后会非常有用。调用setKeys
需要一笔保证金。替代已弃用的addAssociation
和updateAssociation
extrinsics - nimbusIdOf(address who) - 获取给定地址的Nimbus ID。如果给定地址不存在,返回
0
- addressOf(bytes32 nimbusId) - 获取与给定Nimbus ID关联的地址。如果Nimbus ID未知,则返回
0
- keysOf(bytes32 nimbusId) - 获取与给定的Nimbus ID关联的密钥。如果Nimbus ID未知,则返回空字节
以下方式将被弃用,但仍将存在以实现向后兼容性:
- addAssociation(bytes32 nimbusId) — 将您的作者ID从交易发送处映射到H160账户,确保这是私钥的真正所有者。这需要一笔保证金。此方法通过将
keys
默认设置为作者ID来维持向后兼容性 - updateAssociation(bytes32 oldNimbusId, bytes32 newNimbusId) — 将映射从旧的作者ID更新为新的作者ID。在密钥轮换或迁移后会非常有用。这将自动执行
add
和clear
关联的extrinsics,无需第二笔保证金便能启用密钥轮换。此方法通过将newKeys
默认设置为作者ID来维持向后兼容性 - clearAssociation(bytes32 nimbusId) — 清除作者ID与发送交易的H160账户的关联,该帐户需要是该作者ID的所有者。同时,将退还保证金
需要的保证金¶
要跟随本教程操作,您将需要加入候选人池并将您的会话密钥映射到您的H160以太坊格式账户。执行这两个步骤需要两笔保证金。
加入候选人池的最低保证金设置如下:
2000000 GLMR
10000 MOVR
500 DEV
用您的账户映射您的会话密钥时会发送一笔保证金。此保证金由每个会话密钥注册时获得。保证金设置如下:
10000 GLMR
100 MOVR
100 DEV
与Solidity接口交互¶
查看先决条件¶
以下示例将在Moonbase Alpha上演示,但操作步骤也同样适用于Moonbeam和Moonriver。您需要准备以下内容:
- 安装MetaMask并连接至Moonbase Alpha
- 拥有DEV Token的账户。您需要有足够的DEV来支付候选人和映射的保证金加上发送交易和映射会话密钥到您账户的gas费用。要获取足够的DEV Token来遵循本教程操作,您可以通过Moonbeam Discord服务器联系管理员获得。
- 确保您正在运行一个收集人节点且完全同步
- 确保您已加入候选人池
如之前所述,您可以使用Ledger将其连接至MetaMask,详情请参考Ledger教程将您的Ledger导入MetaMask。请注意,不建议您使用Ledger用于生产目的。更多信息请参考收集人要求页面的账户要求部分。
生成会话密钥¶
为了符合Substrate标准,Moonbeam收集人的会话密钥为SR25519。本教程将向您展示如何创建/转换与收集人节点相关联的会话密钥。
首先,请确保您正在运行收集人节点。开始运行收集人节点后,您的终端应出现类似以下日志:
接下来,通过使用author_rotateKeys
方法将RPC调用发送到HTTP端点来创建/转换会话密钥。当您调用 author_rotateKeys
时,结果是两个密钥的大小。回复将包含串联的作者ID(Nimbus 密钥)和VRF密钥。作者ID 用于签署区块并创建与您的H160帐户的关联,以便支付区块奖励。区块生产需要VRF密钥。
举例而言,如果您的收集人HTTP端点位于端口9944
,则JSON-RPC调用可能如下所示:
curl http://127.0.0.1:9944 -H \
"Content-Type:application/json;charset=utf-8" -d \
'{
"jsonrpc":"2.0",
"id":1,
"method":"author_rotateKeys",
"params": []
}'
收集人节点应使用串联的新会话密钥的相应公钥进行回复。0x
前缀后的前64位十六进制字符代表您的作者ID,最后64位十六进制字符是您的VRF会话密钥的公钥。在下一部分映射您的作者ID和设置会话密钥时,您将使用串联的公钥。
确保您已记下串联的会话密钥公钥。您的每台服务器,包括主服务器和备份服务器,都应该拥有其独特的密钥。由于密钥永远不会离开您的服务器,因此您可以将其视为该服务器的唯一ID。
接下来,您将需要注册您的会话密钥并将author ID会话密钥映射到H160以太坊格式的地址(用于接收区块奖励)。
Remix设置¶
首先,获取AuthorMappingInterface.sol
的副本并执行以下操作:
- 点击File explorer标签
- 将文件内容复制并粘贴至命名为
AuthorMappingInterface.sol
的Remix文件
编译合约¶
- 点击Compile标签(从上至下第二个)
- 编译接口,点击Compile AuthorMappingInterface.sol
访问合约¶
- 点击Remix中Compile正下方的Deploy and Run标签。请注意,您不是在此处部署合约,而是访问已经部署的预编译合约
- 确保在ENVIRONMENT下拉菜单中选择Injected Provider - Metamask
- 确保在CONTRACT下拉菜单中选择AuthorMappingInterface.sol。因为这是一个预编译合约,因此无需部署,相反,您需要在At Address字段中提供预编译的地址
- 提供Moonbase Alpha的作者映射预编译地址:
0x0000000000000000000000000000000000000807
并点击At Address
作者映射预编译将出现在Deployed Contracts列表中。
映射会话密钥¶
接下来是将您的会话密钥映射到您的H160账户(以太坊格式的地址)。确保您持有此账户的私钥,此账户将用于支付区块奖励。
要将您的会话密钥映射到您的账户,您需要先加入候选人池。当您成为候选人后,您需要发送一个映射extrinsic。请注意,每个作者ID注册时将绑定一笔保证金。
在开始之前,确保您已连接至您想要映射会话密钥的账户。此账户将用于接收区块奖励。
- 展开AUTHORMAPPING合约
- 展开setKeys方法
- 输入您的会话密钥
- 点击transact
- 点击Confirm确认跳出的MetaMask交易
要验证您的会话密钥是否映射成功,您可以使用mappingWithDeposit
方法或作者映射pallet的nimbusLookup
方法。详情您可以参考收集人账户管理教程的查看映射部分。
| Created: November 9, 2022