Ethereum智能合约的实际情况

作者:David Gerard 2017.7.24 英文版

如果你怀疑在不存在的王国的虚拟王座上花费加密币在你的管辖范围内是非法的,请避免参与(并向你的政治代表投诉)。 –引自以太坊上连锁自动庞氏骗局应用: 以太王"1

几十年来,智能合约只是一个有趣的假想。当区块链出现时,智能合约的倡导者对区块链的不可更改性非常感兴趣。在比特币上有一些智能合约的实验,但以太坊几乎是第一个在区块链上编写和运行计算机程序的实用平台。

人类执行要求完美的任务能力是很差的。但是,当编程错误产生严重后果时,通常的做法是让自己更难射中自己的脚:函数式编程语言、形式化方法、代码的数学验证、不要使用完整的计算机语言(避免图灵完备性),等等。Szabo在2002年写了一些要求和一个简单的例子语言。2

当你有多个智能合约相互作用时,这一点尤其重要–大规模的并发编程,未知的可能有敌意的程序会调用你的函数。

以太坊忽略了这一切。它的标准合约语言Solidity是一种基于网络编程语言JavaScript的程序性语言–使初学者尽可能容易编写他们的第一个智能合约。它包含了许多结构,误导了来自JavaScript的程序员,使其自寻烦恼。3 它不适合concurrency,而且很危险(/e.g./,Solarstorm漏洞4),尽管这是一个具体的预期使用案例。

有无穷无尽的指南教编写以太坊的安全智能合约,但/大多数/以太坊合约都忽略了这些指南,其后果显而易见。5

以太坊的智能合约甚至比非金融商业代码还要糟糕;截至2016年5月,以太坊合约平均每1000行代码有100个明显的错误(明显到机器都能发现)。6 (作为比较,微软代码平均每1000行有15个bug,NASA代码每50万行约0个)。

由于加密币爱好者已经自我选择了轻信,他们写的第一个智能合约是连环信、彩票和自动庞氏骗局。这些都很好地证明了正确编码的要求,第一次,每一次:

  • 赌场的伪随机数生成器的代码里有随机种子,所以任何人都可以重新创建精确的随机数序列。7
  • GovernMental庞氏骗局本来要支付1100个ETH,但由于一个编码错误,这需要的gas超过了交易的最大可能gas。现在以太坊被永远地卡在那里了。8
  • 许多计划由于错误而耗尽了gas /e.g./以太坊之王。9
  • Rubixi Ponzi:代码中的错误,从其他合同中复制粘贴而来,允许任何人成为所有者并拿走钱财。10
  • 有个骗局只支付给该计划的创造者,因为对代码的随意检查看起来像是一个变量名称中的错字。11 毫无疑问,这只是一个意外,我敢肯定。

自动庞氏骗局在2017年几乎没有那么时髦;大部分的努力都投入到管理ICO代币的智能合约中。然而,正如The DAO所显示的,编码质量一如既往地“好”。



  1. 以太坊之王。“一个生活在区块链上的以太坊合约,它将使你成为国王或女王,可能授予你财富,并将使你的名字不朽。” ↩︎

  2. “分析合同的标准化语言”。2002. ( 档案↩︎

  3. Massimo Bartoletti, Tiziana Cimoli. “A survey of attacks on Ethereum smart contracts”。第六届安全与信任原则国际会议(POST),欧洲软件理论与实践联合会议,2017年4月。 ↩︎

  4. “Solarstorm: 以太坊的Solidity语言的安全漏洞,而不仅仅是DAO。” 。Blockstack博客,2016年6月21日。 ↩︎

  5. Zikai Alex Wen和Andrew Miller。“Scanning Live Ethereum Contracts for the ‘Unchecked-Send’ Bug”。/Hacking Distributed/(博客),2016年6月16日。“经检查,没有一个通过我们启发式检查的Solidity程序实际应用了推荐的最佳实践,即直接测试调用栈。” ↩︎

  6. “Ethereum合约将成为黑客的糖果”。/Blockchain, Bitcoin and Business/ (blog), 18 May 2016. ↩︎

  7. “Ethereum合约安全:一个Ethereum轮盘。” 博客文章,2015年8月14日。 ↩︎

  8. Ethererik。“GovernMental的1100 ETH彩金支付被卡住了,因为它使用了太多的gas”。Reddit /r/ethereum, 26 April 2016. ↩︎

  9. https://www.kingoftheether.com/postmortem.html 死后调查(2016年2月)/King of the Ether./ ↩︎

  10. “嗨!我的名字是Rubixi。我是一个新的以太坊Doubler。现在我的新家 – Rubixi.tk”。Bitcointalk.org比特币论坛 > 替代加密货币 > 市场(替代币) > 服务公告(替代币),2016年4月11日。 ↩︎

  11. Vitalik Buterin。“主网中’秘密solitidy’编码的现场例子”。Reddit /r/ethereum, 10 April 2016. ↩︎