
区块链的本质远不止分布式账本,区块链如何安全地达成共识,以Pow为代表的共识机制为何不可持续,以及怎样设计一个可持续的共识机制?
2018年以来,沉淀了多年的区块链技术终于大火,而大家对于区块链的理解依然停留在分布式账本上。点对点、不可篡改、加密算法,可以说是区块链最原始的特性。其实对于区块链的理解也可以从多个角度展开,我们先从技术本质的角度来理解究竟什么是区块链。

首先区块链是一种存储数据的方式,其本质就是一个状态机和一个数据库。
1.状态机:表示状态及其转移的机器
状态,可认为是系统当前各方面指标的值,状态机则是指发生了一些指令,当前状态被改变到下一个状态。举个例子:我当前的状态是口袋里有十块钱,买东西支付了五块钱,结果就是口袋还剩下五块钱。当前的状态是:“口袋里有十块钱”,发生的指令是:“买东西这件事情”,下一个的状态是:“口袋还剩下五块钱”。
对于比特币来说,比特币的交易账单就是状态转移。

对于以太坊来说,智能合约允许更为复杂的状态转移规则,可以在触发条件满足的情况下,按照约定的规则进行状态转移。

说了那么多,大家是不是有点累了呢?那么,给大家讲个关于程序员的冷笑话吧~~~
老婆给一个做程序员的老公打电话说:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。” 当晚,程序员老公手捧一个包子进了家门……老婆怒道:“你怎么就买了一个包子?” 老公答曰:“因为看到了卖西瓜的。”
这个智能合约的条件是:“是否看到卖西瓜的”,状态转移的规则是:“如果没看到,买一斤包子;如果看到了,买一个包子”,状态的转移是:“程序员由本来买一斤包子的状态,因为触发了‘看到了卖西瓜的’这个条件,转变为只买一个包子”。
其实对于Genaro Network而言,还要再复杂一点,因为牵扯到网络中数据存储导致的状态改变:

2.数据库:按照数据结构来组织、存储、管理数据的仓库
数据结构:计算机存储数据的方式,常见的基本数据结构有队列、堆栈、链表、树、图……对于复杂系统,其数据结构也都是由基本的数据结构组合改编而成。在区块链当中,数据结构采用的是一个链表,链表的每个节点就是一个区块,一个区块是一颗梅克尔树,树上包含了若干交易记录。
(1)链表

(2) 区块
以下图为例,具体的交易记录为:B0、B1、B2……Bn,两两结合,不断向上计算哈希值,得到树根,也就是常说的“区块头”。


这实际上是双层结构。区块链之所以采用这样的“双层”数据结构,是因为每个区块内的交易相当于是并行,多笔交易被包含在一个区块中,增加了区块大小,在出块速度一定的情况下,增加了区块数据量,从而提高系统的性能。
如上图中D0,D1,D2,D3是由一名矿工计算,然后进行广播验证,其余矿工也可以一次验证四笔交易。
大家看到的移动端轻钱包就是利用了这个原理。轻钱包仅仅作为一个移动支付工具,是不能占用太大空间的,所以不可能保存全部节点数据,这时候就得用到以上原理,仅验证区块头(也就是之前所说的root值)就能确认交易是否存在。他能过滤掉大量不相关的数据,减少客户端不必要的下载量,同时实现去中心化验证。
这个原理叫简单支付验证(SPV,Simplified Payment Verification)。SPV充分利用梅克尔树结构,在寻找交易时,只需寻找区块头而不是整个区块,区块头只有80字节,每小时6个,一年也就4M大小,一般设备都能承载。
综上所述,区块链的本质是状态机和数据库。
同时区块链对于应用来说是一个分布式数据库,通过去中心化的方式集体维护一个数据可信的数据库。

那么问题来了,如何在一个去中心化的环境里,让多个完全陌生的网络节点来承认这个区块链的状态机和数据库呢?换句话说,如何设计这个系统的交易规则,才能让陌生的买卖双方,在没有任何第三方的情况下,产生信任从而完成交易呢?答案就是共识机制。
共识机制至关重要,同时也是区块链技术的核心。很大程度上决定了整个区块链系统节点间的相互信任程度,也决定了其他使用者对于区块链上的数据信任程度。一个区块链系统共识机制设计得好与坏直接决定了系统的工作效率、运行成本、安全性、稳定性,甚至毫不夸张地说,直接决定了系统存在的价值。
下面,我们开始探讨下一个话题 —— 如何设计可持续发展的共识算法。

所谓共识算法,就是每个节点对于本区块的正确性达成共识。
共识是一切交易的基础,达成共识越分散(参与度越高),其效率就越低,同时安全性也更高,因此也就越稳定;相反,达成共识越集中(参与度越低),其效率就越高,也就越容易出现独裁和腐败现象,同时安全性也就越低。如何平衡这些因素,使其具有应用价值,是我们值得探讨的重要话题。
以主流的POW(Proof of Work)共识机制为例,根据区块与一个随机数进行哈希运算,可简单理解为必须通过大量数学计算之后,才能将区块挂入区块链中。

为什么不能让矿工直接把区块挂上去呢?
在区块链当中,通常最长的链被认为是正确的链,所有矿工都选择最长的链来挖,才能确保链的唯一性。公有链作为一个完全开放的系统 —— 任何节点都可以来当矿工,其背后的设计哲学在于“作恶所付出的代价大于作恶所带来的好处,理论上来讲节点不会做恶”。传奇跑者普雷方丹也有一句名言:“你可以打败我,但你必须付出足够的努力与汗水”。如果矿工把区块直接挂到链上的话,那么攻击者就可以随意分叉,然后疯狂的把这条链加长,使人误以为这才是正确的区块链。
在POW共识机制中,攻击者必须进行工作量证明才能把分叉链加长,必须付出比全网更大的算力(51%以上)才能跑的最快,同一时间形成更多区块,让人误以为这是最长的链,从而完成攻击,但这显然是不可能的。
这个系统的设计逻辑没有问题的,但在POW的过程中,需要消耗大量无用的算力与能源。

首先,POW所需的算力不断增大,比特币为了保证每10分钟产生一个区块,同时在2140年产生一共2100万枚的比特币,就必须在每2016个区块之后进行难度升级,所以挖矿设备也需要不断的进行换代才能满足需求。从CPU,到GPU,再到FPGA挖矿等等,耗电量也与日俱增。
有英国的研究表明,2017年用在“挖矿”上的电量超过29.05太瓦时(1太瓦时为10亿度电),超过了全球159个国家的年均用电量。爱尔兰全国(477万人口)一年的用电量也只有25太瓦时的电力。而今年的最新研究表明,这一数字已经接近哥伦比亚全年的用电量,已经达到59.60太瓦时。可以推算,如果没有在共识机制上的彻底变革,仅仅用于完成POW计算的电力花费将迟早超过全球任何一个国家的全年用电量。更何况,电力能源属于二次能源,为了产生电力需要花费的一次能源(如煤炭、石油、水力、天然气)的消耗更是难以计数。长此以往,在利益的驱动下,假如未来全球大多数的能源都被用来挖矿,那将会造成世界性的能源危机。

其次,主链上同一时间只会有一个区块上链,这个由计算出来的矿工获得,但是其他参与计算的矿工虽然消耗了大量算力,却没有任何收益,从而浪费了大量能源资源。这些计算并不是有实际意义的计算,换句话说:以比特币为代表使用POW共识机制的公有链,本质上只能起到账本的作用,并不具备实际的功能,其所做的大量计算也都是没有实际作用的。

起初我们在探讨设计Genaro共识机制的时候,就明确一点:要做有意义的计算。也就是说,公有链除了做账本,还应该要完成互联网中的某些其他功能。世界上本来就有很多东西需要大量的算力,为什么一定要做没有实际意义的哈希计算呢?为什么不计算蛋白质的分子结构,计算基因工程,计算机器学习呢?所以说,减少能源的消耗,同时完成有意义的计算,是设计的共识机制关键所在。
但是这两点同时实现极为困难。第一,如果消耗的资源减少,安全性就会降低,因为攻击者越容易将分叉链让大家误以为是主链;第二,如何将有意义的计算与区块链系统有规律地连接起来。比如说,如果做机器学习的计算,稳定的Data Set从何而来,计算的奖励将如何分配,这些都是需要精心设计的地方。
在这样的一个背景下,POS逐渐获得了更多的认可,几乎完全不需要进行计算,从而大大降低了能源资源。

>>> POS(Proof of stake):权益证明。如果把POW比作意大利国家队稳健的防守体系,那么POS则是拥有巴西队野心,以降低防守力来增加攻击性的共识机制。
POS完全不需要进行计算,而是需要证明者对某些数量的权益展示所有权。证明节点对区块的结果进行押注,如果错误则丧失押注,如果正确则赢得奖励。
然而,无论是在工业界还是学术界,POS都是一把双刃剑,在提升性能的同时,很难保证其安全性。最著名的两个问题是:Nothing at stake以及Long range attack。以太坊在POS的过程中也遇到了诸多困难。
>> Nothing at stake:如果攻击者去攻击当前的链,挖矿节点的保证金已经押在了两条链上,他不需要去判断哪条是正确的链,哪条是分叉出来的链,而是选择都去支持,从而导致攻击者得逞。无论攻击者是否得逞,节点选择全部挖的策略也可以保障自己的收益,所以只要理性节点不是“token大户”,都会去支持攻击者。
这个问题已经有人提出了一些解决方案,例如Vitalik提出的“错误惩罚”,如果一个节点在发生分叉时选择都押注,如果押注超过一条链或者押注了错误的链会被接受惩罚。
>> Long range attack则是更为棘手的问题:可以理解为PoS中的女巫攻击。攻击者不是去fork现有的链,而是回到初始阶段的链,造一条更长的新的链,让网络误以为是主链。因为POS共识中节点的增长速度没有限定(比特币有限定,每十分钟产生一个区块),攻击者可以用很短的时间造一条更长的链。一个区块链系统,一开始不会有很多矿工,前期的区块都是少数矿工挖的,如果这些矿工互相串通好,联合起来回到早起阶段,因为那个阶段只有他们可以挖接下来的区块,他们可以很容易联合发起攻击。
目前Long range attack没有很好的解决方案,一些客户端(包括casper)试图通过限定更改区块的长度来解决这个问题,比如NXT的处理方式为超过720个区块的不能被更改。但这只是降低了问题发生的概率,或者说转化了问题,会导致“weak subjectivity”。
网友评论