公有链的七大超级难题之设计可持续发展的共识算法
摘要: 区块链的本质远不止分布式账本,区块链如何安全地达成共识,以比特币PoW为代表的共识为何不可持续,怎样设计一个可持续的共识机制?
< 本文看点 >
区块链的本质远不止分布式账本,区块链如何安全地达成共识,以比特币PoW为代表的共识为何不可持续,以及怎样设计一个可持续的共识机制?
▼
2018年以来,沉淀了多年的区块链技术终于大火,而大家对于区块链的理解依然停留在分布式账本上。分布式账本,不可篡改,可以说是区块链最原始的特性,目前的公链技术可以承载更多类型的应用,对于区块链的理解也可以围绕多个角度展开,我们先从技术本质的角度来理解究竟什么是区块链。
区块链是一种存储数据的方式,其本质就是一个状态机和一个数据库。
一.状态机:表示状态及其转移的机器
状态,可认为是系统当前各方面指标的值,状态机则是指发生了一些条件,当前状态被改变到下一个状态。比如我当前的状态是口袋里有十块钱,给早点老板了五块钱,到达下一个状态:口袋剩余五块钱。
对于比特币来说:是交易账单的状态转移。
对于以太坊来说,智能合约允许更为复杂的状态转移规则,可以在触发条件满足的情况下,按照约定的规则进行状态转移。
讲个程序员冷笑话:
老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。” 当晚,程序员老公手捧一个包子进了家门。。。 老婆怒道:“你怎么就买了一个包子?!” 老公答曰:“因为看到了卖西瓜的。”
这个智能合约的条件是:“是否看到卖西瓜的”。状态转移规则是:如果没看到,买一斤包子,如果看到了,买一个包子。状态的转移是:程序员由本来买一斤包子的状态,因为触发了“看到了卖西瓜的”这个条件,转变为只买一个包子。
对于Genaro Network而言,还要再复杂一点,因为牵扯到网络中数据存储导致的状态改变:
二.数据库:是按照数据结构来组织、存储、管理数据的仓库
数据结构:计算机存储数据的方式,常见的基本数据结构有队列、堆栈、链表、树、图等等。对于复杂系统,其数据结构也都是由基本的数据结构组合改编而成。
在区块链中,数据结构采用的是一个链表,链表的每个节点就是一个区块,一个区块是一颗梅克尔树,包含了若干交易记录。
1. 链表
2. 区块(梅克尔树结构)
以下图为例,具体的交易记录为:D0,D1,D2,D3,两两结合,不断向上计算哈希值,得到树根,也就是常说的“区块头”。
这实际上是双层结构。区块链之所以采用这样的“双层”数据结构,是因为每个区块内的交易相当于是并行,多笔交易被包含在一个区块中,增加了区块大小,在出块速度一定的情况下,增加了区块数据量,从而提高系统的性能。
如上图,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太瓦时twh(1太瓦时为10亿度电),超过了全球159个国家的年均用电量。爱尔兰全国(477万人口)一年的用电量也只有25太瓦时的电力。而今年的最新估计表明,这一数字已经接近哥伦比亚全国的用电量,达到59.6twh。
可以推算,如果没有在机制(mechanism)上的彻底变革,仅仅用于完成PoW计算的电力花费将迟早超过全球任何一个国家的年均用电量。更何况,电力能源属于二次能源,为了产生电力需要花费的一次能源(如煤炭、石油、水力、天然气)的消耗更是难以计数。长此以往,在利益的驱动下,假如未来全球大多数的能源都被用来挖矿,那将会造成世界性的能源危机。
其次,主链上同一时间只会有一个区块上链,这个由计算出来的矿工获得,但是其他参与计算的矿工虽然消耗了大量算力,却没有任何收益,浪费了大量计算资源。
最重要的一点,这些计算并不是有实际意义的计算,换句话说:以比特币为代表的使用PoW共识的公有链,本质上只能起到账本的作用,而不具备实际的功能,所以其所做的计算也都是没有实际作用的。
起初我们在探讨设立Genaro共识机制的时候, 就明确一点:要做有意义的计算,也就是说,公有链除了做账本,本来还应该完成互联网中的某些其他功能。世界上本来就有很多东西需要大量的算力,为什么一定要做没有实际意义的哈希计算呢?为什么不计算蛋白质的分子结构,计算基因工程,计算机器学习?
所以说,减少能源的消耗,同时完成有意义的计算,是共识机制设计的关键所在。
但是这两点同时实现极为困难。第一,如果消耗的资源减少,安全性就越低,因为攻击者越容易将分叉链让大家误以为是主链;第二,有意义的计算如何有规律的与区块链系统连接起来,比如如果做机器学习计算,稳定的Data Set从何而来,计算的奖励如何分配,都是需要精心设计的地方。
在这样的一个背景下,“激进”的PoS逐渐获得了更多的认可,几乎完全不需要进行计算,从而大大降低了能耗。
>> PoS(Proof of Stake):权益证明。如果把PoW比作意大利国家队稳健的防守体系,那么PoS则拥有巴西队野心,以降低防守力,来增加攻击性。
PoS完全不需要进行计算,而是需要证明者对某些数量的权益展示所有权。证明节点对区块结果进行押注,如果错误则丧失押注,如果正确则赢得奖励。
然而,无论是在工业界还是学术界,PoS都是一把双刃剑,在提升性能的同时,很难保证其安全性。最著名的两个问题是:nothing at stake以及long range attack(长距离攻击)。以太坊在PoS的过程中也遇到了诸多困难。
>> Nothing at stake:如果攻击者fork当前的链,挖矿节点的保证金已经押在了两条链上,他不需要去判断哪条是正确的链,而是都支持,从而导致攻击者得逞,而无论攻击者是否得逞,节点选择全部挖的策略也可以保障自己的收益,所以只要理性节点不是“token大户”,都会去支持攻击者。
这个问题已经有人提出一些解决方案,例如vitalik提出的“错误惩罚”,如果一个节点在发生分叉时选择都押注,如果押注超过一条链或者押注了错误的链会被惩罚。
>> Long range attack则是更为棘手的问题:可以理解为PoS中的女巫攻击。攻击者不是去fork现有的链,而是回到初始阶段的链,造一条更长的新的链,让网络误以为是主链。因为PoS共识中节点的增长速度没有限定(比特币PoW有限定,10分钟出一个块),攻击者可以用很短的时间造一条更长的链。一个区块链系统,一开始不会有很多矿工,前期的块都是少数矿工挖的,如果这些矿工互相串通好,联合起来回到早起阶段,因为那个阶段只有他们可以挖接下来的块,他们可以很容易联合发起此攻击。
目前long range attack没有很好的解决方案,一些客户端(包括casper)试图通过限定更改区块的长度来解决这个问题,比如NXT的处理方式为超过720个区块的不能被更改。但这只是降低了问题发生的概率,或者说转化了问题,会导致“weak subjectivity”。
事实上,已经有很多PoS算法试图解决上述问题:
>> Ouroboros:一个可证明安全的PoS区块链协议,Ouroboros加入了权益证明算法,定义了节点对账本状态达到共识的方法,它是第一个宣称进行严格的安全分析的PoS类型的区块链协议。
Ouroboros在一定条件下的实践验证中,解决了各种攻击,包括双花攻击、交易拒绝攻击、51%攻击、无利害关系、去同步攻击以及其他攻击。某些前提下,它被科学证明安全的。它在亚马逊云中运行了基准测试,这些测试展现了Ouroboros的权益证明区块链协议,在性能方面的优势。
不过经常回头验证的模式也有问题。多次回头,一方面影响TPS,一方面会增加更多的通信,另一方面还很难验证回头stake的是否都为正确。
>> DPoS,相比于普通的PoS,多了一个选举机制,类似议会制度,不仅币数很关键,声望更加关键,从而实现速度与安全性的提高,DPoS希望通过投票来筛选信任节点,解决PoS的安全隐患。
类似的,还有PoP,PoC:
>> PoP (Proof of Participation),基于账户参与度的算法,PoP 将 PoI 和DPoS 的思想结合,既能确保对设备的公平性,又拥有社区的共识,同时减少了算力浪费。让记账这件事情更经济效率, 从而支撑起更多大规模的协作体系。
>> PoC (Proof of Credit),信用共识机制, “PoC”继承了“PoW”通过计算来实现账本安全的特性,但同时提出的非常有创新的一点“利用用户的信用值”作为挖矿的准入门槛,这样就会积累有效的节点为网络加密计算。同样“PoC”也相对“PoW”在社区发展中公平了很多,在参与挖矿的时候,是根据自己的信用值来判断是不是有共识(挖矿)资格。在达到共识的信用值后,为了防止节点的违规行为还必须提交一定的保证金额,才能参与共识,共识网络中加入了简单的智能合约,作为共识的契约来约束每个节点参与共识,如果有违规,会付出很大的惩罚。这也保证了节点会正常参与共识,用来提高网络的安全性。
但目前,没有一种PoS是被证明和PoW一样安全的,在设计上尽可能的通过制定出块规则与奖励惩罚机制来解决nothing at stake等问题,但本质还是不安全的。比较可行的方法是进行一个折中,PoW+PoS混合共识机制。
例如第一个使用PoS的项目:peercoin。peercoin是第一个PoS算法,于2012年提出,PPCoin的最大创新是其采矿方式混合了PoW+PoS方式,而PoW部分加入币龄的概念,越早买优势越大,相比与纯PoS或者纯PoW,达到节能和安全的平衡。
类似的还有CFFG,PoW+PoS混合模型,由Vitalik Buterin带领研究Casper the Friendly Finality Gadget(CFFG),需要进行两周期投票,并且需要质押TOKEN。第一次是PoW,超过2/3即可验证成功,第二次是PoS,超过2/3即可验证成功,然后确认区块,验证者即可获得收益。验证者是被激励着集合在权威链上的,因为如果他们持续在不同的链上进行投票将会受到惩罚。验证者不仅仅会为双重投票而受罚,也要为在不正确的链上进行投票而受到惩罚。
Tendermin,2014年,由Jae Kwon带领研究,BFT与PoS混合机制,假设少于1/3的验证者是拜占庭,Tendermint保证安全永远不会被破坏——也就是,验证者(2/3以上)永远不会在同一个高度提交冲突的区块。因此,基于Temdermint的区块链永远不会分叉。Tendermint的设计决策偏向于安全性和不可改变性。
但这样的混合共识机制,虽然降低了能耗,但依然没有本质上解决PoW“浪费不必要能耗”的问题。为了设计可持续发展的共识算法,需要同时做到以下两点:
1. 找到一个低能耗、有实际效用的算法
2. 将此实际效用作为PoS的防御机制
为了做到以上两点,势必需要PoX+PoS这样的混合共识机制,至于X是什么,就取决于各个公链的设计了 如果公有链除了账本之外,还有其他的功能,则这个功能就是公式中的“X”。例如Genaro公链可以解决存储问题,于是有了SPoR + PoS。
这也是Genaro的SPoR + PoS混合共识机制的设计初衷。
▼
先简单介绍一下什么是SPoR:可以被看作是一个微型PoW。
>> SPoR全称为sentinel proof of retrievability,是一种数据可检索行证明。数据可检索证明的意思是,当用户不取回文件的时候,依然可以相信文件完好无损的保存在系统中。在Genaro系统中每天都会对存储节点进行“challenge”,存储节点通过运行SPoR算法表明数据是可被取回的。
首先这种证明的难度不会随着时间的推移而增加。证明一个文件可取回,今天的计算量和明年是几乎一致的。
其次这是在实际生活中有用的计算,即便是云存储也本身需要这样的证明。SPoR是一种在存储领域被验证为可靠的算法,将其引入区块链系统并不会带来额外的隐患。
Genaro并不是用SPoR代替PoW, 实际上,Genaro的混合共识机制是以PoS为主体,而SPoR主要用来要求节点贡献算力、存储空间等资源来加强PoS共识的“防守”。此混合共识机制的大致过程为:
step1. 节点进行GNX押注,分享存储空间,申请加入委员会
step2. 报名者进行实力排名(根据epoch中heft重量与GNX押注等因素)确定委员会名单
step3. 由委员会点按排名顺序依次连续出块
step4. 出块节点获得奖励
这个流程相当于通过SPoR来筛选可信节点,也即要求共识节点付出一定代价,也即something at stake,于是nothing at stake不攻即破。其中,选取部分节点以及允许信任节点连续出块是提升TPS的方法,详情请参考之后的文章《公有链七大超级难题之提升TPS的必要性与方法》
对于long range attack而言,Genaro的混合共识机制的本质是将存储网络与公有链进行深度绑定。可以简单这样理解:公有链中的交易分为两部分:
1. 普通交易
2. 存储行为引发的交易(例如上传下载分享等)
而第2类交易会将文件的sentinel相关信息存入区块中。那么,如果节点想要实施long range attack,回到最初阶段的区块链状态,则无法复原存储网络,就无法将区块推进到当前高度,网络会判断你不是最长链,直接进行惩罚。
此外,这样的混合共识机制还可以防止分叉。如果攻击者想要故意分叉(就像ETC与ETH),即便可以拉拢部分矿工在分叉链上继续出块,但这条链将会丧失用户数据的完整性,成为了一条毫无价值的“伪链”,用户不会使用,矿工就没有了消费者,自然不会去挖。
这样,通过引入“存储”这样更多的一个维度,打造出的SPoR + PoS混合共识机制,变成为了可持续共识机制的一个例子,这也说明,可持续共识机制要求公链本身有记账之外的更多实际功能。
最后,共识算法的可持续发展还有一个必要条件:任意节点可以加入并作出贡献,这对共识算法的选取有了更高的要求,请期待系列文章下篇:《公有链七大超级难题之建立点对点的分享社区》。
公有链七大超级难题,是公有链绕不开的关键。七大挑战环环相扣,需要一个从宏观到微观的深度认知,不仅仅涉及到技术领域,同时,经济、营销、市场、社会等领域都需要深入考虑,Genaro Network点对点存储和公有链的通证经济的体系设计,不仅是未知领域的探索,更是一场艺术之旅,大家请继续关注系列文章《公有链七大超级难题》和我们一起踏上未来旅程,迎接区块链的挑战与变革。
本文作者:Larry
本文技术校对:Waylon
本文内容校对/编辑/学术整理:Xuan, Sophia,Iris
评论(0)
Oh! no
您是否确认要删除该条评论吗?