三、区块链共识机制
区块链要成为一个难以攻破的、公开的、不可篡改数据记录的去中心化诚实可信系统,需要在尽可能短的时间内做到分布式数据记录的安全、明确及不可逆,提供一个最坚实且去中心化的系统。在实践中,该流程分为两个方面:一是选择一个独特的节点来产生一个区块;二是使分布式数据记录不可逆。实现上述流程的技术核心就是:共识机制。共识机制是区块链节点就区块信息达成全网一致共识的机制,可以保证最新区块被准确添加至区块链、节点存储的区块链信息一致不分叉甚至可以抵御恶意攻击。
当前主流的共识机制包括:工作量证明、权益证明、工作量证明与权益证明混合(PoS+PoW)、股份授权证明、瑞波共识协议等。
(一)工作量证明
工作量证明(Proof of Work),顾名思义,即指工作量的证明。PoW机制的基本步骤如下:①节点监听全网数据记录,通过基本合法性验证的数据记录将进行暂存;②节点消耗自身算力尝试不同的随机数,进行指定哈希计算,并不断重复该过程直至找到合理的随机数;③找到合理的随机数后,生成区块信息,首先输入区块头信息,然后是数据记录信息;④接单对外部广播出新产生的区块,其他节点验证通过后,连接至区块链中,主链高度加一,然后所有节点切换至新区块后面继续进行工作量证明和区块生产。
PoW叫工作量证明体现在步骤②中,节点需要不断消耗算力工作,进行哈希计算,以找到期望的随机数。以比特币区块链为例,通过PoW机制维护区块链的整体运行及其安全性。验证节点通过随机的散列运算,争夺比特币区块链的记账权,防止欺诈交易,避免“双重支付”,这一过程需要消耗电力、算力来完成。因此,验证节点也成为“矿工”,随机数计算查找过程称为“挖矿”。每一个比特币区块链中的区块都包含着一个由无意义数据构成的短字符串(称为随机数),找到一个合适的随机数唯一已知的方法是不停地随机试探直到搜索到一个有效的数。比特币的PoW中,平均每10分钟有一个节点找到一个区块。如果两个节点在同一个时间找到区块,那么网络将根据后续节点和区块生成情况来确定哪个区块构建最终区块链。一般情况下,需要6个区块的生成时间进行确认,因为一般交易在6个区块(约1个小时)后被认为是安全确认且不可逆的。其工作量主要体现在:一个符合要求的区块随机数由N个前导零构成,零的个数取决于网络的难度值。要得到合理的随机数需要经过大量尝试计算,计算时间取决于机器的哈希运算速度。当某个节点提供出一个合理的随机数值,说明该节点确实经过了大量的尝试计算。当然,这并不能得出计算次数的绝对值,因为寻找合理随机数值是一个概率事件。工作量证明机制看似很神秘,其实在社会中的应用非常广泛。例如,毕业证、学位证、律师证等证书就是工作证明,拥有证书即表明在过去付出了努力。挖矿为整个系统的运转提供原动力,挖矿有三个重要功能:一是发行新的货币;二是维系系统的支付功能;三是通过算力保障系统安全。首先,挖矿消耗资源将黄金注入流通经济,比特币通过“挖矿”完成相同的事情,只不过消耗的是CPU时间与电力。其次,挖矿用于产量调节,区块的产量为大约每两周2016个,即每10分钟一块。第三,通过算力保障系统安全。算力攻击的概率难度呈指数上升(泊松分布),每个区块都必须指向前一个区块,否则无法验证通过。追根溯源便是高度为零的创世区块。PoW机制存在两方面明显的缺陷。一是算力的消耗与浪费。在PoW中,尽管区块链节点是用来帮区块链进行分布式数据记录的,但是它们实际所做的大部分工作是寻找正确的随机数而与数据记录无关。用来寻找随机数的能量和资源将永远地消失,这显然是一种浪费。二是算力集中化凸显。PoW机制自然地导致了算力集中问题。由于作为一个普通的个体或者几十、几百台规模的矿机目前都很难挖到区块了,因此大家必须联合起来挖矿,就诞生了算力集中的地方——矿池。其中最著名的是比特币Ghash矿池,它因为数次接近甚至达到了50%比特币的算力,从而引起了比特币社区的广泛担忧。
(二)权益证明+工作量证明
2012年8月,一个化名Sunny King的极客推出了Peercoin(PPC),采用工作量证明机制PoW发行新币,采用权益证明机制PoS维护网络安全,即PoW+PoS机制。该机制中,区块被分成两种形式——PoW区块及PoS区块。在这种新型区块链体系里,区块持有人可以消耗他的币天获得利息,同时获得为网络产生一个区块和用PoS造币的优先权。PoS的第一次输入被称为权益核心,需要符合某一哈希目标协议。因此,PoS区块的产生具有随机性,其过程与PoW相似。但有一个重要的区别在于,PoS随机散列运算是在一个有限制的空间里完成的,而不是PoW那样在无限制的空间里寻找,因此无须大量的能源消耗。权益核心所要符合的随机散列目标是以在核心中消耗的币天的目标值(币×天),这与PoW是不同的,PoW的每个节点都具有相同的目标值。因此,核心消耗的币天越多,就越容易符合目标协议。PoS中还有一种新型的造币过程。PoS区块将根据所消耗的币天产生利息币,设计时设定了每币一年将产生1分利息,以避免将来的通胀。在造币初期时保留了PoW,使最初的造币更加方便。
在区块链中谁是主链的问题是解决分叉的关键。PoS判断主链的标准已经转化为对消耗币天的判断。每个区块的交易都会将其消耗的币天提交给该区块,以提高该区块的得分。获得最高消耗币天的区块将被选中为主链。此设计减少了部分对于51%攻击的忧虑,因为在PoS区块中,要进行51%攻击,首先,要控制数量众多的币天,成本可能要高于获得51%的算力,这样就提高了攻击的成本;其次,攻击者在攻击网络时,其币天也会消耗,这将使攻击者阻止交易进入主链的行为变得更加困难。
为抵御分布式拒绝服务攻击,在PoW+PoS机制中,每个区块都必须由其拥有者签名,以避免受到复制并被攻击者使用。为了抵御攻击者复制产生多个区块进行分布式拒绝服务攻击,每个节点都会收集其接触到的(核心,时间戳)配对信息。假如一个已接收到的区块包含与其他之前收到的区块中的配对信息(核心,时间戳)是重复的,会忽略此区块直到后者被孤立出去。
在PoW+POS机制下,只要持有币的人,不论持有的数量多少,都可以挖到数据块,而不用采用任何的矿池导致算力集中。同时,由于多采用币天生成区块,而不是算力,降低了资源消耗,解决了单纯PoW机制在维护网络安全方面先天不足的问题。
(三)权益证明
除了结合PoW使用外,能否单独利用PoS机制进行区块链系统设计运行呢?答案是肯定的。简单来说,PoS就是一个根据持有货币的量和时间,进行利息发放和区块产生的机制。在权益证明PoS模式下,有一个名词叫币天。例如,每个币每天产生1币天,比如持有100个币,总共持有了30天,那么此时币天就为3000。这个时候,如果发现了一个新PoS区块,币天就会被清空为0。每被清空365币天,将会从区块中获得0.05个币的利息(可理解为年利率5%)。
PoS的典型应用就是未来币。同其他加密货币一样,未来币体系的总账是建立和储存在一系列区块里的,也就是区块链中。每个区块链的备份都存放在未来币网络的每个节点里,而且在每个节点上没有加密的每个账户都能够生成区块,只要至少一个新入账户的交易已经确认了1440次。任何账户只要达到了这个标准就会被视为“激活账户”。在未来币里,每个区块都包含着255个交易,每个交易都是由包含识别参数的192字节的数据头开始的。一个区块里的每个交易量都是由128个字节所代表着。总共加在一起就意味着最大的区块大小有32K字节。每个区块都有一个“生成签名”的参数。激活账户用自己的私钥在原先的区块上签署“生成签名”。这就产生了一个64字节的签名,之后通过SHA256散列该签名。哈希产生的前八个字节给出了一个数字,作为一个“hit”。“hit”与目前的目标值相比较,如果计算出的“hit”值要比“目标值”低,那么就可以生成下一个区块了。对于每个活动账户来讲,“目标值”都是与它自身所确认的余额成比例的。一个持有1000个币的账户得到的目标值是持有20个币账户所得到目标值的50倍。因此,拥有1000个币的持有者产生的区块数是持有20个币的人产生的50倍。同时,“目标值”并不是固定的,随着先前区块的时间戳的流逝时刻都在增长。如果在最初的一秒钟内没有哪个账户的“hit”值是低于“目标值”的,则下一秒钟“目标值”就会翻倍。“目标值”会连续地翻倍,直到一个活动账户的“hit”值有一个较低的数值。还有一个“基本目标”值,它以60秒的间隔设定为目标值。正是这个原因,一个区块平均产生的时间会在60秒。即使在网络上只有很少的激活账户,它们其中的一个最终会产生一个区块因为“目标”值会变得相当大。通过将你账户的“hit”值与目前的“目标”值相比,你就可以估算出你的“hit”值还有多久能成功。
当一个激活账户赢得产生区块的权利时,就能将任何可获得的且未确认的交易放入区块中,并用所有需要的参数来填充该区块。然后,这个区块就会被传播到网络中作为一个区块链的备选。每一个区块中的负载值、“hit”、产生的账户以及签名都能被网络上接收到它的节点所确认。每个区块参考之前的区块,区块形成的区块链可以用来追溯和查询网络中素有的交易历史,所有这些都会追溯到创世源区。上述完整地展示了利用币天进行区块产生和验证共识的过程,体现了PoS的核心思想。
(四)股份授权证明
PoS机制使用一个确定性算法以随机选择一个股东来产生下一个区块,该算法中,账户余额决定了节点被选中的可能性。然而,该系统并未使区块链变得越来越安全而不可逆,因为最终区块链的区块产生权掌握在账户余额最多的少数节点手中。同时,PoS面临的挑战是如何通过及时而高效的方法达成共识。为达到这个目标,每个持币节点可以将其投票权授予一名代表。获票数最多的前100位代表按既定时间表轮流产生区块。每名代表被分配到一个时间段生产区块。所有的代表将收到等同于一个平均水平的区块所含交易费的1%作为报酬。如果一个平均水平的区块含有100股作为交易费,一名代表将获得1股作为报酬,即可大大提高共识效率。这就是DPoS的核心思想。
网络延迟有可能使某些代表没能及时广播他们的区块,而这将导致区块链分叉。然而,这发生的概率较小,因为制造区块的代表可以与制造前后区块的代表建立直接连接。在DPoS中,第一个步骤是成为一名代表,必须在网络上注册公钥,然后分配到一个32位的特有标识符。然后该标识符会被每笔交易数据的“头部”引用。第二个步骤是授权选票。每个钱包有一个参数设置窗口,在该窗口里用户可以选择一个或更多的代表,并将其分级。一经设定,用户所做的每笔交易将把选票从“输入代表”转移至“输出代表”。一般情况下,用户不会创建特别以投票为目的的交易,因为那将耗费他们一笔交易费。但在紧急情况下,某些用户可能觉得通过支付费用这一更积极的方式来改变他们的投票是值得的。每个钱包将显示一个状态指示器,让用户知道代表的表现如何。如果某代表错过了太多的区块,那么系统将会推荐用户去换一个新的代表。如果任何代表被发现签发了一个无效的区块,那么所有标准钱包将在每个钱包进行更多交易前要求选出一个新代表。与PoW系统及其他PoS系统一样,最佳区块链是最长的有效区块链。在任何时候,一名代表错过签发一个区块的机会,该区块链将比潜在竞争对手短。只要交易被写入区块后的100个区块中的51%被生产出来了,那么你就可以安全地认为在主区块链上。也许,在防止区块链分叉所导致的损失方面,最重要的事是在事发后第一时间得知消息。如果10区块中有超过5个错过生产,那么这意味着你很可能在一条支链上,因此应该停止所有交易,直到分叉得到解决。以一种及时的方式(少于5分钟)简单地发现并警示用户网络分叉,是可以最小化潜在损失的非常重要的能力。
(五)瑞波共识协议
瑞波共识协议(Ripple Consensus Protocol,RCP),使一组节点能够基于特殊节点列表达成共识。初始特殊节点列表就像一个俱乐部,要接纳一个新成员,必须由一定比例的该俱乐部会员投票通过。RCP机制的工作原理如下。
①验证节点接收存储待验证交易。首先,验证节点接收待验证交易,将其存储在本地;其次,本轮共识过程中新到的交易需要等待,在下次共识时再确认。
②活跃信任节点发送提议:首先,信任节点列表是验证池的一个子集,其信任节点来源于验证池;其次,参与共识过程的信任节点须处于活跃状态,验证节点与信任节点间存在保活机制,长期不活跃节点将被从信任节点列表删除;最后,信任节点根据自身掌握的交易双方额度、交易历史等信息对交易做出判断,并加入到提议中进行发送。
③本验证节点检查收到的提议是否来自信任节点列表中的合法信任节点,如果是,则存储;如果不是,则丢弃。
④验证节点根据提议确定认可交易列表的步骤如下:首先,令信任节点列表中活跃的信任节点个数为M(比如5个),本轮中交易认可阈值为N(百分比,比如50%),则每一个超过M×N个信任节点认可的交易将被本验证节点认可;其次,本验证节点生成认可交易列表。系统为验证节点设置一个计数器,如果计数器时间已到,本信任节点需要发送自己的认可交易列表。
⑤账本共识达成的步骤如下:首先,本验证节点仍然在接收来自信任节点列表中信任节点的提议,并持续更新认可交易列表;其次,验证节点认可列表的生成并不代表最终账本的形成以及共识的达成,账本共识只有在每笔交易都获得至少超过一定阈值(比如80%)的信任节点列表认可才能达成。如果账本中每笔交易都获得至少超过一定阈值(比如80%)的信任节点列表认可,则共识达成,交易验证结束,否则继续上述过程。
⑥共识过程结束后,已经形成最新的账本,现将上轮剩余的待确认交易以及新交易纳入待确认交易列表,开始新一轮共识过程。
除上述机制外,还有恒星共识协议(Stellar Consensus Protocol,SCP)、改进型实用拜占庭容错机制(Practical Byzantine Fault Tolerance,PBFT)和Pool验证池机制等共识机制被提出,甚至已经应用在区块链系统中,不同共识机制各有其应用场景和优势。