相信区块链的共识和共识机制是大家谈的最多的,但是真正能够理解的可能不是太多,尤其对非技术人员而言。而一些别有用心者就故意混淆这两者的差别,以达到自身某种目的。
定义
首先,我们可以简单下个定义:
共识:系统里大家都能认可的一种结果。
共识机制:系统中获取共识的方法。
在目前的区块链中:
共识:大家认可的交易记录
共识机制:使交易记录大家都认可的方法。
原因
- 为什么要有共识机制?
在区块链中,节点之间通过数据通信进行沟通,只要符合某一种区块链约定的数据格式,任何一个节点都可以加入到这个区块链系统中。也就是说,每个节点可以使用任意编写的程序来攻击区块链获取利益。
- 矿工的本质
目前区块链矿工的本质是记账,每个矿工监听网络中广播的交易信息,并且把这些信息记录下来。由于系统中有大量的矿工存在,因此需要一种方法来确认是哪个矿工记的帐有效。有效记账就称为出块。
- 共识机制的本质
在去中心化的系统里,每个记账节点(矿工)都会维护一个账本,当他自己在记账的时候,会检查前面的记录是否有效,同时也希望自己记的账被别人认可有效--因为一旦认可有效,他就能得到相应的奖励。
这时候,每个矿工的利益最大化的方法就是让自己的记录的账本被别人认可。从矿工的利益来说,最好就是把记账权尽可能地抢到手,让自己出块,但从系统的角度来说,这是一个巨大的安全问题:
如果出块成功的节点总是某一个或是某几个,那么这个或是这组节点就可以做假,比如:把以前某个交易记录删除,这样,某个交易的接收者当时以为收么币了,但是过一阵子后,币却消失不见了,而且没有任何记录可以查到。想想当年的新闻,某人的银行账号里突然多了几个亿,过会儿又莫名消失了的故事.......
因此系统想要安全,就必须让出块节点尽可能的分散,因为在这种情况下,某个节点如果记了假账,会被其的记账节点推翻。
因此,我们可以简单地看待共识机制:共识机制本质就是一种让出块的节点尽可能随机和分散的方法。
问题及解决方案
看到这里,大家可能会想,这么简单啊,那系统不断生成一个随机数,大家按照这个随机数匹配出块节点不就行了么?问题就在这时,系统没有一个中心,所以没有一个节点可以生成大家认可的随机数--谁知道你的随机数是不是真的随机啊,而且假随机的可能性大于真随机的可能啊。
共识机制的设计本质就是寻找一种能够使出块节点随机化的方法。
常见共识机制及其安全性分析
PoW机制
通过时刻使出块节点随机化:那在这么一个去中心化的系统中,有什么是可信的?每个人信自己嘛,交易和出块的结果数据到达我这里的时刻,是无法作假的:数据可能会延时到达(由于网络延时),但绝对不会提前到达(除非时光倒流)。我们可以设计一种机制,让每个节点的记账结果必须达到某个条件,每个节点都认第一个达到这个条件的节点的记录。
Proof-Of-Work,每个节点在记账的同时,按照某种规则找一个随机数,通过这个随机数可以算出某个符合条件的(哈希)值,谁第一个找到的,他就出块成功。这个找随机数的过程就是不断调整随机数-->计算的过程,只要这种算法能够足够离散(这一次和下一次的计算没有任何关联,随机数的变化导致计算结果变化足够离散),那么就能够实现出块节点的随机化。
举个简单的例子,如果算法得到的哈希值总是在0-10000之间,而算法要求得到的(哈希值)小于1,一台机器如果一秒钟能够计算一次,那么平均计算一万次,就有一次值可能小于1;或者反过来说,每次计算,有万分之一的机会小于1。 如果有一万台节点同时在计算,那么每秒都有可能有一台节点得到符合条件的结果,得到符合条件结果的节点就是出块成功。而每一秒,得到结果的机器都可能不一样。这样就获得了足够随机的结果。
军备竞赛
有人说,我升级机器,把机器的算力提升到每秒计算10次,那么他出块的几率就变成了万分之十,其它人一看,我也可以啊,于是大家都升级机器。这样,军备大赛就开始了,提升机器需要花钱,算力提供了功耗增加,但是只要产出大于投入,大家都会不断升级。
难度值
可能有人发现了问题,大家算力都提高了十倍,本来平均一秒钟才能够算出来的值,现在0.1秒就算出来了,那最后岂不是快的啥事都干 了 ,就是算着玩 ,这样大家都受不了,还有什么意义?
算算术只是为了实现随机,本质还是要记账啊。为了解决这个问题,引进了难度的概念,当算力提高了,本来大家希望1秒出一个块,结果有人算力提高了,0.5秒就出块了,怎么办?增加难度啊,本来小于1的,现在大家都要求结果小于0.5嘛,于是算力提高了一倍,难度提高了一倍,结果出块的时间还是接近1秒。如果算力提高了10倍怎么办?要求结果小于0.1啊。
有了难度值后,随着军备竞赛的发展,算力越来越高,但是出块的时间保持不变,第一个想到这个的中本聪太牛了!
PoW中的TPS
TPS(throughout per second)是吞吐量的意思,也就是每秒可以执行的交易数。刚入行的就会觉得奇怪,为什么网络带宽、CPU性能不断提升,比特币和以太坊的TPS却只有那么多?
前面讲到出块,系统通过难度值的调整,比特币把出块的时间固定在10-15分钟时间内,以太坊把出块时间固定在12秒左右。而每一个块的大小是有限制的,因此每个块之内的交易笔数是有限的。TPS=每块最大交易笔数/出块时间。因此在系统在设计之初的算法上就固定了TPS数了。
由于TPS=每块最大交易笔数/出块时间,增加TPS的方法就很简单了:
扩大分子:扩大每个区块的容量,比如说BCH就是这么干的。
减小分母:即缩短出块时间,从比特币到以太坊就是减小了分母。
但是这个是有限的,区块大小总是有限的,总不至于每个区块几百M吧。缩短出块时间也是有限的,因为网络有延时,缩小到一定的程度的时候,节点之间的数据来不及同步了。
POS
Proof-Of-Stake,权益证明。
PoW机制很好用,但是有个问题,军备竞赛后,太耗电了,都是做些无意义的计算,除了这个结果和到达时间之外,还有什么可信的数据作为随机值的呢?有想到一个新的点子,每个人存在账号里的币的数量是不一样的么 ,是不是可以用来作为一种随机数呢?
想想也可以啊,每一次出块的时候,出块节点(账号)里谁的币最多,就认谁的。但这样有个问题:币最多的岂不是一直在出块?
加个币龄,某个账号(节点)一旦出块成功,币龄就清零,如果没有出块成功,币龄就加上。
比如账号A有7个币,B有8个币,C有3个币
初始币龄值 : A: 7, B: 8, C :3 第一轮: B出块
第一轮后币龄:A:14, B:0,C:6 第二轮 A出块
第二轮后币龄:A:0,B:8,C:9 第三轮:C出块
第三轮后币龄:A:7 B:16,C:0
通过上述结果,可以看到达到了随机出块的效果,而且没有额外耗电的计算。但是POS有两个问题:
如果币被集中在一些人手机,这些人的节点的出块概率非常高;
如果轮到某个节点出块,最后他没出怎么办?
DPoS
在PoS的基础上,有人就想了,哦,去中心化的意思就是不要在一个节点上出块啊,那我选出一些节点,让这些节点轮流出块不就可以了么。于是就有了DPoS(delegated Proof-Of-Stake),我们选出一些节点,让这些节点为大家服务,他们来出块,OK,省事又省心。
慢着,这个好像有点不对味啊,去中心化的方法是让出块节点尽可能的分散,防止总是由某一个或是一些节点出块,因此如果总是他们出块,那他们完全就可以为所欲为啊,这个dPos岂不是与这个原则背道而驰?
这个结论部分正确,因为区块链不仅仅有公链,还有联盟链的存在。比如说各国海关设立一个联盟链,他们代表各自国家的利益,因此是处于互联监督的状态,再说,他们如果联合作恶,没有作恶的对象啊,因此没有联合作恶的意义和条件。
那dPos在公链上会有什么后果呢?dPos在公链上有主节点,备选节点,还有广大的币民,DPoS主节点联合作恶的前提条件就是他们作恶的收益大于成本(愿赌服输,输家最后可能会抛弃这个链)。这个前提会不会存在呢?见仁见智吧:)