Qtum量子链分布式自治协议(DGP)代码剖析


  • qtum team

    Qtum量子链分布式自治协议(DGP)代码剖析

    分叉问题一直影响着基于区块链的应用,如何实现区块链网络的自动升级和降低分叉对用户的影响,并且建立更有效的区块链网络治理模式,是区块链行业未来发展中面临的巨大难题和挑战。Qtum量子链在设计之初就考虑了这些问题, 并提出了分布式自治协议(Decentralized Governance Protocol, DGP)。
    Qtum通过智能合约治理区块链网络的某些参数,实现一个去中心化的网络自治机制以及区块链网络的自动升级和快速迭代,从而无需担心软硬分叉对网络和社区带来的影响。 凭借分布式自治协议(DGP),区块链特定的参数可以通过智能合约进行更改,用户无需下载最新的客户端软件。
    本文对DGP智能合约模板进行分析,了解Qtum如何通过DGP实现对区块链网络的治理。分析的DPG合约代码模板存放地址:
    https://github.com/qtumproject/qtum-dgp

    1.DGP的治理模式简介
    可管理的每个区块链网络功能都由独立的DGP智能合约控制,这意味着每个功能有独立的治理、授权机制以及内置限制条件。每个DGP都有一个非常简单的核心治理模式:即通过具有管理或治理席位的地址来对提案进行管理,包括对投票席位本身和普通提案的管理。现在支持0,1,2三种类型的提案,分别对应:管理或治理席位增加、管理或治理席位删除、普通参数提修改。所有提案的设置只有具备管理席位的。发送地址才有权限设置,具有投票席位的发送地址才能进行投票。
    对普通类型提案的投票,首先要设计相应的提案;之后向社区公布更改提案,并收集相关反馈;根据社区反馈,对更改提案进行相应调整,并将该提案编写成一个智能合约,并部署到网络中;通过然后通过调用DGP-template合约的相关方法,把该提案设置为DGP-template管理的当前投票的提案;此时投票立即启动;具有管理或治理席位的代理者可以发送一笔交易给DGP智能合约,对该提案进行投票;若提案未获得足够投票,则该提案被否决,不执行任何修改;当提案通过,提案会更新到相应的变量保存,设计的新参数会在500个块之后生效,以避免出现不必要的孤儿块或分叉,钱包和区块链上的所有节点可以定时检查RLP储存器从而判断是否有新的更改发生。
    对于管理或治理席位增加和删除,提案的流程和普通提案类似,也是通过具有管理或治理席位的发送者投票来决定,不过当投票通过后可以立即生效。

    2.DGP-template智能合约分析

    2.1 主要变量
    该合约的主要通过下面的几个变量进行提案管理:

    paramsInstance[] paramsHistory; // 保存所有提案参数历史
    address[] adminKeys; // 管理人员密钥
    address[] govKeys; // 治理人员密钥
    proposals currentProposals; // 当前正在投票的提案状态
    votesRequired activeVotesRequired; // 提案通过所需条件
    

    合约使用变量currentProposals保存当前提案的投票统计,DGP-template中提案的设置需要在变量adminKeys或govKeys中存在的密钥控制者才能设置。变量paramsHistory保存了所有通过提案的记录信息,保存的最近一个参数为当前区块链网络使用的参数。

    2.2 管理和治理席位增加
    通过addAddressProposal函数可以设置接受投票的提案,该函数也是实现投票功能的合约函数。首先,设置和投票提案的代码片段如下:

    // type 0: adminKey
    // type 1: govKey
    // type 2: paramsAddress
    if(!currentProposals.keys[_type].onVote){
    	if(isGovKey(msg.sender)) throw; 
    	currentProposals.keys[_type].onVote=true;
    	currentProposals.keys[_type].proposal=_proposalAddress; 
    	currentProposals.keys[_type].votes.length=0; 
    	currentProposals.keys[_type].votes.push(msg.sender); 
    	}else{
    	if(currentProposals.keys[_type].proposal!=_proposalAddress) throw;
    	if(alreadyVoted(msg.sender, currentProposals.keys[_type].votes)) throw;
    	currentProposals.keys[_type].votes.push(msg.sender); 
    	}
    

    可以看到_type现在支持0,1,2三种类型的提案,分别对应:管理或治理席位增加、普通参数提修改。对于待投票提案的设置首先通过if(isGovKey(msg.sender))语句判断,只允许具有管理席位的发送者才有权限开启一个待投票的提案。
    下面是类型0,1提案的投票统计代码:

    if(_type==0 || _type==1){
    	if(tallyAdminVotes(currentProposals.keys[_type].votes) >= 
    	activeVotesRequired.adminVotesForManagement){
    		if(isAdminKey(currentProposals.keys[_type].proposal) || 
    		isGovKey(currentProposals.keys[_type].proposal)) throw;
    		if(_type==0)adminKeys.push(currentProposals.keys[_type].proposal); 
    		if(_type==1)govKeys.push(currentProposals.keys[_type].proposal); 
    		clearAddressProposal(_type);
    	}
    }
    

    类型0,1提案的目的,是为了增加管理地址或治理地址,提案的投票权只限于具有adminKeys和govKeys权限的发送者,当提案投票数大于在变量activeVotesRequired. adminVotesForManagement设置的值时,管理地址或治理地址会保存到该DGP-template的adminKeys或govKeys变量里,这样就相当于在区块链治理委员会中增加了相应的投票席位。

    2.3 管理和治理席位的删除
    2.1描述的是怎样增加管理者或治理者、对普通提案进行投票,DPG-template也支持对管理者或治理者进行删除。

    if(!currentProposals.removeKeys[_type].onVote){
    	currentProposals.removeKeys[_type].onVote=true;
    	currentProposals.removeKeys[_type].proposal=_proposalAddress;
    	currentProposals.removeKeys[_type].votes.length=0; 
    	currentProposals.removeKeys[_type].votes.push(msg.sender); 
    	}else{
    	if(currentProposals.removeKeys[_type].proposal!=_proposalAddress) throw; 
    	if(alreadyVoted(msg.sender, currentProposals.removeKeys[_type].votes)) throw; 
    	currentProposals.removeKeys[_type].votes.push(msg.sender); 
    	}
    if(tallyAdminVotes(currentProposals.removeKeys[_type].votes)>=
                activeVotesRequired.adminVotesForManagement){
    	if(_type==0 && isAdminKey(currentProposals.removeKeys[_type].proposal))
                       deleteAddress(_type, currentProposals.removeKeys[_type].proposal);			
    	if(_type==1 && isGovKey(currentProposals.removeKeys[_type].proposal))
                       deleteAddress(_type, currentProposals.removeKeys[_type].proposal); 
    	uint i;
    	for(i=0;i<3;i++){
    		clearAddressProposal(i); 
    	}
    	clearAddressRemovalProposal(_type);
    }
    

    首先这部分代码只有在管理席位的地址才能执行,代码首先设置对管理或治理席位的删除的提案,然后每个管理席位的地址都可以进行投票。当投票数大于变量中设置的activeVotesRequired.adminVotesForManagement值时,投票通过,使用deleteAddress删除某个管理或治理席位。

    2.4 普通提案的投票和统计决策
    设置接受投票的提案的过程2.1一样,只允许具有管理席位的发送者才有权限开启一个待投票的提案。待投票提案的地址保存在currentProposals.keys[_type].proposal。提案的投票通过语句currentProposals.keys[_type].votes.push(msg.sender)完成,该变量记录了所有投票者的发送地址。
    下面是类型2提案投票统计的代码:

    if(_type==2){													
                   if(tallyAdminVotes(currentProposals.keys[_type].votes)>=
                   activeVotesRequired.adminVotesForParams &&
                   tallyGovVotes(currentProposals.keys[_type].votes)>=
                   activeVotesRequired.govVotesForParams){
    		if(paramsHistory.length>0 && 
                          paramsHistory[paramsHistory.length-1].blockHeight==
                          block.number+1) throw;				
                          paramsHistory.push(paramsInstance(block.number+1,
                         currentProposals.keys[_type].proposal));
                         clearAddressProposal(_type);
    		}
    }
    

    类型2提案用于对普通的区块链网络参数修改提案,当提案投票数大于在变量activeVotesRequired. adminVotesForParams设置的值时,提案的投票通过,并清空当前投票设置。通过的具体提案保存在paramsHistory。因此,投票成功后最新的参数可以通过paramsHistory来读取,并在500个区块以后开始实施。

    3.总结
    Qtum量子链的DGP分布式自治协议为区块链网络提供了一种治理模式。可管理的每个区块链网络参数都由独立的DGP智能合约控制,DGP治理以投票的方式完成对区块链网络参数修改提案的决策,或通过投票对管理和治理席位进行增加或删除。当提案通过,提案会更新到相应的DGP合约变量保存,钱包和区块链上的所有节点可以定时检查RLP储存器从而判断是否需要更改到新的区块链网络参数。



  • 分布式自治协议是量子的独创,可以编码数字货币的硬分叉,真的很不错


Log in to reply
 

Looks like your connection to QTUM was lost, please wait while we try to reconnect.