与Preimage Precompile交互¶
概览¶
作为波卡(Polkadot)平行链和去中心化网络,Moonbeam具有原生链上治理功能,使利益相关者能够参与网络的发展方向。随着OpenGov(也称为Governance v2)的推出,Preimage Pallet允许Token持有者通过提交原像(即提案中要在链上执行的操作)执行创建提案的第一步。提交提案需要用到原像哈希。了解关于Moonbeam治理系统的更多信息,例如相关专业术语、提案流程等,请参考Moonbeam上的治理页面。
Preimage Precompile直接与Substrate的Preimage Pallet交互。此pallet以Rust编码,通常不能从Moonbeam的以太坊端访问。然而,Preimage Precompile允许您从Solidity接口访问创建和管理原像所需的函数,所有这些函数均是Substrate Preimage Pallet的一部分。
Preimage Precompile目前可用于OpenGov(即仅可在Moonriver和Moonbase Alpha上使用)。如果您想在Moonbeam上使用类似功能,即Governance v1,请参考Democracy Precompile文档。
Preimage Precompile位于以下地址:
0x0000000000000000000000000000000000000813
0x0000000000000000000000000000000000000813
注意事项
在Moonbeam使用预编译合约时,可能会出现一些意想不到的后果。 请参阅安全注意事项 页面了解更多信息。
Preimage Solidity接口¶
Preimage.sol
是一个Solidity接口,允许开发者使用预编译的两个函数交互:
- notePreimage(bytes memory encodedPropsal) - 给定编码的提案,为即将到来的提案在链上注册原像并返回原像哈希。这不需要提案在分配列队中,但需要一笔保证金,该保证金将在提案生效后退还。使用preimage pallet的
notePreimage
函数 - unnotePreimage(bytes32 hash) - 给定要删除的原像哈希,从存储中清除未请求的原像。使用preimage pallet的
unnotePreimage
函数
接口也包含以下事件:
- PreimageNoted(bytes32 hash) - 当原像在链上注册时发出
- PreimageUnnoted(bytes32 hash) - 当原像在链上注销时发出
与Solidity接口交互¶
查看先决条件¶
以下示例为在Moonbase Alpha上演示,但是步骤也同样适用于Moonriver。开始操作之前,您需要准备以下内容:
- 安装MetaMask并连接至Moonbase Alpha
- 拥有DEV Token的账户。 您可以每24小时一次从Moonbase Alpha水龙头上获取DEV代币以在Moonbase Alpha上进行测试
Remix设置¶
-
点击File explorer标签
-
将
Preimage.sol
复制粘贴至Remix文档,命名为Preimage.sol
编译合约¶
-
点击Compile标签(从上至下第二个)
-
然后在编译界面,点击Compile Preimage.sol
获取合约¶
-
点击位于Remix的Compile标签正下方的Deploy and Run标签。请注意:您并不是在此部署合约,您是在获取一个已经部署的预编译合约
-
确保在ENVIRONMENT下拉菜单中已选择Injected Provider - Metamask
-
确保在CONTRACT下拉菜单中已选择Preimage.sol。由于这是一个预编译的合约,因此无需部署,但是您需要在At Address字段中提供预编译的地址
-
为Moonbase Alpha提供Preimage Precompile的地址:
0x0000000000000000000000000000000000000813
并点击At Address -
Preimage Precompile将会出现在Deployed Contracts列表当中
提交提案原像¶
要提交提案,您需要先提交该提案的原像,即本质上定义提议的链上操作。您可以使用Preimage Precompile的notePreimage
函数提交原像。notePreimage
函数接受编码的提案,因此您需要先获取编码的提案,可通过使用Polkadot.js Apps轻松获得。
在本节中,您将获得提案的原像哈希和编码后的提案数据。要获取原像哈希,您首先需要导航至Polkadot.js Apps的Preimage页面:
- 导航至Governance 标签页
- 从下拉菜单里选择Preimages
- 在Preimages页面点击+ Add preimage
然后执行以下步骤:
- 选取一个账户(任何账户皆可,因为您不需要提交任何交易)
- 选取您希望交互的pallet以及可调度的函数(或是动作)以进行提案。您选取的动作将会决定您随后的操作步骤。在此例子中,此为system pallet和remark函数
- 输入remark函数的内容,确保其为独特的。重复的提案如“Hello World!”将不会被接受
- 复制原像哈希,这代表着此提案。您将会在通过民主预编译提交提案时使用此哈希
- 点击Submit preimage按钮,但请不要在下一页签署和确认此交易
在下个页面,根据以下步骤进行操作:
- 点击三角形图像以显示字节状态下带编码的提案
- 复制带编码的提案——您将在随后步骤中使用notePreimage时用到它
注意事项
请不要在此签署和提交交易。您将会在随后步骤中通过notePreimage提交此信息。
现在,您可以获取从Polkadot.js Apps获得的编码提案的bytes,并通过Preimage Precompile的notePreimage
函数提交。要通过notePreimage
函数提交原像,请执行以下步骤:
-
展开Preimage Precompile合约查看可用函数
-
找到notePreimage函数,点击按钮展开此部分
-
输入上述部分获得的编码提案的bytes。请注意,编码提案并非与原像哈希相同,确保您在此字段输入正确的数值
-
点击transact并在MetaMask确认交易
现在你已经为您的提案提交原像,您可以提交提案了!关于如何提交提案,请参考Referenda Precompile文档。
如果您想要移除原像,除了使用unnotePreimage
函数,以及将编码的提案替换成原像哈希以外,您可以遵循以上步骤操作。
| Created: March 17, 2023