波场共识机制 DPoS

概况

区块链是一个分布式的记账系统,在一个区块链系统中可以有成千上万的节点,他们各自独立保存一份相同的账本,而新的交易数据想要被写入帐本,需要获得这些节点的认可。在不可信的分布式环境中实现这一目标是一个很复杂的系统工程。区块链系统正常运行,即区块链中各节点总能保存同一份账本,前提是系统中绝大部分的节点是诚实可靠的。为了保证诚实可靠的节点能够共同监督交易数据写入账本,每个区块链系统都需要构建自己的共识,共识就相当于区块链的宪法。共识保证了即便是在不可信的分布式环境下,只要绝大多数节点遵守共识的规定,就一定能获得确定可信结果。因此共识的意义在于,区块链中的诚信节点可以最终达成账本的一致只要他们严格遵守这份共识。

共识有多种类型,目前使用最多的是POW、POS、DPOS,当然不同的区块链系统中都会有一些特有的具体实现上的不同。本文主要介绍波场的共识就是基于DPOS的,同时向大家说明一下DPOS中的基本组件和机制。

记账流程

区块链系统的记账人,他们收集区块链网络中新产生的交易,并对这些交易的合法性进行验证,然后把这些交易打包在一个区块中,作为新的一页账记录在账本上,然后将账页在整个区块链网络中进行广播,其他的节点收到新的账页,也会验证账页中交易数据的合法性,并添加到自己的账本中。记账人一直重复这个过程,这样只要区块链系统中新的交易数据都会记录在账本里面。

DPOS概述

共识的作用是在区块链系统中选出记账人,记账人验证交易数据并进行记账,进而向区块链网络中的其他节点广播新的账目,并获得其他节点对于新账目的认可。DPOS作为共识的一类特定实现是这样的:

DPOS共识在区块链系统中根据节点获取选票的多少确定出部分节点作为记账。首先区块链系统开始启动运行的时候,会发行一定数量的通证,然后将通证分给区块链系统中的节点,节点可以凭借一部分通证申请成为这个区块链系统记账人的候选人,区块链系统中任何持有通证的节点都可以为这些候选人进行投票,每经过一段时间t会统计所有候选人获得的选票数量,选票数量排在前面的N个节点会成为下一段时间t内的记账人,再经过t的时间,又会重新统计一遍新的记账人,以此类推循环往复。

下面结合波场中的实现具体说明:

定义

波场:指波场的区块链网络。本文不区分波场、波场区块链、波场区块链系统等概念。

波场币:指由波场区块链系统发行并在系统中流转的权益通证,代号是TRX。

记账候选人:指波场中有成为记账人资格的节点。

记账人:指波场中获得记账资格的节点,通常DPOS共识中将记账人称为witness,波场也将记账人称为super node(简称SR),波场设定记账人的数量是27个。下文不区分记账人、witness、supernode、SR等概念。

记账:指验证交易并将交易记录成账目的过程,由于波场中的账目是用区块承载的,因此记账的过程也被称为生产区块,下文不区分记账和生产区块。

记账顺序:即出块顺序。按照27个记账人得票多少的降序作为记账顺序。

区块时间:波场中设定一个区块时间是3秒钟,即每3秒会生产出一个区块。

槽位:每一个区块生产出来可以放到一个槽位,被称为slot,每当一个区块生产出来就会占用一个槽位。例如,1分钟有20个slot,当1个区块时间内有1个区块生产出来,对应的slot会被填满,如果没有区块被生产出来,那么对应的slot就是空的,下个区块生产出来的时候会填充到新的对应的slot中。

出块轮:波场设定每6个小时作为一个出块轮,称为一个Epoch。每个出块轮最后的2个出块时间是一个维护期。每个出块轮的维护期决定下一个出块轮的出块顺序。

维护期:波场设定是2个区块时间,即6秒钟。这段时间用于统计候选人得票数。因为24个小时有4个出块轮,自然就有4个维护期,维护期中不进行区块生产,主要用来确定下个出块轮的出块顺序。

image

选举机制

1、选票

波场中设定拥有一个TRX就可以拥有一张选票的权利。

2、投票过程

波场中设定对候选人的投票过程是一笔特殊类型的交易,节点可以通过生成一笔投票交易对候选人进行投票。

3、统计票

每个维护期内,统计一次候选人的票数,将获得票数最多的27个候选人作为下一个出块周期的记账人。

产块机制

在一个出块轮中,27个记账人按照记账顺序依次生产区块。每个记账人只能在轮到自己产块时进行区块生产,记账人将多笔验证合法的交易数据打包到每个区块之中,同时每个区块都会将上个区块的哈希值(hash)作为本区块的父哈希值(parentHash)填入区块中,同时用自己的私钥对本区块的数据进行签名,将签名结果(witness_signature)也填入区块中,同时被填入区块的还有记账人的地址,区块高度,区块生成的时刻等数据。

通过每个区块保存了上个区块hash值的方式,从而在逻辑上将区块相互关联了起来,最后组成了一条链的结构。典型的区块链结构示意图如下所示:

image

理想情况下,采用DPOS共识的区块链系统的记账过程就是按照事先计算好的记账顺序,由witness轮流依序产块(如下图a),但实际情况下,区块链网络是一个分布式的、不可信的复杂系统,体现在 1)由于网络链路环境不佳导致witness生产的区块并不会在有效时间内被其他的witness收到(如下图b1、b2); 2)并不能保证某个witness运行始终正常(如图c); 3)某些witness恶意生产分叉的区块企图将链分叉(如图d)。

image

image

前文已经提到区块链系统正常运行的基础是系统中绝大部分的节点是诚实可靠的,再进一步探讨这个问题,区块链系统安全的首要保证的是账本的安全,账本既不能被恶意写入不合法的数据,账本在各个节点上保存的副本也应该是一致的。如果从DPOS共识的角度上来看,记账过程是由witness完成,因此波场的安全取决于大部分witness的可靠性,波场设定了不可逆转区块,也称为固化块。同时为了抵抗少部分记账节点的恶意行为,波场采用基于最长链的原则确认为主链。

固化块原则

被27个witness中三分之二以上(即27 * 2/3 + 1 = 19)的witness“认可”的区块被称为不可逆转区块,也称为固化块,固化块表示这个区块中的交易数据已经被整个波场区块链确认了。此处对区块的“认可”是指witness生产的区块是待被认可区块的后继区块,如图d中witness C生产的第103块,Witness E在第103块的基础上生产了104‘,Witness G、A、B生产的105‘、106’、107‘实质上也是103块的后继区块,故也是对C生产的第103块的认可。

最长链原则

当区块链产生分叉之后,诚实的witness总是选择在当前最长的那个分叉链上继续生产区块。

激励模型

为了保证区块链系统安全高效地运行,波场设定激励模型用于鼓励更多的节点加入到波场网络中,从而扩大网络规模,对于记账人当他们完成出块任务,给予相应的TRX奖励。波场设定witness每生产一个被固化的区块,就会获得32个TRX的奖励;对于所有记账人(包括记账候选人)的得票在前127名的,每个Epoch的维护期会依据得票率的多少分配固定的奖励.

基于提案对参数进行调整

DPOS的一个重要的特性是任何系统参数的调整都可以通过链上的提案发起,记账人通过对提案的投票来决定提案是否生效。这样的好处是在链上新增加一些特性不需要进行硬分叉升级,波场目前能够支持的系统参数调整有:

1.两个维护期之间的时间间隔

2.申请成为记账候选人花费的TRX的数量

3.激活一个账号需要花费的TRX的数量

4.每笔交易中1个字节需要的带宽费用

5.在波场中发行资产需要花费的TRX的数量

6.witness生产每个区块的奖励

7.所有记账人(包括记账候选人)得票数在前127名按得票比例将要获得的TRX奖励总数

8.通过系统合约激活账号需要花费的TRX的数量

9.激活一个账号需要花费的带宽数量

10.能量和Sun的兑换关系

11.创建基于TRC-10的token去中心化交易对需要花费的TRX的数量

12.单笔交易执行允许花费的最大cpu时间

13.是否允许修改账号名称

14.是否允许发行同名的资产

15.是否允许资源委托

16.波场区块链系统中的能量上限值

17.是否允许在智能合约中转移TRC-10资产

18.是否允许开启能量上限动态调整

19.是否允许多重签名

20.账号权限更新需要花费的TRX数量

21.多重签名交易需要花费的TRX数量

22.是否对block和transaction的protobuf消息是否开启校验

带宽和能量机制

待补充

附录:参考文档