Qtum 量子链的分布式自治协议(Decentralized Governance Protocol,DGP)是基于 Qtum 实现的链上协议,协议允许通过链上提案和投票系统对共识参数进行更改。提案一旦投票通过,就可以在不分叉主链的情况下对参数进行无缝调整。目前在Qtum链上部署了4个DGP合约,分别用于对4个共识参数进行动态控制:
· 区块大小: 区块的最大容量
· 默认是2 Mb, DGP 合约: 0000000000000000000000000000000000000081
· 最小Gas价格: 区块创建者可接受的最小Gas价格
· 默认是 40 satoshis, DGP 合约: 0000000000000000000000000000000000000082
· 区块Gas限制:一个区块所能消耗的最大Gas数
· 默认是4千万, DGP 合约: 0000000000000000000000000000000000000084
· EVM Gas调度: 每个EVM操作花费的Gas
· DGP 合约: 0000000000000000000000000000000000000080
将控制这4个常见的区块链参数的智能合约嵌入到 Qtum 主网的创世块的原因是:这4个参数是Qtum链中最为关键的几个参数,使用智能合约对它们进行动态更改,可以最大程度地减少对区块链网络的影响。
可以使用DGP合约来添加更多的可控参数,但这个过程需要执行一次硬分叉。因为需要对共识编码进行修改,才能让链上已经存储的参数值变得可控。
DGP 工作原理
每一个可被 DGP 合约控制的参数都需要独立部署一个相应的 DGP 合约。Qtum 客户端会从控制参数的各个 DGP 合约中获取每个区块共识下的 DGP 合约所控参数的值。
客户端如果没有读取到DGP合约中存储的参数值,就会直接返回在客户端代码中所定义的该参数的初始值。
DGP 合约管理席(管理人员)的任务是在需要时为每个 DGP 合约参数发起提案,并提交提案启动投票。一旦某个提案获得足够的支持票数,该提案会自动生效,同时新的参数规则将作为新的共识规则作用于相应的参数。
如果提案在21600个区块内没有获得所需的票数,那么它将被驳回,同时合约将接受新的提案。
DGP合约
DGP 合约是 solidity 合约,允许管理以下内容:
· 管理操作: 增加/删除合约管理席位和治理席位
· 设置管理操作所需的管理席位的票数
· 设置接受 DGP 合约参数值席位提案所需的管理席位票数
· 设置接受 DGP 合约参数值席位提案所需的治理席位票数
· 针对提案启动投票
· 获取投票中的提案:当前的票数,以及 DGP 合约参数和所需投票的当前值
首次部署DGP合约时,该合约是没有管理席位的。因此必须调用相应的setter方法(只能调用一次):setInitialAdmin(),来设置初始的管理席位。该方法将首次调用的发送者设置为第一个管理席位。设置完成后,该管理席位的代理人就可以发起提案并启动投票。提案有以下三种类型:
席位增加提案(3 种子类型):
· 增加新的管理席位提案
· 增加新的治理席位提案
· 增加新的 DGP 合约参数值席位提案
席位删除提案 (2种子类型):
· 删除当前管理席位提案
· 删除当前治理席位提案
所需票数更改提案 (3 种子类型):
· 更改接受 DGP 合约参数值席位增加提案所需的管理席票数
· 更改接受 DGP 合约参数值席位增加提案所需的治理席票数
· 针对管理席或治理席提案:席位增加/删除提案,或所需票数更改提案,更改接受这两类提案所需的管理席票数
提案一旦启动投票,获得的支持票数不能小于票数阈值,否则不能生效。
除了增加第一个管理席位之外,其他的任何操作(不包括标识提案过期操作)都需要创建提案并启动投票。
当管理席位代理人创建提案时,提案在创建完成那一刻就自动获得了该管理席位的投票。
任意给定时间,每种提案类型最多只能有一个提案启动投票。
治理席位代理人只能给增加新的DGP合约参数值席位提案进行投票。提案一旦通过,需要设置DGP合约所需的合约地址,用于获取共识下的该参数的值。
管理席位代理人除了可以投票给增加新的DGP合约参数值席位提案之外,还可以投票给管理提案,其中包括所有其他类型的提案。
示 例
下面通过一个例子来解释说明。在下面的例子中,我们将运行一个* qtumd regtest*节点并使用DGP合约来修改最小Gas价格这一参数的值 (DGP合约: 0000000000000000000000000000000000000082)。
通过增加3个管理席位和2个治理席位,并将DGP合约参数席位增加提案生效所需的最少票数设置为2张管理席位投票和1张治理席位投票,从而将最小Gas价格参数修改为80 satoshi。我们还需要2张管理席位的投票,以便在添加第二个管理席之后能够继续添加更多管理席位或治理席位。
为实现上述目标,我们需要执行以下步骤:
· 设置初始的管理席位
· 由初始的管理席代理人创建提案,用于增加第2个管理席位
· 由任一管理席代理人创建提案,用于获取2张管理席投票从而使管理提案生效
· 由任一管理席代理人创建提案,用于增加第3个管理席位
· 由另一个管理席代理人对步骤4中创建的提案进行投票,因为需获取2张管理席投票从而使管理提案生效(现在我们已经有了3个管理席位)
· 由任一管理席代理人创建提案,用于增加第1个治理席位
· 由另一个管理席代理人对步骤6中创建的提案进行投票
· 由任一管理席代理人创建提案,用于增加第2个治理席位
· 由另一个管理席代理人对步骤8中创建的提案进行投票
· 由任一管理席代理人创建提案,用于获取2张管理席投票,以便接受DGP参数值席位增加提案
· 由另一个管理席代理人对步骤10中创建的提案进行投票
· 由任一管理席代理人创建提案,用于获取1张治理席投票,以便接受DGP参数值席位增加提案
· 由另一个管理席代理人对步骤12中创建的提案进行投票
· 基于minGasPrice-dgp-template模板创建参数值合约,并将最小Gas价格参数设置为80 satoshis,编译合约并在链上部署
· 由任一管理席代理人创建提案,使用步骤14中的合约地址增加一个新的DGP参数值席位
· 由另一个管理席代理人对步骤15中创建的提案进行投票
· 由任一治理席代理人对步骤15中创建的提案进行投票(使更改后的最小Gas价格参数的值生效,对于所有合约来说,新共识下的最小Gas价格现在是80 satoshis)