共识
概况
区块链是一个分布式的记账系统,在一个区块链系统中可以有成千上万的节点,他们各自独立保存一份相同的账本,而新的交易数据想要被写入帐本,需要获得这些节点的认可。在不可信的分布式环境中实现这一目标是一个很复杂的系统工程。区块链系统正常运行,即区块链中各节点总能保存同一份账本,前提是系统中绝大部分的节点是诚实可靠的。为了保证诚实可靠的节点能够共同监督交易数据写入账本,每个区块链系统都需要构建自己的共识,共识就相当于区块链的宪法。共识保证了即便是在不可信的分布式环境下,只要绝大多数节点遵守共识的规定,就一定能获得确定可信结果。因此共识的意义在于,区块链中的诚信节点可以最终达成账本的一致只要他们严格遵守这份共识。
共识有多种类型,目前使用最多的是PoW、PoS、DPpS,当然不同的区块链系统中都会有一些特有的具体实现上的不同。本文主要介绍TRON的共识就是基于DPoS的,同时向大家说明一下DPoS中的基本组件和机制。
产块流程
区块链系统的 超级代表 (Super Representative, SR),他们收集区块链网络中新产生的交易,并对这些交易的合法性进行验证,然后把这些交易打包在一个区块中,作为新的一页账记录在账本上,然后将账页在整个区块链网络中进行广播,其他的节点收到新的账页,也会验证账页中交易数据的合法性,并添加到自己的账本中。SR 一直重复这个过程,这样只要区块链系统中新的交易数据都会记录在账本里面。
DPoS概述
共识的作用是在区块链系统中选出 SR,SR 验证交易数据并进行记账,进而向区块链网络中的其他节点广播新的账目,并获得其他节点对于新账目的认可。DPoS作为共识的一类特定实现是这样的:
DPoS共识在区块链系统中根据节点获取选票的多少确定出部分节点作为记账。首先区块链系统开始启动运行的时候,会发行一定数量的通证,然后将通证分给区块链系统中的节点,节点可以凭借一部分通证申请成为这个区块链系统的 SR 候选人,区块链系统中任何持有通证的节点都可以为这些候选人进行投票,每经过一段时间t会统计所有候选人获得的选票数量,选票数量排在前面的N个节点会成为下一段时间t内的 SR,再经过t的时间,又会重新统计一遍新的 SR,以此类推循环往复。
下文将结合TRON的实现具体说明。
定义
TRON:指TRON区块链网络。本文不区分TRON、TRON区块链、TRON区块链系统等概念。
TRON Token:指由TRON发行并在系统中流转的权益通证,符号是TRX。
SR 候选人:指TRON网络中有成为 SR 资格的节点。
超级代表 (Super Representatives, SRs):指TRON网络中获得记账资格的节点,通常 DPoS 共识中将其称为 witness,TRON网络中也将 SR 称为 Super Node,TRON 网络设定 SR 的数量是 27 个。下文不区分记账人、witness、supernode、SR等概念。
记账:指验证交易并将交易记录成账目的过程,由于TRON网络中的账目是用区块承载的,因此记账的过程也被称为生产区块,下文不区分记账和生产区块。
记账顺序:即出块顺序。按照27个 SR 得票多少的降序作为记账顺序。
区块时间:TRON网络设定一个区块时间是3秒钟,即每3秒会生产出一个区块。
槽位 (Slot):在 TRON 网络中,每 3 秒被视为一个槽位。正常情况下,每个超级代表 (SR) 都会在对应的槽位时间内产出一个区块,因此 TRON 的平均出块间隔约为 3 秒。如果 SR 因故未能产块,对应的槽位将空缺,由下一个 SR 在其后的槽位产块。此外,在维护期内,出块会跳过两个槽位。
出块轮 (Epoch):TRON网络设定每6个小时作为一个出块轮,称为一个Epoch。每个出块轮最后的2个出块时间是一个维护期。每个出块轮的维护期决定下一个出块轮的出块顺序。
维护期:TRON 将维护期设置为两个区块时间,即 6 秒。此期间主要用于统计候选人得票、根据投票结果选举产生新的 SR 名单,以及处理过期的提案。24 小时内共有 4 个出块轮,相应地也就有 4 个维护期。在维护期内,SR 会暂停出块;同时,下一个周期的出块顺序也会在该期间内确定。
选举机制
1、选票
TRON网络中设定拥有一个TRX就可以拥有一张选票的权利。
2、投票过程
TRON网络中设定对候选人的投票过程是一笔特殊类型的交易,节点可以通过生成一笔投票交易对候选人进行投票。
3、统计票
每个维护期内,统计一次候选人的票数,将获得票数最多的27个候选人作为下一个出块周期的 SR。
产块机制
在一个出块轮中,27个 SR 按照记账顺序依次生产区块。每个 SR 只能在轮到自己产块时进行区块生产,SR 将多笔验证合法的交易数据打包到每个区块之中,同时每个区块都会将上个区块的哈希值(hash)作为本区块的父哈希值(parentHash)填入区块中,同时用自己的私钥对本区块的数据进行签名,将签名结果(witness_signature)也填入区块中,同时被填入区块的还有 SR 的地址,区块高度,区块生成的时刻等数据。
通过每个区块保存了上个区块hash值的方式,从而在逻辑上将区块相互关联了起来,最后组成了一条链的结构。典型的区块链结构示意图如下所示:
理想情况下,采用DPoS共识的区块链系统的记账过程就是按照事先计算好的记账顺序,由 SR 轮流依序产块(如下图a),但实际情况下,区块链网络是一个分布式的、不可信的复杂系统,体现在 1)由于网络链路环境不佳导致 SR 生产的区块并不会在有效时间内被其他的 SR 收到(如下图b1、b2);
2)并不能保证某个 SR 运行始终正常(如图c);
3)某些 SR 恶意生产分叉的区块企图将链分叉(如图d)。
前文已经提到区块链系统正常运行的基础是系统中绝大部分的节点是诚实可靠的,再进一步探讨这个问题,区块链系统安全的首要保证的是账本的安全,账本既不能被恶意写入不合法的数据,账本在各个节点上保存的副本也应该是一致的。如果从DPoS共识的角度上来看,记账过程是由 SR 完成,因此TRON网络的安全取决于大部分 SR 的可靠性,TRON网络中设定了不可逆转区块,也称为固化块。同时为了抵抗少部分 SR 的恶意行为,TRON网络采用基于最长链的原则确认为主链。
固化块原则
刚生产出来的区块处于未确认状态,只有被 27 个 SR 中 70% 以上(即 27 * 70% = 19, 向上取整)的 SR "认可"的区块才被认为是不可逆区块,一般称为固化块,此时固化块中包含的交易已经被整个区块链网络确认。对未确认状态区块进行"认可"的方式是 SR 在其之后生产后继区块。要强调的是:生产这 18 个区块的 SR 互不相同,并且和生产第 103 个区块的 SR 也不同。
最长链原则
当区块链产生分叉之后,诚实的 SR 总是选择在当前最长的那个分叉链上继续生产区块。
激励模型
为了保证区块链系统安全高效地运行,TRON网络设定了激励模型用于鼓励更多的节点加入到TRON网络中,从而扩大网络规模,对于 SR 当他们完成出块任务,给予相应的TRX奖励。TRON网络设定 SR 每生产一个被固化的区块,就会获得32个TRX的奖励;对于所有 SR(包括 SR 候选人)的得票在前127名的,每个Epoch的维护期会依据得票率的多少分配固定的奖励.
基于提案对参数进行调整
DPoS的一个重要的特性是任何系统参数的调整都可以通过链上的提案发起,SR 通过对提案的投票来决定提案是否生效。这样的好处是在链上新增加一些特性不需要进行硬分叉升级,TRON网络中的系统参数请参看 这里 或者 Tronscan。
参考文档
Updated 7 days ago