cosmos 治理
一、简介
cosmos 使用 gov 模块来提供链上治理功能,让代币持有人拥有共同治理区块链的能力,用户可以通过这个模块提供的接口进行以下操作:
- 提交提案:任意用户可以缴纳押金发起提案。一旦达到最低押金,提案就进入投票期
- 投票:拥有投票权的用户可以对进入投票期的提案进行投票,有四种投票选项:支持、反对、弃权、否决提案
- 查询:查询提案,每一个提交过的提案都有一个唯一 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
- 进入提案交互模式,先选择其他类型
- 再选择
/cosmos.gov.v1.MsgUpdateParams
消息 - 接下来按提示输入提案信息和存入押金的数量,下面是控制台输出示例
✔ 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