Skip to content

与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位于以下地址:

0x0000000000000000000000000000000000000811
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。开始操作之前,您需要准备以下内容:

Remix设置

  1. 点击File explorer标签
  2. Referenda.sol复制粘贴至Remix文档,命名为Referenda.sol

Copy and paste the Referenda Solidity interface into Remix.

编译合约

  1. 点击Compile标签(从上至下第二个)
  2. 然后在编译界面,点击Compile Referenda.sol

Compile the Referenda.sol interface using Remix.

获取合约

  1. 点击位于Remix的Compile标签正下方的Deploy and Run标签。请注意:您并不是在此部署合约,您是在获取一个已经部署的预编译合约
  2. 确保在ENVIRONMENT下拉菜单中已选择Injected Provider - Metamask
  3. 确保在CONTRACT下拉菜单中已选择Referenda.sol。由于这是一个预编译的合约,因此无需部署,但是您需要在At Address字段中提供预编译的地址
  4. 为Moonbase Alpha提供Referenda Precompile的地址:0x0000000000000000000000000000000000000811并点击At Address
  5. Referenda Precompile将会出现在Deployed Contracts列表当中

Access the Referenda.sol interface by provide the precompile's address.

提交提案

要提交提案,您需要先提交该提案的原像。您可以通过Preimage Precompile文档中的步骤完成此操作。提交提案将用到两个函数:submitAtsubmitAftersubmitAt函数用于提交给定区块执行的提案,而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,请执行以下步骤:

  1. 展开Referenda Precompile合约查看可用函数
  2. 找到submitAt函数,点击按钮展开此部分
  3. 输入提案的Track ID
  4. 输入原像哈希。您可通过Preimage Precompile文档的操作步骤获取
  5. 输入原像长度
  6. 输入执行原像的区块号
  7. 点击transact并在MetaMask确认交易

Submit the proposal using the submitAt function of the Referenda Precompile.

交易确认后,您将看到提案出现在Polkadot.js AppsReferenda页面中。您也可以前往Polkassembly查看提案(Polkassembly根据Track来分类提案)。

提交决定保证金

现在您已提交提案,接下来是提交决定保证金。决定保证金(Decision Deposit)是公投在带入期结束时进入决定期所需的最低保证金金额。关于决定保证金的更多信息,请参考治理页面的OpenGov部分

您可以使用Referenda Precompile的placeDecisionDeposit函数提交决定保证金。您将需要用到公投的索引和足够的资金来完成此步骤。根据Track的不同决定保证金的金额也将不同,关于每个Track所需的最低保证金要求,请参考治理页面的Track基本参数表格

要提交保证金,请执行以下步骤:

  1. 找到placeDecisionDeposit函数,点击按钮展开此部分
  2. 输入公投的索引
  3. 点击transact并在MetaMask确认交易

Place the Decision Deposit for a Referenda using the placeDecisionDeposit function of the Referenda Precompile.

现在已存入决定保证金,距离公投进入决定期又更近了一步。接下来要确保在指定的Track中有足够的容量并且必须通过准备期才能进入决定期。

要参与公投,请参考Conviction Voting Precompile文档中的操作步骤。

退还决定保证金

一旦公投通过或者拒绝,决定保证金将被退还。但是此步骤的前提是公投没有因为评判为不良公投被取消。如果提案被评判为不良公投并通过Root Track或Emergency Killer Track被终止,则决定保证金将被没收。

要退还决定保证金,您可以使用Referenda Precompile的refundDecisionDeposit函数。然后,请执行以下步骤:

  1. 找到placeDecisionDeposit函数,点击按钮展开此部分
  2. 输入公投的索引
  3. 点击transact并在MetaMask确认交易

Refund the Decision Deposit for a Referenda using the placeDecisionDeposit function of the Referenda Precompile.

这样就可以了!您已经基本了解Referenda Precompile。在Referenda.sol文档中记录了更多的函数,如果您对这些函数或在Referenda Precompile方面有任何问题,请随时在Discord上联系我们。

Last update: January 25, 2024
| Created: March 17, 2023