概况

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

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

记账流程

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

DPOS概述

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

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

下文将结合TRON的实现具体说明。

定义

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

TRX:指由TRON发行并在系统中流转的权益通证,符号是TRX。

记账候选人:指TRON网络中有成为记账人资格的节点。

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

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

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

区块时间:TRON网络设定一个区块时间是3秒钟,即每3秒会生产出一个区块。

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

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

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

904

选举机制

1、选票

TRON网络中设定拥有一个TRX就可以拥有一张选票的权利。

2、投票过程

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

3、统计票

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

产块机制

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

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

904

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

904 904

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

固化块原则

刚生产出来的区块处于未确认状态,只有被27个Witness中70%以上(即27 * 70% = 19, 向上取整)的witness"认可"的区块才被认为是不可逆区块,一般称为固化块,此时固化块中包含的交易已经被整个区块链网络确认。对未确认状态区块进行"认可"的方式是Witness在其之后生产后继区块。要强调的是:生产这19个区块的Witness互不相同,并且和生产第103个区块的Witness也不同。

最长链原则

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

激励模型

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

基于提案对参数进行调整

DPOS的一个重要的特性是任何系统参数的调整都可以通过链上的提案发起,记账人通过对提案的投票来决定提案是否生效。这样的好处是在链上新增加一些特性不需要进行硬分叉升级,TRON网络中的系统参数请参看 这里 或者 Tronscan

参考文档