2.3 共识机制

区块链的一个核心技术就是共识机制。共识机制的主要作用是决定区块链节点的记账权,可以有效保证区块链上的所有参与节点之间的相互信任。由于共识机制的存在,所有的参与节点之间的信任得到了保证,出现在区块链节点合作上的冲突问题也可以被及时解决。此外,共识机制还能提高用户参与区块链系统维护工作的热情,从而提高区块链系统的稳定性。

2.3.1 共识即有效

什么是共识即有效呢?打个比方,比如有A、B、C、D、E五个并不认识的人同时认为 G 是一个好人,那么在某种意义上就说明 G 这个人应该是一个不坏的人。在这个比方中,A、B、C、D、E五个人认为G是一个好人的一致性看法就是一种共识,而得出的结论“G是一个不坏的人”就相当于“有效”,因为五个人都认可了G身上的“好人”价值,这种价值就是所谓的“有效”。

在区块链中,由于区块链是依据时间顺序储存数据的,所以它可以支持多种共识机制。共识机制可以让区块链中所有诚实的节点都储存区块链信息,这些信息具有两个特性:一致性和有效性。

一致性就是指所有诚实的节点储存的区块链的前缀部分完全相同;有效性则是指由某一个诚实节点所发出的信息最终会被其他诚实节点记录到自己所在的区块链中。

由于区块链可以支持多种共识机制,所以在一致性和有效性均满足的情况下,其采用的不同共识机制会对整个区块链系统产生影响。以下为区块链共识机制的四个评价维度。

1.扩展性

区块链共识机制的扩展性主要就是看其能否支持网络节点的扩展。在区块链的开发设计中,扩展性是需要着重考虑的一个关键因素。在不同的区块链中,扩展性可以被分为两种:待确认交易数量的增加与系统成员数量的增加。在待确认交易数量和系统成员数量都增加时,区块链系统的网络通信情况和承载能力是扩展性需要考虑的两个主要问题。

2.安全性

安全性就是指共识机制在区块链中是否能避免二次支付等问题的出现,以及有没有较好的容错能力。二次支付问题是区块链金融交易中的主要安全问题,例如 Sybil 攻击就是以在区块链系统中生成大量无意义节点的方式来影响整个区块链系统的安全性。

3.资源消耗

在区块链中,各节点达成共识需要消耗一定的资源,如 CPU 等。共识机制主要凭借计算机资源让区块链中的所有节点达成共识,举一个比较简单的例子,在比特币区块链系统中,它的共识机制以工作量证明机制为基础,信任证明的提供需要该机制消耗大量的计算机资源进行挖矿才能实现,从而达成最后的共识。

4.性能效率

区块链共识机制的性能效率主要由其在区块链中每秒可处理和确认的交易数量来决定,这一问题受到人们的广泛关注,而且逐渐成为一个研究热点。例如,比特币的共识机制就是一个基于工作量证明(PoW)的共识机制。就当前来看,该共识机制不仅应用在比特币上,还应用在其他公有链系统中。

区块链网络中所有节点的一致性可由PoW共识机制来维持。在PoW共识机制中,每一个参与共识算法竞争的区块链节点被称作“矿工”,我们常说的比特币“挖矿”就是指一个求解随机数的过程。

当区块链节点收到区块链交易的信息,或者由新的区块创建的信息以后,这些节点就会进行新一轮的挖矿。

在挖矿的过程,新区块的区块头信息会进行哈希。鉴于每一个区块头中的信息都是独一无二的,所以在区块链节点的每一次挖矿过程中,区块的哈希值通常都是不同的。在区块链节点挖矿前,都会先计算出一个目标值,而这个目标值是和求解的难度系数密切相关的,区块链节点每进行一次挖矿就会产生一个随机数。

区块链节点会把这个随机数和区块头中具有唯一性的区块头信息的哈希值进行双SHA3哈希,生成的结果会继续被区块链节点用来和目标值进行对比。若该结果小于目标值,那么此次挖矿就是成功的;若该结果不小于目标值,那么区块链节点就会继续对那些重新生成的随机数进行运算,直至哈希的结果小于目标值。

在整个哈希过程中,计算能力是唯一的相关点。由于双SHA3具有不可逆性,所以区块链节点求解哈希结果小于目标值的过程只能依靠不断地计算才能完成。所以,从区块链节点的求解速度上就可以看出 PoW 共识机制的计算能力。

相较于耗时较长的挖矿过程,PoW共识机制的校验过程非常简洁迅速,只需要区块链节点先将随机值和区块头信息的哈希值重新进行一遍双 SHA3哈希,然后再把哈希生成的结果和目标值比较,看其是否小于目标值即可。

当然,除了PoW共识机制,还有DPOS共识机制、POS共识机制。DPOS (Delegated Proof of Stake)共识机制为区块链网络提供去中心化和事务处理的共识协议,从而减少该区块链网络中的资源消耗。

以公司董事会表决来比喻的话,董事会的股东成员就相当于该区块链中的节点。在董事会表决中,所有股东都有权进行投票表决,一旦股东的投票支持率超过51%,那么董事会的某一项决定就能通过。DPOS共识机制下的区块链节点与其类似,各节点达成共识就意味着“有效”, DPOS共识机制会将权力分发给区块链中的所有节点,所有节点达成共识就意味着交易能够顺利进行。

在董事会表决中,“代表”是一个关键角色。“代表”就相当于区块链中生成区块的节点,想要成为“代表”,首先要做的就是支付一定量的保障金,以确保这个“代表”是可信的。每个用户都可以选择自己信任的“代表”,投票数排在前列的代表就可以依照时间顺序生成区块。

POS 共识机制是根据中本聪提出的币龄概念被提出的。该共识机制和PoW共识机制不同,每生成一个新区块就会提供一个证明,这个证明可以确认新生成的区块在被区块链网络认可之前是否接受过一定量的货币,从而证明生成该区块的节点对货币具有所有权。

POS 共识机制的挖矿过程除了和节点的算力相关,也和节点的权益相关,权益较大的节点比权益较小的节点更有优势。因此,基于POS共识机制的区块链系统的挖矿效率会比 PoW 共识机制更高,算力资源的浪费情况也会比PoW共识机制低。但是POS共识机制在本质上并没有脱离节点挖矿的制约,所以即使POS共识机制的算力资源浪费比PoW共识机制少,浪费情况依然存在。

2.3.2 数据无法篡改

数据无法篡改是指只要数据被写入区块链,包括系统管理员在内的任何人都无法将其篡改。这对数据提供方和数据接收方都有好处:一方面,数据提供方可以证明自己的数据并没有被篡改;另一方面,数据接收方可以确保自己接收到的数据没有被篡改。

通常,不变性都是相对的,例如,某人将一封电子邮件发送给了所有的朋友,从他的角度看,这封电子邮件就是不可变的,因为想要删除这封电子邮件,只有说服他的朋友或操纵邮件服务器的管理人员才可以。也就是说,在这封电子邮件没有任何协作和检测风险的情况下,发送者是无法将其撤销或篡改的。

另外,终端用户只拥有私人数据库的只读权限,根本无法对数据库中的数据进行篡改,但是那些拥有访问权限的系统管理员却很有可能做到。那么,应该如何避免出现某些系统管理员为了自己的利益而篡改数据的现象呢?创建责任分离机制是目前值得尝试的一个手段,它能够防止系统管理员在未被监视的情况下篡改数据库中的数据。

系统管理员虽然可以篡改数据库中的数据,但存储日志的系统很可能由其他系统管理员拥有和管理。这样一来,任何一个系统管理员篡改数据的行为都会被阻止。虽然责任分离机制确实可以起到一定的作用,但并没有把数据的不可变性放在首要位置。而区块链的共识机制则避免了这样的问题,其不可变性主要体现在以下三个方面。

1.区块链的哈希和块

从本质上讲,区块链其实就是一个大的数据库,并且具有一些事先商定好的技术和业务逻辑标准。通过点对点协议和相关数据规则,区块链不仅可以实现数据之间的同步,还可以保证这些数据不被篡改。这里所说的不被篡改涉及以下两个关键概念。

1)哈希(也称为散列)

在区块链中,保证数据不被篡改主要得益于哈希函数和非对称加密,两者均属于密码学的范畴。非对称加密在前文已经有所介绍,哈希函数也在前文中有所涉及,此处就它们是如何保证数据不可篡改的做一个补充说明。

在哈希函数中,Y=H(X),在有X的情况下很容易推算出Y,但在有Y的情况下不能算出X,同时只有Y也不能找到另一个X 使H(X )=Y成立。此外,即使XX 差距很小,H(X)和H(X )也完全没有关系。

哈希函数主要被用来验证信息的完整性,那么具体如何用哈希函数来保证数据不被篡改呢?我们可以观察其在非对称加密中的应用过程:

非对称加密和对称加密一样,都可用在信息加密上,除此之外,身份验证也是非对称加密的一个应用方面。非对称加密中的私钥只有用户本人拥有,一个人对应一把唯一的私钥,当发信者发送某一信息时,就可以对该信息进行哈希运算,运算完成后再对其私钥进行加密。收信者收到信息后就可以对该信息进行哈希运算,运算完成后再对与之对应的公钥进行解密,将解密出来的哈希值与加密时的哈希值进行对比,如果两个哈希值一样,那么就表示该信息的确是由本人发送出来且没有经过任何篡改。

2)块

在被添加到区块链数据库之前,交易都是被捆绑起来的,呈现出“块”的形态。这些块中都储存着非常重要的数据,如比特币交易信息、前一个块的哈希值等。因为每个块中都包含前一个块的哈希值,而且最终会形成一个块链,所以与在书账中使用页面编号分类相比,使用块创建分类交易账要更加合适。

例如某本书账是用1、2、3、4、5…进行编号的,这样就非常容易把编号为30的那一页撕掉,用交易非常相似且编号也为30的一页代替,而且该书账中第29—31页还是之前的第29—31页,其完整性不会受到任何影响。

区块链会引用块号的哈希值引用块,而不会直接引用块号,不仅如此,每个块还会对其正在用于构建的哈希进行明确指定,比如哈希值为66a045b45的块(使用哈希值a2c064616构建块)的后面是哈希值为8939a3c35的块(使用哈希值66a045b45构建块),接着是哈希值为a41f02e92的块(使用哈希值8939a3c35构建块)……

所以,块不是根据与内容无关的编号系统进行隐式排序,而是通过引用前一个块的哈希值进行显式排序。关键点有三个:每个块指向的并不是具有连续性的数字,而是前一个块的哈希值;每个块的内容是其哈希值的唯一来源;在内部,区块链的所有数据都是一致的。第三点也表明在检查的过程中,如果发现哈希值和数据匹配不上的现象,那中间一定存在某些篡改行为。

2.隔离的区块链数据

在介绍这一部分之前,应该先考虑以下几个问题:如果把区块链复制到一个内存为55GB 的 U 盘中会出现什么样的情况?在将其传递给接收者之前,提供者可以进行怎样的处理?可以在神不知鬼不觉的情况下篡改其中的数据吗?区块链中包含着大量的区块(400000个左右),如果有人为了逃避付款而试图从中移除一笔交易,又会发生什么样的后果?

1)块的散列失败

在接收到存储着区块链的U盘之后,接收者可以做的第一件事就是在块数据的基础上,对所有块的哈希值进行重新计算,以验证哈希值与每个块的内容是否一致。如果不一致,就表示交易信息不能与块的哈希值相匹配,也意味着块已经被篡改过。这样一来,接收者就可以清楚地知道自己收到的数据是不是正确且完整的。

2)破坏整条链

前一个块的哈希值都会包含在下一个块中,所以如果前一个块的哈希值发生了变化,那么这个块就会把已经不存在的块的哈希值引用过来(例如块200001引用了已经发生变化的块200000的旧哈希值),从而导致区块链破裂。

3)区块链不易重建

一般情况下,类似比特币这样的证明工作区块链,都会存在一个共同的难题——挖矿困难。对于比特币而言,要想被认为是有效的,那就必须遵循某种极为严格的模式——目标值必须大于哈希值,简单来说就是“从一定数量的零开始”。

因此,要想重建区块链的话,除了需要对块的哈希值进行重新计算,还必须保证目标值大于重新计算出来的哈希值。这也就表示,在找到小于目标值的哈希值之前,必须要对块内容的随机数进行重复调整,还要对块进行重新挖掘,这就需要执行者具备一些非常关键的计算能力。

在重新挖掘整个区块链的时候,执行者必须要从发生变化的那一个块开始进行。鉴于需要完成大量的计算工作才可以生成满足条件的有效哈希,所以期间难免会出现问题。除此之外,区块链中发生变化的区块越多,需要重新挖矿的块就越多,工作量就越大,所需的时间也就越长。

一般情况下,私人区块链的块添加机制是有所不同的。具体来讲,在私人区块链中添加块不需要大量的证明工作,而是采取随机循环的方式,并且块添加者必须在每个块中留下数字签名。

另外,要想区块链有效且可以被接受的话,签署必须要由一组有定义的执行者参与,也就是说,为了重新创建区块链,执行者必须得到其他块添加者的密钥,但是对于工作量证明的哈希而言,得到这些密钥并没有那么简单。

如果执行者完成了上述工作,那么U盘上的数据就会在内部保持一致,从而成为一个看似有效的区块链。但是如果面对的是具有多个副本的监管机构,那么这样的区块链就不会产生任何效果。

以上内容只适用于将U盘上的数据当作唯一版本的监管机构,如果监管机构有其他副本,只需要检查副本中最近区块的哈希值或任意一个数字,若发现和U盘中对应的哈希值或数字不一致,就可以第一时间察觉到数据已经发生了某些变化。所以,创建虚假区块链是一件非常不容易的事情。

3.更改一个区块链

对于大多数区块链来说,共识的基础都是“最长链”规则,那么何谓“最长链”规则?从广义上讲,如果将多条具有极强竞争力的有效链摆在一个参与者面前,那么他会更愿意相信包含着更多块的那一条链。也就是说,如果现在有两个具有竞争关系的区块链:已经被修正过的短区块链和没有被修正过的长有效链,因为受到“最长链”规则的影响,参与者肯定会更相信后者。

在这种情况下,如果让参与者相信已经被修正过的区块链,就需要将其打造得比没有被修正过的长有效链更长,这就需要借助其他块添加者的私钥或强大的计算能力。

但是即使通过某些努力做到了这一点,或者在技术层面上这个新链条已经是有效的了,它也有可能被调查,因为监管机构会猜测是否某个块重新组织后形成的链要长于其他区块链。

综上所述,在离线区块链中更改数据已经不是一件容易的事情,在实时区块链中更改数据的难度更大。

另外,除了区块链不可变,区块链中的数据也是不可变的。如果有人要对某些数据进行篡改,那他的企图很容易就会被监管机构检测到。因此,在保证数据的安全性和完整性方面,区块链中的共识机制确实可以发挥非常重要的作用,也可以达到期望的良好效果。