通过治理机制修改链上配置
通过治理机制修改链上配置

关于链上治理的介绍请参看 去中心化组织治理, 这是一个例子,演示如何通过 cli 修改链上配置。

下面我们看一个修改 PublishOption 的例子。

修改 PublishOption 的配置:

1.把 PublishOption 修改为 Open 状态 (缺省是Locked),发起投票。

# 解锁节点账号,用节点账号发起提案。注意:以下用到的账户(0xc95f6a6f3845f09395a422b2f9959a97)都需要替换成自己的账户。
account unlock 0xc95f6a6f3845f09395a422b2f9959a97
account execute-function -s 0xc95f6a6f3845f09395a422b2f9959a97 --function 0x1::OnChainConfigScripts::propose_update_txn_publish_option --arg true true 0

提案发起后,用户需要等待公示期过后才能开始投票。 可以使用如下命令查看提案信息。

dev call --function 0x1::Dao::proposal_info -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::TransactionPublishOption::TransactionPublishOption> --arg 0xc95f6a6f3845f09395a422b2f9959a97

返回结果包含了五个值,依次是:proposal_id,投票开始时间,投票结束时间,赞成票数,反对票数。

{
  "ok": [
    0,
    72240,
    3672240,
    0,
    0
  ]
}

2.用户投票

投票的用户需要 balance 不能为 0,可以通过挖矿或者其他账户转账的方式获得。

# 解锁投票用户
account unlock 0xf941b3d2461e780a0e4f8cc374822fe8
account execute-function -s 0xf941b3d2461e780a0e4f8cc374822fe8 --function 0x1::DaoVoteScripts::cast_vote -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::TransactionPublishOption::TransactionPublishOption> --arg 0xc95f6a6f3845f09395a422b2f9959a97 --arg 0 --arg true --arg 2000000000000000u128

投票完成,需要等待投票期结束。注意,第一个参数 0 表示 proposal id 是 0。第二个参数 true 表示赞成,第三个参数是投的 token 数量。

3.执行提案

执行提案前,可以通过以下命令查看提案状态:

dev call --function 0x1::Dao::proposal_state -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::TransactionPublishOption::TransactionPublishOption> --arg 0xc95f6a6f3845f09395a422b2f9959a97 0

返回:(如果返回结果是 4,说明提案通过,其他提案状态可以参考标准库文档) 注意: Dao的提案通过后的执行脚本都一样,需要注意proposal_id参数,当前示例是0

放入待执行对列:

# 用节点账号将通过后的提案入队列
account execute-function -s 0xc95f6a6f3845f09395a422b2f9959a97 --function 0x1::Dao::queue_proposal_action -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::TransactionPublishOption::TransactionPublishOption> --arg 0xc95f6a6f3845f09395a422b2f9959a97 --arg 0

检查提案状态,待执行公示期过后:

#必须由提案提交者发起交易执行提案。(这里有点坑,命令里节省了proposer参数,导致必须由提案提交者发起交易)
account execute-function -s 0xc95f6a6f3845f09395a422b2f9959a97 --function 0x1::OnChainConfigScripts::execute_on_chain_config_proposal -t 0x1::TransactionPublishOption::TransactionPublishOption --arg 0

4.取回质押的 Token

account execute-function -s 0xc95f6a6f3845f09395a422b2f9959a97 --function  0x1::DaoVoteScripts::unstake_vote -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::TransactionPublishOption::TransactionPublishOption> --arg 0xc95f6a6f3845f09395a422b2f9959a97 0

5.最后清理掉完成的提案,验证参数是否正确

account execute-function -s 0xc95f6a6f3845f09395a422b2f9959a97 --function 0x1::Dao::destroy_terminated_proposal -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::TransactionPublishOption::TransactionPublishOption> --arg 0xc95f6a6f3845f09395a422b2f9959a97 0

恭喜你,整个修改流程就完成了。

下面我们看一个修改 Consensus 配置的例子。

修改 Consensus 的配置:

1.把 base_reward_per_block 设为新的值,发起投票。

account execute-function -s 0xc95f6a6f3845f09395a422b2f9959a97 --function 0x1::OnChainConfigScripts::propose_update_consensus_config --arg 500 10000 10000000000u128 10 240 24 5000 60000 2 50000000 3u8 0

提案发起后,用户需要等待公示期过后才能开始投票。 可以使用如下命令查看提案信息。

dev call --function 0x1::Dao::proposal_info -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::ConsensusConfig::ConsensusConfig> --arg 0xc95f6a6f3845f09395a422b2f9959a97

2.用户投票

投票的用户需要 balance 不能为 0,可以通过挖矿或者其他账户转账的方式获得。

account execute-function -s 0xf941b3d2461e780a0e4f8cc374822fe8 --function 0x1::DaoVoteScripts::cast_vote -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::ConsensusConfig::ConsensusConfig> --arg 0xc95f6a6f3845f09395a422b2f9959a97 --arg 1 --arg true --arg 2000000000000000u128

投票完成,需要等待投票期结束。注意,第一个参数 1 表示 proposal id 是 1。第二个参数 true 表示赞成,第三个参数是投的 token 数量。

3.执行提案

执行提案前,可以通过以下命令查看提案状态:

dev call --function 0x1::Dao::proposal_state -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::ConsensusConfig::ConsensusConfig> --arg 0xc95f6a6f3845f09395a422b2f9959a97 1

返回:(如果返回结果是 4,说明提案通过,其他提案状态可以参考标准库文档) 注意: Dao的提案通过后的执行脚本都一样,需要注意proposal_id参数,当前示例是1

放入待执行对列:

# 用节点账号将通过后的提案入队列
account execute-function -s 0xc95f6a6f3845f09395a422b2f9959a97 --function 0x1::Dao::queue_proposal_action -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::ConsensusConfig::ConsensusConfig> --arg 0xc95f6a6f3845f09395a422b2f9959a97 1

检查提案状态,待执行公示期过后:

#必须由提案提交者发起交易执行提案。
account execute-function -s 0xc95f6a6f3845f09395a422b2f9959a97 --function 0x1::OnChainConfigScripts::execute_on_chain_config_proposal -t 0x1::ConsensusConfig::ConsensusConfig --arg 1

4.取回质押的 Token

account execute-function -s 0xf941b3d2461e780a0e4f8cc374822fe8 --function 0x1::DaoVoteScripts::unstake_vote -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::ConsensusConfig::ConsensusConfig> --arg 0xc95f6a6f3845f09395a422b2f9959a97 --arg 1

5.最后清理掉完成的提案,验证参数是否正确

account execute-function -s 0xc95f6a6f3845f09395a422b2f9959a97 --function 0x1::Dao::destroy_terminated_proposal -t 0x1::STC::STC -t 0x1::OnChainConfigDao::OnChainConfigUpdate<0x1::ConsensusConfig::ConsensusConfig> --arg 0xc95f6a6f3845f09395a422b2f9959a97 1