53

王嘉平:区块链本质论 | Odaily星球日报

 4 years ago
source link: https://www.odaily.com/post/5142077
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

王嘉平:区块链本质论

星球君的朋友们2019-10-29

区块链的本质是使冯诺依曼计算体系不再依赖特定的计算物理设施,从而使得其计算过程和相关的存储和通讯,不再为单方控制,而由各个参与者多方分时控制。

编者按:本文来自 王嘉平(ID:jiaping_bc),作者:王嘉平,Odaily星球日报经授权转载。

区块链被大家关注事件好事情,但非常不希望看到各种区块链项目盲目上马,造成各种社会资源的浪费。区块链技术本身尚在发展阶段,还有很多核心技术问题有待突破,对区块链技术本质还充斥着各种不同的理解。后面几天我们将就区块链的计算本质,技术难点,业务调整,社会影响等方面和大家分享。

区块链的本质是使冯诺依曼计算体系不再依赖特定的计算物理设施,从而使得其计算过程和相关的存储和通讯,不再为单方控制,而由各个参与者多方分时控制。这是一种全新的计算范式,区块链计算范式,所谓的不可篡改数据库,仅仅是这个内涵的一部分外延。共识算法,分布式网络是当前实现这一计算范式的重要技术手段。这些是区块链的技术本质。

这是什么意思呢?之前所有信息系统,比如支付,搜索,推荐什么的,都是单一的一家企业掌握这个计算过程的全部,数据也好,计算代码也好,计算的输入/输出都被一个单一企业完全控制。如果这个计算是为了大规模的公众服务的,那么这个企业可以通过任意操纵这个计算过程,任意修改数据和状态,限定和歧视来自外部的输入,从而谋求高额利润甚至造成严重的社会问题 (这类问题在搜索领域已经凸显)。同时企业也需要承担巨大的责任保护好这个信息系统的数据和计算过程,否则就会导致严重的大规模数据泄露问题(例如时常听到的拖库事件,导致几百万用户的个人数据被盗取,甚至如开房记录等)。

区块链计算范式,由多方来分时控制计算过程,而不是单一方

在区块链计算范式中,将是多家企业和机构,共同控制这个计算过程,这一步计算在一家公司的计算机上完成,下一步计算在另一家机构的计算机上完成。各家接力计算过程,任何一家机构,如果篡改计算逻辑,或者恶意修改数据,立刻会被下一个计算接力的公司发现,并且回滚到上一步正确的计算步骤。这个一旦预设好计算逻辑和规则,没有任何一家公司可以篡改,也没有任何一家公司可以操纵这个计算过程。

这样做的一个核心优势是,在区块链计算范式中,当然像Google那样所谓的不做恶,将不再是个口号,而是一个可以被证明被验证的。也就是说区块链计算范式的根本优势在于:

在业务全部信息可形式化的范畴内,让这个计算系统可以自证清白。

这件事情是之前互联网技术栈无法实现的,也是未来区块链计算范式给实际业务带来的根本上的全新技术支撑。正因为这个技术支撑,比特币得以实现,没有任何人可以操纵比特币系统既定的发行规则和转账规则,虽然这个网络允许任何人以匿名方式参与其接力计算过程,即出块。我们通常说的不可篡改数据库也源于这个技术支撑,我们一开始约定了数据不可篡改,只可追加,在区块链的计算范式下,这个约定就能被严格执行,不会被人为操纵。这里真正的挑战并不是设立不可篡改这个规则,而是如何让这个规则被严格执行,这一点是区块链的核心能力。

提到区块链,Consensus 是其中最为大家关注的一个新概念,被翻译成共识机制,或共识算法,或共识协议。这个东西到底是干嘛的呢?共识机制本质是一个解决方案,当一个分布式系统里面出现不一致的情况时,我们如何最终裁定一个唯一的大家公认的结果,消解这个不一致性。注意了,这里共识仅仅指分布式系统里面的一个算法方案,和我们通常意义上的舆论呀,社会认同呀,组织关系呀什么的,毫无关系,就像是雷锋和雷锋塔一样。别被忽悠了 ...

为什么区块链会需要共识机制呢,究其根本,源自于上一篇讲到的区块链的计算本质。

因为在区块链系统中,计算是通过全网各方接力完成的,在去中心化的区块链网络中,并没有一个总指挥来分派这个接力过程,那么即使没有恶意攻击,也难免会发生己方争抢接力的情况,从而导致整个系统中出现多个不一致的接力结果。而共识机制所起得作用,就是在这个时候最终认定,哪个结果该留下来,后面按这个接着走;哪个结果会被抛弃。

对于这个问题,很早在分布式系统领域,为了解决容错问题,早有答案,并被归纳为一个叫做拜占庭将军问题 (The Byzantine Generals Problem),其对应的有效解决方案成为拜占庭容错(Byzantine Fault Tolerance),就是经常听到的BFT。早在2007年,这个问题就有了高效的算法 (PBFT),但是为什么2008年末,中本聪发表的比特币系统设计方案中却采用了完全不同的设计,而没有采用BFT类的算法呢?

我们先看看容错是什么?假设有100个传感器,在观测比如机器是否正常运转。那么如果有一部分的传感器坏了,给出了不正确的观测值,我们该如何最终推断正确的观测结果呢?这个就是容错。当然,逻辑上的解法正如你现在直接想到的,少数服从多数,事实上也确实如此简单。当然实际的算法中要互相传递和迭代最终认定的结果(基于数字签名),要限制结果认定的时间期限(所谓的epoch),要处理多数不够多的情况等。

从上面的例子可以看到,在BFT中,少数服从多数的这个数,来自于多少个共识的参与者。这个参与者的总是必须是预先设定好的。这意味着谁是参与者,得有个预先协商和设定的过程,在区块链系统中,有个叫法,叫做联盟链或者许可链(permissioning blockchain system)。这就是为什么叫做拜占庭将军问题,因为你得先是一个将军,那么问题来了,谁来批准你成为一个将军呢?

这就是比特币系统一开始不采用BFT算法的本质原因。在比特币系统中,并没有一个参与者的批准过程,任何人都可以直接参与这个共识过程,即所谓的公链或者叫无需许可链(permissionless blockchain system)。这是,我们如何利用少数服从多数呢?我们连总共有多少个参与者都不知道。这个部分就是比特币系统设计最耀眼的部分。很多人不明白这件事情,就觉得比特币系统好像就是一堆现有技术的堆砌,没什么技术含量。

在比特币系统中,少数服从多数的这个数,不再是多少个共识的参与者,而是一次次的哈希部分碰撞的计算结果。然后结合最长链规则来形成共识,即所谓的工作量证明(Proof-of-Work)。从这里大家可以看到,工作量证明方案解了一个比拜占庭将军问题更难更挑战的问题,就是在参与者集合未知的情况下,实现共识的一致性。 当然算法具体实现还有不少细节,工作量证明的难度调整呀,一致性后置的最长链原则,以及后面被改进的最重子树的原则等。

接着有了所谓的资产证明(Proof-of-Stake)共识系统,利用资产的数量来定义这个少数服从多数的这个数。利用资产的数量先行定义BFT共识算法中所需要的这个预设的参与者集合。这样,也可以实现无需许可链。也是一个不错的办法,只是,一开始初始的资产从何而来呢?

最后提一句性能,也就是吞吐量的事儿。很长一段时间大家以为吞吐量由共识算法决定,然后事实上并不是这样。上面提到的集中共识算法,都可以设定任意的块大小和出块间隔,来现实需要的吞吐量和块确认延迟。只要,整个底层网络有足够的带宽。下一篇,我们会着重聊聊这个事情。

性能: 吞吐量、确认延迟和状态容量

咱买个电脑,大家都知道要看处理器(CPU)的速度,每秒能处理多少指令;也会要看内存容量,这基本上决定了我们能同时开多少个应用,打开多大的文件并且不卡。区块链系统,也是类似,吞吐量类似于一台电脑的CPU处理速度,决定了每秒可以处理多少个交易;而状态容量类似于一台电脑的内存容量,决定了整个系统可以承载多少个用户(地址)在各个应用里面的状态。

有个额外的指标是确认延迟,这个源自一个很奇特的现象。区块链系统可以接受一个交易,但是没处理或者没处理完,就开始接受下一个交易了。这个时候你就会发现,例如每秒100个交易的处理吞吐量,并不是你发一个交易,1/100秒之后这个交易就处理完,并且被确认了。通常每个交易会需要历经更多的时间,才最终得以确认。

比特币性能很弱鸡,大家都知道,大约平均每秒处理7个交易。每个交易仅包含几个大整数的加减法,如果单纯是计算这些交易,随便拿个笔记本每秒都能算上百万的交易。那为啥比特币这么慢呢?先说个结论,这个事情不能赖在共识算法头上,这不是PoW的问题。共识算法的事儿可以先看上一篇:

比特币慢,有人说是PoW的难度很高,要十分钟才算一个块,也有人说比特币需要大量的算力才行。这些其实都是误解,把因果搞反了。十分钟才出一个块,是因为协议就是这么定的,不让出太快。如果大家算力多了,出块出得快了。比特币网络的算力调整算法会自动加大PoW难度,使得出块速度始终保持在十分钟一块的样子。需要大量的算力,是因为大家都要抢着去参与比特币的这个共识过程,因为每抢到一次机会,奖励25个比特币呀,看了一下,今天9000多美元一个。

所以,就这样参与比特币共识的算力越来越多,PoW的难度也越来越高,就是我们今天看到的状况。但是这个的PoW算力,只是在争抢出块机会,这个算力再大,也不会使得比特币处理交易的速度有丝毫的提升。比特币系统,吞吐量低的原因是因为,其最初上线的时候,顺应当时的底层互联网的通讯能力,设定了每十分钟出一个块,每个块大小为1M字节。然后每个交易差不到需要200到300个字节,然后综合起来就是这个大概7几个交易每秒的吞吐量了。

为什么比特币系统要这样设计呢?不能出块间隔小一点,或者每个块大一点吗?到底是什么被什么东西限制住了呢?答案是,

网络带宽从根本上限制了区块链的吞吐量

这就是为什么,我去年还看项目的时候,对于那些吹几十万几百万TPS的项目。我一般就问一个问题,你的系统跑起来需要多少带宽?要那么高的带宽,你就只能把所有节点放在一个机房里面,用局域网连起来,这不是区块链,这叫做云服务 .....

咱开头就讲到,区块链是在一个松散分布的节点之间,接力执行计算的过程。那么,计算的过程要能被接力,那就意味着每个节点都需要获得这个计算的最新的上下文,最新的数据和状态。在区块链里面,具体的做法是,有节点出了一个块之后,必须要有足够的时间,让大部分其他参与者都同步到这个新的块,然后再出下一个块。就是因为这个原因,吞吐量会受到网络带宽的限制,不能太高,否则区块链网络就会无法达成共识的一致性。

然后,毕竟我们现在的互联网已经比起10年前要快不少了。所以,现在把比特币网络加快几十倍其实根本不需要什么算法的改进,改大块大小,改小出块间隔就可以轻松实现至少几十倍的吞吐量提升。但是如果要进一步提高,并且还要保证其去中心的程度,这就有很大的理论挑战了。

这里需要强调一下,去中心的程度和性能是有矛盾的。去中心的程度要求,尽量多的人可以参与到网络里面来,可以自己运行一个节点。那么,带宽要求就不能太高,要匹配互联网接入的平均带宽水平。为什么DPOS(例如 EOS)这么高吞吐量?因为它去中心的程度基本没有,无异于云服务,那么他就可以利用非常高的带宽,是普通互联网接入带宽的几千倍,那么吞吐量当然就轻松提升了。

随着吞吐量的提升,除了带宽,对每个节点的CPU处理能力,磁盘的读写能力也都会有更高要求。这里强调带宽,不仅仅是因为带宽是首要瓶颈,更是因为高带宽对去中心的程度有极大的伤害,因为高带宽的接入受到地理位置的限制,基本上只能在数据中心。而CPU, 磁盘的升级,完全不受地理位置的约束。

性能: 状态容量

状态容量之于区块链,就好似内存大小之于一台电脑一样。但是这一点不像吞吐量的TPS被大家所关注。状态容量很少被各种项目拿来大肆吹嘘,是因为这个容量不是太好测定,同时要扩容状态容量极其困难。

状态具体指用区块链中来表示链上每一个地址(即用户)和每一个应用的状态,所有需要准备好为验证随时到来的交易的信息的总和就是区块链的状态。典型的,比如,这个状态包含每个地址的账户余额。当链上应用丰富的时候,每个地址将有更多的信息用来表示各个地址在各个应用中的状态。

状态容量就是指一个区块链系统可以具备多大的有效内存空间用来表示整个链上的状态。链上状态是必须随时驻留在内存中,准备用来验证随时到来的交易的,这个部分信息无法放在硬盘上,否则会大大减低交易验证的吞吐量,从而极大地约束区块链整体的吞吐量。那么状态容量具体是多少呢?

在第一篇计算本质中,我们介绍了,区块链网络中,每个参与节点需要随时准备好验证和更新下一个到来的区块,也就是说每个节点都完整地存储了链上每一个地址,每一个应用的状态。那么状态容量本质上受限于每一个参与节点的内存容量。从这个意义上来说,只要提高每个参与节点的内存容量,就可以提升一个区块链网络的有效状态容量。

但是,提高单节点内存容量首先这个提升非常有限,更大的问题是提高了参与者的进入门槛, 严重伤害了一个区块链网络的去中心程度。对于联盟链系统来说,尚可接受;但对于公链系统来说,这种提升状态容量是不可取的。如果要从本质上,提升状态容量,同时又不提高单个节点的内存压力,唯一的出路是全分片,至少是状态分片。不过这还是一个非常前瞻的学术研究方向,有兴趣的同学可以深入阅读下文:

这里顺便说一下,另一个涉及存储的信息: 交易历史。交易历史是从创始区块开始至今的每一条被确认的交易的总和。这个部分信息会不断积累,只增不减。例如,比特币系统,这个历史已经有200多GB了。这部分信息,一旦区块和交易被确认和执行,就不再涉及之后的区块验证和确认过程,所以可以完全放在硬盘上,而不占用内存空间。

当然这200多GB也是个事儿,硬盘容量也不是无限的。就比特币而言,消费级硬盘的发展速度也未必能赶上其历史交易记录的增长(每年最多约50GB)。但是已经有两类比较成熟的技术问题解决这个挑战。一个是checkpoint技术,可以使得节点丢弃掉陈旧的历史交易记录,另一个是RSA accumulator技术,可以使交易记录分散存储,不再要求每个节点都记录完整的全网交易记录。

作者简介: 王嘉平博士原为微软研究院主管研究员,专注分布式系统,计算机图形学和视觉以及用于机器学习的GPU集群等领域的研究,有数十项研究成果发表于ACM SIGGRAPH/ToG顶级国际期刊,已授权的美国专利十项余项。他师从沈向洋博士(现微软全球执行副总裁),在中科院计算所获得博士学位。他的博士论文获得2009年度全国百篇优秀博士论文奖,是该年唯一一名计算机科学专业的获奖者。

国际计算机网络系统顶会NSDI 2019,发表了王嘉平博士团队关于高性能并行分片区块链系统的论文,这是中国人自主研发成果在区块链核心算法领域首次得到国际专家和同行的认可。

本文来自投稿,不代表Odaily立场。如若转载请注明出处。

Odaily星球日报提醒,请广大读者树立正确的货币观念和投资理念,理性看待区块链,切实提高风险意识;对发现的违法犯罪线索,可积极向有关部门举报反映。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK