cosmos 治理

admin
admin 2023年07月22日
  • 在其它设备中阅读本文章

一、简介

cosmos 使用 gov 模块来提供链上治理功能,让代币持有人拥有共同治理区块链的能力,用户可以通过这个模块提供的接口进行以下操作:

  1. 提交提案:任意用户可以缴纳押金发起提案。一旦达到最低押金,提案就进入投票期
  2. 投票:拥有投票权的用户可以对进入投票期的提案进行投票,有四种投票选项:支持、反对、弃权、否决提案
  3. 查询:查询提案,每一个提交过的提案都有一个唯一 ID,通过这个 ID 可以查询提案内容和投票详情

二、提案

提案包括以下类型:

  • text:纯文本提案
  • community-pool-spend:社区池资金申请
  • software-upgrade:软件升级
  • cancel-software-upgrade:取消软件升级
  • other:其他交易消息,包括参数更新消息

cosmos 的一笔交易里面可以包含多个消息调用,有些消息用户不能直接发送,可以由提案发起,比如说模块参数更新

除了纯文本的提案,其他提案会包含对应的消息调用,如果提案被通过,将会自动执行消息调用,gov 模块有一些治理相关的参数,其他模块也可以提供自己的参数。这些参数包括:

  • min_deposit:最低存款押金
  • min_initial_deposit_ratio:最低初始化存款押金,发起提议时通过的存款
  • max_deposit_period:存款最大持续时间
  • voting_period:投票持续时间
  • quorum:法定人数,参与投票的权重比例,低于这个比例的投票无效
  • threshold:阈值:同意的票所占比例
  • veto_threshold:否决阈值,否决的票所占比例

一般来说,模块的参数更新消息为/cosmos.<模块名称>.v1.MsgUpdateParams,比如治理模块的参数更新消息为/cosmos.gov.v1.MsgUpdateParams

之前有 params 模块,现在已经删除,之前 cosmos 采用消息/cosmos.params.v1beta1.ParameterChangeProposal来统一更新模块参数,现在各个模块自己提供消息接口

三、流程

1、存款阶段

用户发起提案之后,开启 存款阶段 ,对于想要进入下一个阶段的提案,需要在指定时间内存入足够押金。提案的提交方不一定自己存入押金,其他人愿意支付也可以。

任何代币持有者都可以发起提案,也可以为提案存入押金

2、投票阶段

如果提案在指定时间内满足最低存款要求,那么立刻进入 投票阶段 ,在此期间,代币持有人可对该提案进行投票,有 4 个投票选项:支持、反对、弃权、否决提案。

  • 只有权益币有投票权,没有委托质押的币投票无效
  • 投票时一币一票,委托的币越多,投票的权重越大
  • 投票时不会损失或者锁定币,只会根据当前用户质押的币计算投票权重
  • 委托者可以继承验证者的投票,除非委托者自己有过投票。如果委托者自己投票的话,将会覆盖验证者的投票

3、执行阶段

提案被接受至少需要满足如下条件:

  • 法定人数:在投票结束的时候,超过指定数量的权益代币需要参与投票
  • 阈值:超过指定比例的参与投票的代币需要支持该提案
  • 否决阈值:低于指定比例的参与投票的代币对最终决定选择了否决提案

如果在投票阶段结束后没有满足以上条件,则提案无法通过,如果提案被接受,提案中的消息将被执行

如果提案被批准或拒绝,那么提案的押金将会自动退回各自的存款人;如果提案被否决,押金将被销毁;如果存款阶段结束时未达到最低存款需求,押金将被销毁

四、命令行接口

运行一个测试链,并且以修改 gov 模块参数为例

1、准备提案 json 文件

chaind tx gov draft-proposal
  1. 进入提案交互模式,先选择其他类型
  2. 再选择/cosmos.gov.v1.MsgUpdateParams消息
  3. 接下来按提示输入提案信息和存入押金的数量,下面是控制台输出示例
✔ other
✔ /cosmos.gov.v1.MsgUpdateParams
Enter proposal's title: a
Enter proposal's authors: a
Enter proposal's summary: a
Enter proposal's details: a
Enter proposal's proposal forum url: http://a.a
Enter proposal's vote option context: a
Enter proposal deposit: 1000stake
✔ Enter msg's authority: cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn
The draft proposal has successfully been generated.
Proposals should contain off-chain metadata, please upload the metadata JSON to IPFS.
Then, replace the generated metadata field with the IPFS CID.

命令执行结束后会生成元信息文件draft_metadata.json和提案信息文件draft_proposal.json

2、修改提案内容

接下来可按需求修改两个提案文件(提案元消息和参数的新值以及存款数量等等),一般来说可以把元消息放到 ipfs 网络上去,修改的提案内容示例如下:

{
 "messages": [
  {
   "@type": "/cosmos.gov.v1.MsgUpdateParams",
   "authority": "cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn",
   "params": {
    "min_deposit": [{"amount":"10000000","denom":"stake"}],
    "max_deposit_period": "172800s",
    "voting_period": "172800s",
    "quorum": "0.334",
    "threshold": "0.5",
    "veto_threshold": "0.334",
    "min_initial_deposit_ratio": "0",
    "burn_vote_quorum": false,
    "burn_proposal_deposit_prevote": false,
    "burn_vote_veto": true
   }
  }
 ],
 "metadata": "ipfs://CID",
 "deposit": "1000stake",
 "title": "a",
 "summary": "a"
}

提案中所有参数都需要填写,如果不需要更新某个值,可以填写旧值,chaind query gov params命令查看模块参数当前值

3、发送提案交易

使用刚才修改好的提案 json 文件发起提案

chaind tx gov submit-proposal draft_proposal.json --from key0

提案 id 可以通过交易哈希查到,也可以使用接口查询所有提案chaind query gov proposals

4、存款押金

给 ID 为 1 的提案的存入押金

chaind tx gov deposit 1 10000000stake --from key0

5、投票

给 ID 为 1 的提案的投赞成票(yes、no、no_with_veto、abstain)

chaind tx gov vote 1 yes --from key0

6、查询

查询 ID 为 1 的提案的信息

chaind query gov proposal  1

查询 ID 为 1 的提案的投票统计

chaind query gov tally 1

查询 ID 为 1 的提案的所有投票

chaind query gov votes 1