区块链隐忧的背后——智能合约给出的警示
智能合约是区块链领域中令人兴奋的概念之一。它是基于区块链(数据不可篡改平台)建立起来的可编程可自动执行的合约,在一定程度上可以减轻对于第三方中介的依赖,节省佣金、提高效率。但这也是基于理论基础之上,现状是否如此?以太坊平台上图灵完备的智能合约又有哪些问题?我们离“可编程社会”还有多远?接下来,让我们一探究竟。
1.什么是智能合约?
正常的合约是两个或多个当事人之间的协议,这个协议将对他们未来的行为有约束力。比如A可能会付给B一些钱以换取房产的使用权(房租)。C可能会同意在将来每月分期支付给D报酬,以换取D按时上门打扫卫生的服务(劳务费用)。
“智能”合约的不同之处在于,这些条件都是由计算机代码评估和执行的,使得它做到了“去信任化”。因此,如果A同意从现在起6个月内支付B 300元来买一台电视,代码可以确定某些条件是否真实(A支付给B了吗?有6个月了吗?),并且在条件满足时不给任何一方退出合约的机会,一切都自动执行(从托管中交付电视)。
智能合约的关键特征是它具有“去信任化”的执行能力。“去信任化”是指,你不需要去信任和依赖第三方来执行。一份智能的合约不需要依靠对方兑现诺言或者依靠法律体系来处理问题,而是及时、客观地去执行应该发生的事情。
2.什么是图灵完备(Turing Completeness)?
图灵完备(Turing Completeness)是针对一套数据操作规则(计算系统)而言的概念,这个数据操作规则可以是一门编程语言,也可以是计算机里具体实现了的指令集。当这套规则可以实现“图灵机”模型里的全部功能,则被称为图灵完备。
英国天才数学家和逻辑学家,也是现代计算机理论的奠基人阿兰图灵(Alan Turing)在1936年发表的论文《论可计算数及其在判定性向问题上的应用》中提出了“图灵机”的概念。“图灵机”是一个抽象的数学模型,它将人类传统的计算过程(使用纸笔或其他工具)进行了抽象,由一个虚拟的机器代替人来进行无数次的数学运算。“图灵机”并不是一个实体的概念,是一个架空的想法。图灵在论文中图灵描述了“图灵机”的运行原理,并且证明了,只要图灵机可以被实现,就可以用来解决任何可计算问题。
由于以太坊的对外宣传,过度地将自己和智能合约进行绑定,有些人会错误地认为智能合约只存在于以太坊中,只能用以太坊的智能合约语言Solidity进行编写,这是错觉。从2009年开始,比特币就有了一种相当广泛的智能合约语言,叫做Script。它们的不同之处在于Solidity是图灵完备的。具体来讲,Solidity可以支持条件分支、循环、跳转、函数调用等复杂的运算逻辑,理论上可以编写任意的应用。开发者可以进行二次开发,实现相对复杂功能。但是复杂的合约在编码过程中难以避免失误,一旦被黑客找到漏洞,损失往往是巨大的。比如以太坊钱包Parity被盗几十万个ETH,就是源于代码的安全漏洞。
相对应的,比特币的Script语言是非图灵完备的,它删减了很多脚本指令,无法开发具有复杂功能的应用,但是好处是简单、高效、安全性相对较高。近十年以来,比特币网络经历了无数次黑客攻击,但是没有因为代码协议本身的问题而导致资金被盗。
3.什么是预言机问题(Oracle Problem)?
预言机(Oracle)是数据的提供者,它为数字世界里的智能合约提供关于物理世界中相对应问题的真实信息。在大多数情况下,如果没有预言机提供相关信息,智能合约的运行可能建立在错误的假设之上。数字世界需要“了解”物理世界,解决数字世界和物理世界数据关联性的问题就是“预言机问题”。
一般来说,在去中心化的环境中,数字世界的智能合约只有在和物理世界里的实体之间有明确的关联时才有效。每当实体(比如说房产)的数字版本改变所有权,物理版本也必须改变所有权。当A将房产转让给B时,智能合约需要知道她实际上确实将房子转让给了B。于是我们会面临一个问题:必须需要一个可信的第三方来验证物理世界中事件的真实性。
因为预言机决定了智能合约的输入内容,所以它从源头上控制了智能合约的运行。这意味着预言机对智能合约有着巨大的影响力。如果预言机受到操控和干扰,整个合约会受到影响。中心化的预言机解决方案在大多数情况下是不完善的,而且有些多余。因为你依靠单一的中心化的预言机确定的信息开始编写一份智能合约,你就完全牺牲了去中心化方案的相关优势,这也使得在这个场景下是否有必要去使用智能合约成为一个值得怀疑的问题。
对于“去中心化预言机”解决方案的探索一直在进行,目前看来一种潜在的方法是:“对于真实性投票”。该模型需要复杂的机制设计,简单来说,token持有者可以根据自己的认识对于物理世界的真实性进行投票,也可以对现有投票结果进行质疑,整个过程可以不断迭代优化。理论上说,经过大量的数据输入和不断优化,在数字世界里得到的结果会无限接近于物理世界的真实。
这种方案用投票的方式,利用分散个体的“自觉性”来确定数字世界和物理世界的关联,理论上可以降低中心化第三方的信息垄断权,但在实际操作中仍然困难重重。首先,大量的个体放弃投票权是一个挑战,如何用共识和利益激励分散的个体去投票?如果样本量不够大,就无法得到趋近于真实的结果。其次,如果社群内部没有“自律意识”,这种方案仍然无法从根本上杜绝中心化倾向,利益相关方会有动力去“贿选”,收买大量投票权,仍然可以去控制结果。最后,去中心化的决策机制也会导致决策的效率极其地下,在应对变化的重要关头缺乏行动能力。
4.智能合约其实很笨拙,“图灵完备”让编写的过程很复杂
“智能”一词的使用意味着这些合约具有某种天生的智力,但是他们并没有。合约的智能之处在于不需要另一方的合作来执行协议。一份“智能”的合约将会把欠费的租客锁在公寓外面,而不是能不付费的房客赶出去。它的运行是非常基于规则的,并且遵循规则一直到穷尽所有情况,并且不能考虑任何人情因素或道义上的“视情况而定”。所以智能合约其实很笨拙,对合约结果的自动执行是使智能合约变得强大的原因,而不是合同中的内在智能。
使合约“去信任化”意味着我们对于合约的条款真的没有任何含糊的余地,这就对合约的编写代码提出了很高的要求,编写过程会极其复杂。虽然复杂的合同可以去适应更复杂的情况,做更多的事情,但是复杂的合同也更难去编写,安全性越难保障。安全性意味着处理合约执行的各种可能方式,并确保合同符合作者的意图。
造成目前的智能合约漏洞百出的原因主要有两点:
(1).图灵完备条件下的合约执行是极其棘手和难以分析的。获得一份图灵完备的智能合约就相当于证明计算机程序没有错误。这非常困难,人编写的程序总会出错,几乎所有现存的计算机程序都有漏洞。(参见第2部分)
(2).现实生活中普通合同对于撰写者的要求本身就很高。在人类社会里所发展出来的合约,带来了众多假设和既定案例,处理这些假设和案例对于从业者的经验要求很高,需要大量的积累和多年的学习,通过非常严格的律师考试,才会达到一个合格的水平。智能合约的编写者在对合同的理解层度方面,至少需要这种水平的能力。但是目前许多智能合约是由缺少这种素养,甚至不理解合约内在逻辑的程序员编写的。这就导致了在合约本身的逻辑上都会漏洞百出。
比特币解决这个问题的方法是根本不具备图灵完备。这使得智能合约更容易分析,因为程序的可能状态更容易检查。但以太坊的解决方案是把更多的压力强加给了智能合约的开发者,他们有责任确保合约符合他们的意图。目前看来,现在的开发者还远远达不到兼具代码能力和合约撰写技能的要求。
图灵完备的思路之下,以太坊进一步提出“代码就是法律”,即平台上的智能合约就是最终的权威,没有人可以推翻该合约。这个思路的野心很大,希望未来可以将人类社会的一些规则进行代码化,走向“可编程社会”。这也为后来The Dao的悲剧埋下了伏笔。
5.“代码即法律”的无力感与The Dao的悲剧
“代码即法律”意味着开发者的责任重大,如果智能合约出了问题,那么开发者应该负责,而不是平台。但是这个原则在The DAO事件发生时,这个原则变的异常尴尬。
The DAO(Decentralised Autonomous Organization)代表“去中心化的的自治组织”,The DAO在以太坊中创建了一个基金,用户可以将钱存入DAO,并根据DAO的投资获得回报,决策本身将是去中心化的。当时ETH的交易价格在20美元左右,DAO在ETH筹集了1.5亿美元。但是他们代码的安全性没有做好,有黑客找到了漏洞,把ETH抽走了。当Dao受到攻击,由于“代码是法律”,规则是死板的,整个以太坊社区只能眼睁睁地看着黑客作案,所有人都无能为力。也许我们不能称盗窃者为“黑客”,他只是找到了一种从合约中获取金钱的方式,这和一个有创造性的注册会计师找出税收漏洞从而来为客户省钱的做法没有什么本质不同。
The Dao的设计逻辑跟简单直接,几个天才程序员找到了将制度代码化的思路,编写一套程序取代现有的议事规格。这是一种野心勃勃但有些幼稚的,从上到下的思维模式,好像只要设计出一套理想的,万能的代码就能够终结人类历史的进化一样。The DAO的宣传口号是“The DAO is code”,只强调代码,忽略了人类社会中那些经过长期经验积累的合约本身的重要性。那些天真的程序员忽略了,正是经验丰富又心存良知的律师、法官、中介机构构成了社会中信任的基石。
接下来发生的事情是以太坊决定代码不再是法律,并归还了所有进入DAO的钱。换句话说,合约编写者和投资者做了一些愚蠢的事情,但以太坊官方决定保释他们。这起事件直接导致了以太坊社区的硬分叉,经典以太(Ethereum Classic)诞生了。经典以太保存了The DAO的形式,并保存了“代码就是法律”的原则。此外,从安全上考虑,经典以太的开发人员开始回避使用以太坊图灵完备的属性。让智能合约变笨,得以安全。
6.“预言机问题”让智能合约的存在显得尴尬,它真正的适用场景是什么?
智能合约的真正应用场景在哪里呢?会是房地产行业么?A可以证明她对这个房子的所有权,B可以打钱给A买这个房子。这个交易看起来是一个去信任化、机器快速执行的问题,当中不需要法官、政府官僚的参与或者购买所有权保险,事实真的是这样么?
这里有两个问题。第一个是,由中心化平台所执行的智能合约并不是真正的“去信任化”,你仍然需要去信任中心化的机构来执行,“去信任化”无法成立。要使智能合同真正做到去信任化,你需要一个真正去中心化的平台。
第二个问题就是我们前面提到的“预言机问题”。在去中心化的环境中,智能合约只有在数字版本和物理版本之间有明确的关联时才有效。也就是说,每当房产的数字版本改变所有权,物理版本也必须改变所有权。数字世界需要“了解”物理世界。
如果房产可以在以太坊平台上token化,A可以把房产token转让给B,B付给A一定数量的ETH。这里的“预言机难题”意味着,数字世界和物理世界是割裂开的,B需要一个“预言机”来告诉他让他确信数字世界的token实际上代表了物理世界的房产。即使这个问题解决了,还有一堆随时会冒出来的难题等待着预言机来处理。比如,如果token被盗会发生什么?token被盗后这房子属于谁?如果token丢失了怎么办,这房子还有价值嘛?房子token可以重新发放吗,谁来发放?……“预言机”永远无法停止运转。
我们在第3部分提到,在去中心化的情景下,预言机问题目前仍然没有完美的解决方案。将数字资产与实物资产联系起来,对于真实的判定是一个难题。让社区“对真实投票”的方案很笨拙。另外,我们还面临物理世界的监管问题。实物资产会受你所在的管辖地区的监管,是地方性的,这意味着除了智能合约之外,它们在某种意义上还和其他的东西绑定着。这意味着,智能合约中的所有权并不一定意味着现实世界中的所有权,并且遭受着与普通合约相同的信任问题。“去信任化”的核心特征随着第三方信任机构的引入而烟消云散。智能合约在这种情况下就显得很多余了。
甚至像电子书和游戏这样的数字资产也面临着同样的问题。这些数字资产的“权利”最终由其他权威机构决定。比如你在亚马逊上买电子书是因为你信任亚马逊官方的公信力,你买腾讯的游戏点卡也是因为腾讯官方承诺给你提供相关服务。让我们去相信的是信任本身的力量,这种信任本身的力量是需要时间去生长的。腾讯和亚马逊经历了相当长时间的发展,用产品和服务不断地赢得市场和用户,才慢慢积累起来了这种力量。智能合约的一堆代码无法给我们这种信任的力量。
所以,绕开“预言机”,智能合约唯一的生存场景就是类似比特币网络这种虚拟空间。也就是说,token的所有权无需依赖除了智能合约平台之外的因素,才可以做到真正的“去信任化”。在比特币网络这个纯正的数字世界里,智能合约可以摆脱物理世界的种种束缚。