十、聪明的合约,愚蠢的人类
奇爱博士,但是在区块链
智能合约最初与加密货币和区块链完全分开。它们是由 Nick Szabo 在 1994 年首次提出的。 ^(^(329)) 你以计算机程序的形式设定了一份法律协议,当特定条件得到满足时就会触发,一旦部署就不能被干扰。这个想法是用不受人类干扰的清晰、确定性的严格计算机代码取代传统人类调解的法律协议的混乱不确定性和等级制度,以使商业和法律更加可预测和有效。
从各方面来看,这都是个坏主意。计算机代码与现实世界的法律协议非常不匹配,其中困难的部分不是正常的操作,而是出现问题时该做什么;不变性意味着你不能修复问题,程序员每次都需要第一时间写出完美的无 bug 程序,如果情况或法律发生变化,合约也不能更新;如果合约基于真实世界的数据,这些数据通常需要人工解释。想象一下你的钱和你的电脑一样可靠。
《奇爱博士》是一个不可阻挡的智能合约出错的最著名的故事,不受人类干预。美国已经向苏联派遣了核轰炸机,只有用没有人知道的密码才能召回;如果任何炸弹击中,这些将触发苏联的威慑,一个不可阻挡的末日装置,不能拆除或解除,并将在任何企图爆炸。现实版的后果没有那么激烈,但被误导的思维是一样的。
幸运的是,现实世界中最糟糕的智能合约提议大多是不可行的;它们的实际用途是“诚实的庞氏骗局”和 ICO 代币。
Dr. Strangelove is the best-known story of an unstoppable smart contract going wrong, immune to human intervention. The US has sent nuclear bombers to the Soviet Union that can only be recalled with a code that nobody has; if any bombs hit, these will trigger the Soviet Union’s deterrent, an unstoppable doomsday device that cannot be dismantled or disarmed, and will explode on any attempt to. The real-life version’s consequences are not as drastic, but the misguided thinking is the same.
那么,谁想要智能合约呢?
有五类人需要智能合约:
没有社会或法律惯例天赋,但有编程天赋的计算机程序员,所以他们希望社会和法律惯例更像那样工作。
想用一个小小的 DOS 批处理文件取代政府的无政府资本家。(尤其是那些属于第一组的人。)
- 希望自动处理客户事务,但仍要拿钱的企业。
- 人们向你兜售表面上有薄薄的技术的谎言,正如我们所指出的,他们在 ico 的智能合约中发现了丰厚的利润。
- 创新型企业家以前与传统的法律体系发生过冲突,他们想要一些足够确定的东西,这样他们就可以拿走你的钱,然后从缝隙中逃脱。(另见第 4 组。)。)
- People selling you flim-flam with a thin veneer of technology on top, who have, as we’ve noted, found rich pickings in smart contracts for ICOs.
- 法律代码不是计算机代码
Szabo 是一名研究法律的计算机科学家,他以应有的谨慎倡导智能合约在公法中发挥作用。^(^(330))然而,另一些人想把这个想法想得更远。
一些倡导者谈到用计算机代码取代律师和法官,似乎这是一个明显的好主意;甚至还有无政府资本主义者,他们严肃地假设用计算机程序取代政府的大部分职能。其他人则说是完全自主的公司实体,在没有外界干预的情况下处理真实的金钱和货物。^()
计算机程序员工作的领域里,任何事情都可以清晰明了地确定,哪怕只是原则上的。因此,使用计算机来整理人类互动中所有那些令人讨厌的灰色区域是很有诱惑力的:如果你不理解法律(涉及意图),但你理解代码(准确地做你告诉它的事情——尽管可能不完全是你的意思),那么你可以尝试使用代码来绕过法律。
问题在于,这种智能合约的概念是基于对合约、法律和社会协议如何运作的严重局限的理解。它专注于一种可以被输入计算机代码的技术形式。它没有说明“合约”的社会意义,现实世界中合约运作的可变环境,它们在实践中是如何履行的,或者当出现问题时你如何解决它们。
对于传统的合约,如果没有一个合理的人在驾驶,你实际上可以去法院。并非所有的合约都具有法律效力。在最坏的情况下,一个政府可以通过新的法律,使各种有严重问题的条款无法执行。
智能合约在错误的层面上起作用:它们基于事实而非人类意图运行——但法律合约是人类意图的编纂。人类的意图是不精确的,但是合约假定它们将在人类机构的环境中,出于人类的目的,在人类的头脑中运行。
一个约定的合约,即使是尽可能精确地规定的合约,也会有争议和情况的变化,而解决这些争议和情况的变化通常需要弄清当时人们在想什么,合约之外的世界在做什么。法律的目的不是为了获得哲学或数学真理,而是为了解决混乱的现实,并获得社会可以接受的可行结果。
甚至维塔利克·布特林也承认,为了让智能合约像宣传的那样发挥作用,我们需要创造一个相当于人类的人工智能,来理解人们的意思,要做的合约,T2,T4,当时人们在想什么,这是解决许多合约纠纷的关键问题。“意图从根本上来说是复杂的。”
A conventional contract, even one specified as precisely as possible, will have disputes and changes in circumstances, and resolving these will often involve ascertaining what people were thinking at the time and what the world outside the contract was doing. The purpose of law is not to achieve philosophical or mathematical truth, but to take a messy reality and achieve workable results that society can live with.
oracle 问题:垃圾输入,垃圾输出
在软件测试中,一个 oracle 是决定测试是否通过的任何机制。甲骨文的问题是如何在没有昂贵的人工干预的情况下做到这一点。
智能合约采用了这种用法,其中 oracle 问题是确定智能合约中的真实条件是否得到满足。
除非你只是想在你的智能合约平台内洗牌,否则在某些时候你需要与外界互动。你的合约必须知道货物是否已经交付,是否是你所订购的,或者某项工作是否达到了令人满意的标准。这将经常涉及对人类判断不可避免的信任。
记住:垃圾进来意味着垃圾出去。你可以建立针对虚假数据的激励机制——但意外错误、有争议的数据或不可用的数据怎么办?或者,正如来自彭博的马特·莱文指出的那样:“我的不可篡改的加密安全的区块链记录证明我在一个仓库里有 10,000 磅铝,如果我从后门把铝从仓库里偷运出去,这对银行来说没有多大用处。”^(^(335))
撰写智能合约的非加密货币用例的技术和商业记者似乎从未提到,他们的“无信任”系统仍将涉及在接触物理世界的任何地方信任人类。您可能有一个运行合约代码的防篡改系统,但是输入必须来自这个安全空间之外。
一个常见的提议是将你的预言外包给预测市场——人类押注于预测——这也是你的区块链,比如 Augur。不知何故,打赌的结果应该取代对事件发生与否的直接了解,对过程有足够的信心,让它影响你的钱。如果你的问题不够受欢迎,不足以吸引足够多的无关赌注——对于一方来说,贿赂下注者通常是值得的——你仍然会遇到甲骨文问题,无法确定事件是否真的发生了。你不能通过增加另一个间接层来消除人的因素——这是一种预言。
(奥格公开吹嘘说,他们认为在区块链上运营意味着他们可以避开美国政府对赌博和衍生品的监管,这导致了之前预测市场的关闭,尽管这是一家拥有已知委托人的单一公司。^(^(336)))
A common proposal is to outsource your oracle to a prediction market – humans betting on predictions – that is also on your blockchain, such as Augur. Somehow, the outcome of a bet is supposed to substitute for direct knowledge of an event having happened or not, with sufficient confidence in the process to let it affect your money. If your question isn’t popular enough to attract sufficient uninvolved wagers – it would often be worth it for one party to just bribe the bettors – you will still have the oracle problem in determining whether the event has in fact occurred. You can’t get rid of the human element by adding another layer of indirection – it’s oracles all the way down.
不变性:让你的错误不可修复
“不变性”的价值主张是,一旦你的合约被部署,就没有人能破坏它。例如,对音乐人来说,最常见的说法是,大唱片公司会按照你的合约中所说的那样,迅速、自动地付给你报酬。
但在实践中,不受人为干扰是一个严重的问题,就像比特币交易不可逆转一样。现实世界中智能合约的标准例子是一辆汽车,如果你的付款失败,它就会停止工作。 ^(^(337)) 或其网络连接失败。或者是软件有问题。不受人类干预或环境变化的影响。
在现实世界中,环境会随着你而改变。有多少音乐家对他们签下的第一份合约如此满意,对它理解得如此透彻,以至于他们不想对它的任何一点进行修改?包括后来的法庭诉讼。
最著名的不受干扰的自主公司的尝试是 DAO,当它发现有一个安全漏洞而无法及时修复并被黑客攻击时,它崩溃了,这将在本章后面详细介绍。
DAO 黑客的最终修复显示了智能合约的另一个问题:包含智能合约的“不可变”系统在大公司冒着损失足够多资金的风险时突然被认为是可变的。
(Szabo 在 1994 年的原始论文中提到了允许人类干预的必要性,尽管到 2014 年,他已经完全进入了不可能存在人类干预的区块链的智能合约。 ^(^(338)) 对于 2016 年刀的失败,他没有提供任何评论。)
The eventual fix for The DAO hack demonstrates the other problem with smart contracts: the “immutable” system containing the smart contract was suddenly considered changeable the moment the big boys risked losing enough money.
不变性:优秀软件工程的敌人
智能合约作为软件工程毫无意义。你需要一个完美的无 bug 程序——但是人类真的不擅长无错编码。像 NASA 这样的组织为航天器编写这种极端质量水平的程序,速度慢得惊人,而且费用昂贵。(日常业务会发现,满满一层楼的律师既便宜又高效。)
智能合约的一个广为人知的优势是代码是公开的,因此任何人在使用它之前都可以检查和验证它。问题是,如果不实际运行一个程序,很难准确地说出它可能会做什么。 ^(^(339))
接下来的问题是什么是错误,什么是故意的。在更广阔的安全编程世界中,我们有秘密的 C 语言竞赛,这是一场编写欺骗性程序的竞赛,这些程序看起来好像只是有一个错误:“你必须编写尽可能可读、清晰、简单和直接的 C 代码,然而它必须不能执行其明显的功能。更具体地说,它应该执行一些特定的秘密任务,这些任务不会通过检查源代码来检测。”^(^(340))以太坊社区也在运行一个为了稳固,鼓励安全意识。^(^(341))如果你觉得人们对常规合约中的漏洞和陷阱有困扰…
智能合约依赖于程序是完美的,没有任何错误。但是他们也依赖于语言 ( 例如,以太坊里的 Solidity)是完美的,没有任何 bug。而平台上运行的语言 ( 如,以太坊虚拟机)是完美的,没有任何 bug。您可以部署完全审计过的代码,您已经从数学上证明了这些代码是正确的——然后较低层中的一个 bug 意味着无论如何您都有一个安全漏洞。这已经发生了。^(^(342))
Then there’s the question of what’s an error and what’s deliberate. In the wider world of security programming, we have the Underhanded C Contest, a competition to write deceptive programs that look like they just have a bug: “you must write C code that is as readable, clear, innocent and straightforward as possible, and yet it must fail to perform at its apparent function. To be more specific, it should perform some specific underhanded task that will not be detected by examining the source code.”^(^(340)) The Ethereum community is also running one for Solidity, to encourage security awareness.^(^(341)) If you think people have trouble with loopholes and traps in conventional contracts …
以太坊智能合约实践
如果你怀疑在不存在的王国的虚拟宝座上花费加密货币在你的管辖范围内是非法的,请避免参与(并向你的政治代表投诉)。
–连锁信自动庞氏骗局“乙醚之王”^(^(343))
几十年来,智能合约只是一个有趣的假设。当区块链出现时,智能合约的倡导者对区块链的不变性非常感兴趣。比特币上有一些智能合约实验,但以太坊几乎是第一个在区块链上编写和运行计算机程序的实用平台。
人类不擅长要求完美的任务。但当编程错误造成剧烈后果时,通常的做法是让搬起石头砸自己的脚变得更难:函数式编程语言、形式化方法、代码的数学验证、不要使用完整的计算机语言(避免图灵完备性)等等。Szabo 在 2002 年写了一些需求和一个简单的示例语言。^(^(344))
当您有多个智能合约相互交互时,这一点尤其重要——大规模并发编程,未知的可能有敌意的程序调用您的函数。
以太坊忽略了所有这些。它的标准合约语言 Solidity 是一种基于 web 编程语言 JavaScript 的过程化语言——让初学者尽可能容易地编写他们的第一份智能合约。它包含许多误导来自 JavaScript 的程序员搬起石头砸自己的脚的构造。 ^(^(345)) 这对于并发性来说是不合适且危险的(例如,solar storm 漏洞^(^(346))),尽管这是一个特定的预期用例。
为以太坊写一份安全的智能合约有无穷无尽的指南,但是大多数以太坊合约忽略了它们,结果显而易见。^(^(347))
以太坊上的智能合约甚至比非金融的商业代码还要糟糕;截至 2016 年 5 月,以太坊合约平均每 1000 行代码中有 100 个明显的错误(如此明显,机器可以发现它们)。^(^(348))(作为对比,微软代码平均每 1000 行有 15 个明显的 bug,NASA 飞船代码每 50 万行有 0 个左右。)
由于加密货币爱好者已经自行选择了轻信,他们写的第一批智能合约是连锁信、彩票和自动庞氏骗局。这些很好地证明了第一次正确编码的要求,每次都是这样:
赌场的伪随机数发生器在代码中有随机种子,因此任何人都可以重新创建精确的随机数序列。^()
政府庞氏骗局要支付 1100 ETH,但由于编码错误,这需要比交易最大可能汽油更多的汽油。以太现在永远停留在那里。^()
- Rubixi Ponzi:代码中的错误,从其他合约中复制粘贴,允许任何人成为所有者并拿走钱。^()
- 这是一个庞氏骗局,因为对代码的随意检查看起来就像变量名中的一个错别字,它只会支付给骗局的创建者。^(^(353))毫无疑问只是一场意外,我敢肯定。
- 自动化庞氏骗局在 2017 年远没有那么时髦;大部分精力投入到管理 ICO 令牌的智能合约中。然而,正如 DAO 所展示的,编码质量一如既往地好。
- Rubixi Ponzi: Errors in the code, copy-and-pasted from other contracts, allowed anyone to become the owner and take the money.^(^(352))
- 道:不可阻挡的代码的坚定钢铁意志
Automated Ponzi schemes are not nearly as fashionable in 2017; most of the effort goes into smart contracts for managing ICO tokens. However, as The DAO showed, the coding quality is as good as ever.
你刚学了化学,你造的第一个东西是一个巨大的炸弹,你不明白为什么它会在你面前爆炸。
–brockchainbrockshize,/r/以太坊^(^(354))
德国区块链初创公司 Slock 的一些以太坊开发人员不满足于他们现有的互联网精灵黄金销售,他们提出了一个更复杂的方案:DAO——一个去中心化的自治组织,名称中包含“The”。这是以太坊上的一份智能合约,它将人们的钱交给由贡献者投票认为值得投资的项目:一家分布式风险投资公司。
道的使命是:在商业组织中开辟一条新的道路,以改善其成员的利益,同时存在于任何地方和任何地方,并完全以坚定不移的钢铁意志经营不可阻挡的代码。 ^(^(355))
原文加粗。我相信没有什么明显的问题会让你眼前一亮。
DAO 于 2016 年 4 月 30 日推出,受到了广泛的关注,并成为迄今为止历史上最大的众筹,来自 11,000 名 DAO tokens 投资者的 ETH 超过 1.5 亿美元。14%的乙醚存在于道中。这是有史以来最突出的智能合约,获得了相当多的主流媒体报道。它接着说明了智能合约已经提出的几乎每一个潜在问题。
“刀”的法律地位不确定,并受到广泛质疑。在 DAO 中出售代币非常类似于未注册证券的交易——特别是当 DAO 代币本身进入加密货币交易所时 SEC 过去也曾打击过类似的计划。没有公司实体,因此在大多数法律制度中,它将默认为普通合伙企业,投资者承担无限的个人责任,该计划的创建者和指定的“监管人”也可能负有责任。
在上线日期前不久,研究人员指出了 DAO 设计中的几个几乎肯定会导致投资者损失的机制,并呼吁暂停 DAO,直到它们得到修复。 ^(^(356))
更糟糕的是,6 月 9 日,在多个用 Solidity 编写的智能合约中发现了一个错误,包括 DAO:如果以正确的方式递归调用 balance 函数,您可以重复取钱,而无需支付任何费用。“如果你跟踪任何类型的用户余额,并且不是非常非常小心,你的智能合约很可能会被清空。”这从技术上来说并不是一个不可靠的错误,但是语言的设计却让你非常容易陷入漏洞。
6 月 12 日,Slock.it 的 Stephen Tual 信心满满地宣布“在以太坊智能合约‘递归调用’漏洞发现之后,DAO 资金没有风险”^(^(358))……6 月 17 日,一名黑客利用这个递归调用漏洞从 DAO 中取走了 5000 万美元。没有人能阻止这种情况发生,因为没有参与者两周的一致同意,智能合约代码是不能被修改的。乙醚的价格迅速从 21.50 美元下降到 15 美元。
(Tual 在 7 月 9 日发布了一份充满希望的清单,列出了攻击者可能会归还所有乙醚的原因,就这样。因为这符合他们理性的自身利益。^(^(359))这种情况没有发生,说来也奇怪。)
以太坊基金会负责人讨论了各种选择,包括代码的软分叉或硬分叉,甚至区块链本身,或者区块链的回滚。社区就哲学问题争论不休:智能合约的全部意义在于它们不能被篡改。这份合约被宣传为“不可阻挡的代码的坚定不移的钢铁意志”,但似乎只有黑客足够仔细地阅读了合约的细则。 ^(^(360)) 有些人甚至严肃地争论这是否应该被视为“盗窃”,他们说代码就是法律,意图并不重要(不像在法律体系中运作的真实世界的合约,或者一般的欺诈法)。其他人认为以太坊智能合约系统的市场完整性要求不称职的合约(DAO 肯定是这样)必须被允许失败。
(建议的软分叉解决方案是将结果与攻击者注入资金的“暗刀”交互的交易列入黑名单。这将允许一个相当明显的拒绝服务攻击:用结束于黑暗 DAO 的昂贵计算淹没以太坊。用计算机科学的术语来说,这种方法只能通过首先解决停机问题来实现:你需要能够确定任何可能的以太坊程序的结果,而不需要实际运行它并观察结果。^(^(361)))
DAO 很快就被关闭了,7 月 20 日以太坊基金会——其几位负责人是 DAO^(^(362))的管理者和/或对其进行了大量投资——改变了以太坊的实际代码如何解释他们的区块链(“不可改变的”账本),以便撤回黑客攻击并收回他们的钱。区块链是“不可改变的”,所以他们改变了对它的解释。“不可能”的救助发生了。
这说明了智能合约的最后一个主要问题:在鲸鱼面临赔钱的危险之前,代码就是法律。
以太坊很快分裂成两个独立的区块链,每个都有自己的货币——以太坊基金会支持的回绕版以太坊(ETH),以及原始代码和区块链的以太坊经典(ETC)——因为所有这些都太贪婪了,甚至连加密迷都无法忍受。今天区块链和货币都在运行。干得好,所有人。
辩护者指出,DAO 只是一个实验(一个 1 . 5 亿美元的“实验”)来回答这样一个问题:我们能有一个可行的去中心化的自治组织,在智能合约上运行,没有人为干预吗?它回答说:不,可能不会。
This illustrated the final major problem with smart contracts: CODE IS LAW until the whales are in danger of losing money.
Ethereum promptly split into two separate blockchains, each with its own currency – Ethereum (ETH), the wound-back version, supported by the Ethereum Foundation, and Ethereum Classic (ETC), the original code and blockchain – because all this was too greedy even for crypto fans to put up with. Both blockchains and currencies operate today. Well done, all.
Apologists note that The DAO was just an experiment (a $150 million “experiment”) to answer the question: can we have a workable decentralized autonomous organization, running on smart contracts, with no human intervention? And it answered it: no, probably not.