与Referenda Precompile交互¶
概览¶
作为波卡(Polkadot)平行链和去中心化网络,Moonbeam具有原生链上治理功能,使利益相关者能够参与网络的发展方向。随着OpenGov(也称为Governance v2)的推出,Referenda Pallet允许Token持有者获取现有公投的信息,提交提案促使其进入公投阶段,管理与(提案进入公投所需的)决定保证金相关的操作。了解关于Moonbeam治理系统的更多信息,例如相关专业术语、原则、机制等,请参考Moonbeam上的治理页面。
Referenda Precompile直接与Substrate的Referenda Pallet交互。此pallet以Rust编码,通常不能从Moonbeam的以太坊端访问。然而,Referenda Precompile允许您直接从Solidity接口访问查看公投、提交公投和管理所需决定保证金的函数,所有这些函数均是Substrate Referenda Pallet的一部分。
Referenda Precompile目前可用于OpenGov(即仅可在Moonriver和Moonbase Alpha上使用)。如果您想在Moonbeam上使用类似功能,即Governance v1,请参考Democracy Precompile文档。
Referenda Precompile位于以下地址:
0x0000000000000000000000000000000000000811
0x0000000000000000000000000000000000000811
注意事项
在Moonbeam使用预编译合约时,可能会出现一些意想不到的后果。 请参阅安全注意事项 页面了解更多信息。
Referenda Solidity接口¶
Referenda.sol
是一个Solidity接口,允许开发者使用预编译的函数交互。具体函数如下所示:
- referendumCount() - 只读函数,返回公投总数
- submissionDeposit() - 只读函数,返回每个公投所需的提交保证金
- decidingCount(uint16 trackId) - 只读函数,返回给定Track的决定公投总数
- trackIds() - 只读函数,返回所有Tracks(和Origins)的Track ID列表
-
trackInfo(uint16 trackId) - 只读函数,返回为给定Track ID配置的以下治理参数:
- string name - Track名称
- uint256 maxDeciding - 单次可以决定的公投数量上限
- uint256 decisionDeposit - 决定保证金的金额
- uint256 preparePeriod - 准备期时长
- uint256 decisionPeriod - 决定期时长
- uint256 confirmPeriod - 确认期时长
- uint256 minEnactmentPeriod - 生效等待期最短时长
- bytes minApproval - 公投批准所需的最低“赞成”票数占整体信念值权重投票的比例
- bytes minSupport - 公投批准所需的最低“赞成”票数(不考虑信念值权重投票)占总供应量的比例
-
referendumStatus(uint32 referendumIndex) - 只读函数,返回给定公投的状态的。
ReferendumStatus
enum定义以下可能出现的状态:enum ReferendumStatus { Ongoing, Approved, Rejected, Cancelled, TimedOut, Killed }
-
ongoingReferendumInfo(uint32 referendumIndex) - 只读函数,返回与正在进行中的公投相关的以下信息:
- uint16 trackId - 此公投的Track
- bytes origin - 此公投的Origin
- bytes proposal - 公投的提案哈希
- bool enactmentType - 如果提案计划在生效等待期被分配则为
true
,如果在生效等待期之后被分配则为false
- uint256 enactmentTime - 提案计划生效的时间
- uint256 submissionTime - 提交时间
- address submissionDepositor - 提交保证金存款人的地址
- uint256 submissionDeposit - 提交保证金的金额
- address decisionDepositor - 决定保证金存款人的地址
- uint256 decisionDeposit - 决定保证金的金额
- uint256 decidingSince - 公投进入决定期的时间。如果还在确认中,结束时间将被延期至确认期结束
- uint256 decidingConfirmingEnd - 此公投持续达到支持数量将计划离开确认期的时间
- uint256 ayes - “赞成”票数量(包含信念值锁定的投票数)
- uint32 support - “赞成”票(不包含信念值)占总投票数的比例
- uint32 approval - “赞成”票占总票数(包含“赞成”票和“反对”票)的比例
- bool inQueue - 公投进入决定期的等待列队则为
true
,反之则为false
- uint256 alarmTime - 提醒下一次的开始时间
- bytes taskAddress - 调度者的任务地址(如果成功调度)
-
closedReferendumInfo(uint32 referendumIndex) - 只读函数,返回与已结束的公投相关的以下信息:
- uint256 end - 公投结束时间
- address submissionDepositor - 提交保证金存款人的地址
- uint256 submissionDeposit - 提交保证金的金额
- address decisionDepositor - 决定保证金存款人的地址
- uint256 decisionDeposit - 决定保证金的金额
-
killedReferendumBlock(uint32 referendumIndex) - 只读函数,返回给定公投被终止的区块
- submitAt(uint16 trackId, bytes32 proposalHash, uint32 proposalLen, uint32 block) - 根据给定的对应于分配提案的origin的Track ID、提议的Runtime调用的原像哈希、提案长度和在上面执行此提案的区块号,提交公投。返回提交公投的公投索引
- submitAfter(uint16 trackId, bytes32 proposalHash, uint32 proposalLen, uint32 block) - 根据给定的对应于分配提案的origin的Track ID、提议的Runtime调用的原像哈希、提案长度和在此之后执行此提案的区块号,提交公投。返回提交公投的公投索引
- placeDecisionDeposit(uint32 index) - 根据正在进行中公投的索引发布公投决定保证金
- refundDecisionDeposit(uint32 index) - 根据已结束公投的索引(其中决定保证金仍被锁定),将已结束公投的决定保证金退还给存款人
- refundSubmissionDeposit(uint32 index) - 根据已结束公投的索引,将已结束公投的提交保证金退还给存款人
接口也包含以下事件:
- SubmittedAt(uint16 indexed trackId, uint32 referendumIndex, bytes32 hash) - 当提案在给定区块提交时发出
- SubmittedAfter(uint16 indexed trackId, uint32 referendumIndex, bytes32 hash) - 当提案在给定区块之后提交时发出
- DecisionDepositPlaced(uint32 index, address caller, uint256 depositedAmount) - 当公投的决定保证金存入时发出
- DecisionDepositRefunded(uint32 index, address caller, uint256 refundedAmount) - 当已结束提案的决定保证金被退还时发出
- SubmissionDepositRefunded(uint32 index, address caller, uint256 refundedAmount) - 当有效提案的提交保证金被退还时发出
与Solidity接口交互¶
查看先决条件¶
以下示例为在Moonbase Alpha上演示,但是步骤也同样适用于Moonriver。开始操作之前,您需要准备以下内容:
- 安装MetaMask并连接至Moonbase Alpha
- 拥有DEV Token的账户。 您可以每24小时一次从Moonbase Alpha水龙头上获取DEV代币以在Moonbase Alpha上进行测试
Remix设置¶
-
点击File explorer标签
-
将
Referenda.sol
复制粘贴至Remix文档,命名为Referenda.sol
编译合约¶
-
点击Compile标签(从上至下第二个)
-
然后在编译界面,点击Compile Referenda.sol
获取合约¶
-
点击位于Remix的Compile标签正下方的Deploy and Run标签。请注意:您并不是在此部署合约,您是在获取一个已经部署的预编译合约
-
确保在ENVIRONMENT下拉菜单中已选择Injected Provider - Metamask
-
确保在CONTRACT下拉菜单中已选择Referenda.sol。由于这是一个预编译的合约,因此无需部署,但是您需要在At Address字段中提供预编译的地址
-
为Moonbase Alpha提供Referenda Precompile的地址:
0x0000000000000000000000000000000000000811
并点击At Address -
Referenda Precompile将会出现在Deployed Contracts列表当中
提交提案¶
要提交提案,您需要先提交该提案的原像。您可以通过Preimage Precompile文档中的步骤完成此操作。提交提案将用到两个函数:submitAt
和submitAfter
。submitAt
函数用于提交在给定区块执行的提案,而submitAfter
函数用于提交在给定区块之后执行的提案。在本示例中将使用submitAt
函数,但是步骤也同样适用于submitAfter
函数。
要提交提案,您需要先确定您的提案属于哪个Track以及Track的Track ID。具体请参考治理概览页面的OpenGov部分。
请确保您已获取原像哈希和原像长度,这两者可通过Preimage Precompile文档中的操作步骤获取。另外,您也可以通过Polkadot.js Apps的Preimage页面复制原像哈希。要获取原像长度,您可在Polkadot.js Apps Chain State页面使用preimage
pallet的preimageFor
函数查询。
当您获取Track ID、原像哈希和原像长度后,您可以使用Referenda Precompile提交提案。在Remix,请执行以下步骤:
-
展开Referenda Precompile合约查看可用函数
-
找到submitAt函数,点击按钮展开此部分
-
输入提案的Track ID
-
输入原像哈希。您可通过Preimage Precompile文档的操作步骤获取
-
输入原像长度
-
输入执行原像的区块号
-
点击transact并在MetaMask确认交易
交易确认后,您将看到提案出现在Polkadot.js Apps的Referenda页面中。您也可以前往Polkassembly查看提案(Polkassembly根据Track来分类提案)。
提交决定保证金¶
现在您已提交提案,接下来是提交决定保证金。决定保证金(Decision Deposit)是公投在带入期结束时进入决定期所需的最低保证金金额。关于决定保证金的更多信息,请参考治理页面的OpenGov部分。
您可以使用Referenda Precompile的placeDecisionDeposit
函数提交决定保证金。您将需要用到公投的索引和足够的资金来完成此步骤。根据Track的不同决定保证金的金额也将不同,关于每个Track所需的最低保证金要求,请参考治理页面的Track基本参数表格。
要提交保证金,请执行以下步骤:
-
找到placeDecisionDeposit函数,点击按钮展开此部分
-
输入公投的索引
-
点击transact并在MetaMask确认交易
现在已存入决定保证金,距离公投进入决定期又更近了一步。接下来要确保在指定的Track中有足够的容量并且必须通过准备期才能进入决定期。
要参与公投,请参考Conviction Voting Precompile文档中的操作步骤。
退还决定保证金¶
一旦公投通过或者拒绝,决定保证金将被退还。但是此步骤的前提是公投没有因为评判为不良公投被取消。如果提案被评判为不良公投并通过Emergency Killer Track被终止,则决定保证金将被没收。
要退还决定保证金,您可以使用Referenda Precompile的refundDecisionDeposit
函数。然后,请执行以下步骤:
-
找到placeDecisionDeposit函数,点击按钮展开此部分
-
输入公投的索引
-
点击transact并在MetaMask确认交易
这样就可以了!您已经基本了解Referenda Precompile。在Referenda.sol
文档中记录了更多的函数,如果您对这些函数或在Referenda Precompile方面有任何问题,请随时在Discord上联系我们。
| Created: March 17, 2023