(宫力)从计算机科学评看区块链的起源和发展
中关村区块链产业联盟PalletOne2018-05-13 宫力 区块链正本清源 – 从计算机科学评看区块链的起源和发展
©宫力 2018 年版权所有。本文欢迎转载。请注明作者和出处以及日期。
作者相关背景简介——
计算机科班出身,清华大学计算机系本科加硕士,剑桥大学计算机系博士。硕士论文搞密码学。博 士论文搞分布式系统的安全协议。在博士期间(1989年)发表了关于用单项函数结合秘钥做验证的文章,比后来比特币采用的 HMAC 的定义早了 5 年左右。90 年代初发表过多篇分布式系统安全方面的文章,1995年发表了把密码技术应用到拜占庭将军算法的文章,是这类混合式拜占庭算法的最早的文章之一,也是将计算机安全技术与容错技术结合的早期倡导人之一。共发表 60 多篇学术论文,3 本英文专著,获美国专利 22 项。90年代中下期在美国 Sun 公司的 JavaSoft 事业部领衔杰出工程师并担任 Java 平台安全总架构师。1994 年被 IEEE 通迅学会授予 Leonard G. Abraham 年度大奖。
文章重要观点一览——
- 比特币在理论上并没有解决计算机科学上的共识问题,是用经济杠杆促成的实用系统;
- 比特币链的结算慢速是有根据的特殊设计,是不可以加速的;
- 以太坊不可能作为通用链支持全世界的应用;
- 以太坊这么做智能合约是不科学的;
- 图灵完整不完整是不相干的题目;
- 链下交易的问题是大大的 ;
- 要把握区块链今后发展的正确方向必须领会到互联网成功的精髓。
比特币(Bitcoin)像是在大洋中默默积累的气流,一举登陆后给各界带来了巨大的冲击。比特币在过去几年里火箭式增值,引发无限想象力,无穷的区块链项目,也引无数英雄竟折腰。
参与区块链运动的人群大致分三类,当然中间也有交集。
- 一类是所谓“币圈”的, 包括炒币的,做交易所的,做钱包的,以及韭菜和割韭菜的等等;
- 一类是找落地应用项目的,从跨境支付的到搠源有机猪肉的,五花八门,真真假假,虚虚实实;
- 还有就是所谓“链圈”的,目的是研究区块链基本技术的发展,这其中包含实实在在懂点门道的,也有一大帮满口名词班门弄斧的程咬金。
本文着重讨论区块链技术, 通过从计算机科学角度分析区块链的来龙去脉,纠正一些广为流传的误区,也指出目前很多日新月异的新一代链项目,其实多是在迷途上狂奔的野马,其最终结果无非是跑肥了野马,跑爽了骑马人,跑没了粮草,也跑坏了大家对区块链技术的信心。
比特币为什么 surprising,到底解决了计算机科学上的共识问题吗?
很多人把区块链称为自互联网以来最革命性的技术,其中常提到的一点就是 “去中心化”。
区块链其实可以去中心也可以不去中心,两者之间没有必然联系。
比特币是去中心的设计。乍看之下,它解决了分布式系统中的所谓 “共识”问题,就是说在分布式系统中多个节点在某件事情上保持看法一致。 分布式系统可以简单的想象为多台通过互联网连接着的电脑。互联网的连接不一定可靠(譬如可能掉线),信息传播需要时间,而且传播时间不固定甚至没有上限。加上多台电脑各自的钟表时间也是不能保证同步的(原因同 上),有的电脑可能还故意造假,因此分布式共识问题在通常情况下是无解的。这是学术研究的结论,是搞分布式系统的专家们的共识。
注:FLP Impossibility(FLP不可能性)是分布式领域中一个非常著名的结果,该结果在专业领域被称为“定理”,其地位之高可见一斑。该定理的论文是由Fischer、Lynch、Patterson三位作者于1985年发表,之后该论文毫无疑问得获得了Dijkstra奖。FLP给出了一个令人吃惊的结论:在异步通信场景,即使只有一个进程失败,也没有任何算法能保证非失败进程达到一致性!
比特币并没有解决传统意义上的共识问题,而是把问题转化了,一方面通过 区块链的序号作为虚拟时间,一方面通过“挖矿”的经济动力来促使比特币链的不断延伸。这就是为什么比特币在理论上永远可逆,永远可以分叉的原因,因为它达到的共识不是绝对的。用经济因素来(在实践上,不是从理论 上)解决分布式系统共识算法是中本聪的天才之举。
比特币系统为什么慢?10 分钟结算其实是 feature,不是 bug!
自从比特币热络起来,不少人抱怨系统的结算速度(TPS)太慢。不少人花 精力试图给比特币提速,也有不少人提出新的区块链系统,试图解决速度问题。抱怨比特币速度慢的,都是没看出门道的。当然懂计算机科学的也未必都懂得为什么比特币结算系统慢。殊不知那是设计的 feature,不是 bug。
其实挖矿难度决定了结算速度,而这个难度是可调的,所以结算速度也是可长可短的。假想如果结算时间缩称一秒,也就是说挖矿难度降为一秒钟,那会出现什么情况呢?就是常常千万个矿工同时挖到矿。那时候怎么决定哪位幸运矿工分到奖励呢?选出一个幸运矿工又是个共识问题,循环了!再设想若是结算时间变成一小时会怎样?因为挖矿难度的提升,极少可能多个矿工同时挖到矿,产生冲突或临时分链(temporary fork)的可能性很低。所以,结算时间没必要太慢,但绝不能太快。这样就看清楚了那些要给比特币链加速的想法是多么的外行。中本聪在有关比特币的文档中并没有详细阐述其系统设计的渊源,不知是歪打正着,还是有的放矢。
再延伸一下,只要是通过纯挖矿来做共识的公开链,结算速度都不可能太快。 以太坊不也计划要从 PoW 下车了吗?现在再出个以太坊类的东西来忽悠人,估计就不容易了。我这里说清楚了,可能以后不再有喊着给比特币提速来做 ICO 的了。
还想钻研这个题目的同学们,可以比照大家都用的局部网以太网(Ethernet) 的经验。在局部网上,如果多个节点同时“说话”(传输数据),就会造成冲突。冲突发生后,各节点知道数据没有传出去,再重新试一下。可是如果大家都紧接着重新试传,还会冲突,造成网络堵塞。如果大家都等待某个固定时间再试,一样会冲突。所以,以太网设计是各节点等待一个随机时间再试传,这样就大大降低了冲突率,实现了高速的数据传送。这个等待随机时间的办法适用于比特币吗?明显不行,因为会有不自觉的矿工基于经济利益争着再试,大家都争,又回到原点,没解决问题。
以太坊能成为支撑千万个应用的基础链吗?
比特币是单一目的的区块链,设计紧凑却考虑周全,可以说接近完美。其中少许留了一点空地,原意是留点做评论或者留言的,中本聪本人就在第一块中留下一句话来说明比特币链启动的时间。头脑灵活的人就把这块地拿来做颜色币(colored coin)等等。但毕竟活动空间不大,做不了太多的事情。
以太坊(Ethereum)应运而生,号称是可以写万能的智能合约的区块链平台。 一时间巨额资金涌进,无数人开始在以太坊的基础上开发各种应用(包括所 谓 DApp,也就是分布式应用),还有更极端的所谓分布式自治系(DAO)。
大家都在以太坊一个链上做应用,是个什么概念?就像是微软推出一个系统叫做 Windows,然后全世界人民写程序都运行在同一台电脑上的同一个 Windows 系统。这样一个系统能支持那么多人那么多应用吗?根本不可能。 看看身边的情况,大家各自使用自己的电脑或手机,需要通讯的时候通通讯, 需要协同的时候协同一下,需要购物的时候去一下购物网站。其余时间各自干各自的事。若是互联网试图以一台全世界共享巨型机的模式,是不可能发展起来的。以太坊背道而驰,不知是真的不懂还是故意忽悠。作为发币的平台,以太坊歪打正着很成功 。做别的有没有戏,还待观察。
智能合约有希望吗?所谓图灵完整是好事还是坏事?
我先引别人的一句话,
“以太坊上的智能合约既没有智能也不是合约!”
用可编程的计算机语言来表达合约,就存在根本性的约束。譬如,合约写成代码后是“定死”了的,哪来的智能。要能随机应变的智能,必须事先考虑好各种变化的可能。而在现实世界中,再紧凑的合约也有预想不到考虑不周的时候,或者双方对合约的内容有不同认知。现实世界中合约各方还可以坐下来商量,修改合约。在以太坊上,这些修改和商议或者仲裁的功能怎么实现?
跟随着以太坊的智能合约被很多人满嘴跑火车的另外一个词就是图灵完整 (Turing Complete),好像这是个什么伟大的功能。其实若要真的想做智能合约,图灵完整又是一个背道而驰的思路。
为什么这么讲?设计过计算机程序设计语言的人都知道,一个程序语言的限制越少,功能越强,程序员越容易出错。譬如, 大家常用的 C 语言就是这样一个例子。它功能强,是因为它出身是系统级的语言,做操作系统用的,需要这么强大的灵活性。但是作为写应用程序的需求来说,可以说到处是陷阱。后来推出的 Java 语言,增加了很多限制,譬如 type safety 和 garbage collection,把很多程序员容易掉陷阱的地方都回避开了,因此成为企业级应用的首选语言。
回到区块链的智能合约这个问题。要想安全可靠地写合约,合约语言必须进 一步缩减功能,加入很多约束。跟律师打过交道的都知道,合同一般分类有范本的,律师从来不愿意从头起草,而是在范本的基础上写合约。这就是因为范本提供了很多约束条件,经历过时间的考验和不断的更新,不容易犯错误。律师的范本就类似高级程序语言设计中的 type 和 pattern。前段时间以太坊上的 DAO 出现被攻击的事件,就是因为合约代码中的错误。所以说,对于写智能合约的程序语言来说,少反而是多。另外,真正要设计一个智能合约的语言,恐怕从一开始就要考虑如何结合形式验证(formal verification) 技术来证明每个合约的正确性,把可证明性(verifiability 或 provability)设计到语言的结构内。
交易下链是解决办法吗?
因为链上交易速度慢,产生了不少下链的项目,就是说把交易在链下(或链 外)实现,然后再跑到链上去统一汇总。咋看起来,似乎有一定道理。但仔细分析起来,问题就来了。区块链之所以被看好,是因为链上有不少好的功能,譬如内容不可篡改等等。把交易拿到链外,就失去了这些功能的支持,带来附加的风险。譬如,两个节点之间的小额支付,看起来日常的可以在链下做,积累到一定时间或规模时再到链上结一次涨。可是链外这些交易,怎么保证其正确性呢?如果在还未结账之前,一方系统出故障丢失了账本,另一方就可以赖账。这种在链上不可能发生的情景就会在链外发生。主张下链交易的人,似乎都不怎么强调下链所带来的这些问题。
还有一个下链的场景,就是交易所和钱包。很多问题都出在这些链的端点,包括技术上的安全问题,也包括非技术类的信任问题。譬如有些网站号称帮用户管理各种币,这跟陌生人要你银行卡密码没啥两样。还有的所谓冷钱包,大都出自无名厂家,售价只有几十块钱,粗制滥造,却被拿来管理巨额资产,怎么会不出问题呢?而且出了问题找不到人负责,币被转走了又不可逆。如何把这些币的管理和使用做到大众可以安全方便操作的程度,还有很长的路。
什么是区块链的正确发展方向?
说了这么多,指出了不少广为流传的误区,戳穿了不少神话和假话,算是打击了一大片。这并不是说我不看好区块链的技术。比特币的成长,用市场力量推动了几个事情。
- 一个是证明了人人有公钥加密系统的时代已经到来,是大家可以接受的。
- 一个是分布式系统的共识算法在冷了很多年之后再度被密切关注,吸引了很多学者和博士生积极研究。
还有就是吸引了这么多钱砸到这个领域,虽然被牺牲掉了很多,但毕竟有些钱会落到对的地方,总要做出点事情来。
区块链的发展,被比作新一代互联网。从原则上讲,要真正借鉴互联网成功发展几十年的经验,而不是简单照着 web 1.0 的方式搞各种炒作。今后的正确发展方向是把互联网成功的精髓在区块链领域发扬光大。要做到这一点,需要扎实的知识背景,强大的研究功力,和丰富的实战经验。具体怎么做,今天没时间继续写了,这里先卖个关子,且听下回分解。