以太坊智能合约被爆有巨大漏洞,新技术落地恐怕要“迟到”

转载
2487 天前
13521
今日头条

据今日头条报道,以太坊智能合约被爆有巨大漏洞,新技术落地恐怕要“迟到”。

对区块链技术稍有了解的人都知道,区块链存在的基础是系统中参与交易的所有人要对数字资产的归属达成共识。而从整体上看,区块链则是一种将系统内交易进行编码的可附加账本,除了要达成数字资产归属权共识外,基于区块链技术的任何应用要生效,还要满足很重要的两点,一是每次交易必须有效,二是过往交易历史不能篡改。

然而,要保证交易有效,就必须遵循某一事先约定的规则。现实世界中,各类交易都有相关的法律条款甲乙约束。而在计算机世界里,正如美国著名学者劳伦斯·莱斯格当年所提出的“代码即规则”(code is law)——一旦代码被编写出来并开始执行,就永远不能回收了。这多少能解释区块链在某些具体应用场景下面临的情况。

以比特币客户端为例,目前该客户端拥有约 3 万行代码,而目前的工业标准允许每一百行代码中存在一个 bug。理论上说,哪怕比特币客户端存在 300 个 bug 也是符合行业规则的。但事实并非如此,2010 年 8 月那个利用整数溢出漏洞凭空创造出 1840 亿个比特币的黑客(比特币设计之初的限额仅为 2100 万个),差点就彻底毁灭了比特币。

所以,在区块链技术中,由于缺乏统一的外部技术说明文档,“代码即规则”往往会失效,甚至被认为有史以来最安全的以太坊架构,也面临同样的问题。

以太坊虽然仅仅诞生了四年,但是随着人们越来越多地了解区块链技术,以太坊的热度逐渐增加。甚至在 2017 年时,以太坊被认为是区块链 2.0 时代最重要的底层开源系统。然而,最新的研究显示,基于以太坊架构,被称作是“最安全、最可靠、最方便”的智能合约技术却漏洞百出。

最新研究揭露智能合约存在巨大漏洞

众所周知,智能合约被存放于以太坊的区块链上。但这也就意味着,一旦区块链发生问题,智能合约所涉及的交易信息也会受到牵连。区块链本质上是一个共享账本,它使用密码技术以及计算机网络来确保交易信息不会出差错。

然而,在执行智能合约的过程中,如果账户是 NULL(即没有账户),那么智能合约则会为此次交易创建一个账户,并将合约写到该项目下。虚拟机则通过执行合约中的二进制字节码实现合约的执行。也就是说,智能合约可以被用来创建加密货币。比如火币网的 HT,就是用以太坊智能合约创建的。

二进制字节码实现合约的执行。也就是说,智能合约可以被用来创建加密货币。比如火币网的 HT,就是用以太坊智能合约创建的。

然而,在伦敦大学学院(University College London,UCL)计算机科学系副教授伊利亚·谢尔盖最新的研究论文《Finding The Greedy , Prodigal , and Suicidal Contractsat Scale》中,通过对将近 100 万份智能合约进行每份合约 10 秒分析时间的分析后发现,这其中有 34200 份智能合约很容易受到黑客攻击。同时他们又对 3759 份智能合约抽样调查,在这之中,3686 份智能合约有 89% 的概率含有漏洞。

此外,研究也证明,以太坊的 Parity 钱包漏洞使得用户电子财产会锁死在以太坊,全以太坊被锁死的财产总额已经达到 2 亿美元。事实上,在 2017 年 11 月时就有媒体爆料,因为一些以太坊智能合约使用者的误操作,导致了 3 亿美元永久被冻结在以太坊之中。

研究人员发现,这些漏洞分别为:

浪子合约:交易资金因为漏洞返还给所有者、交易者过去发送给以太网的地址,以及特定地址。这种漏洞就像是空手套白狼,买家得到商品,而卖家无法得到加密货币。

自杀合约:智能合约的拥有者可以在以太坊发生故障时选择退回,类似于微信中的撤回选项。但是这个指令也可以被其他人执行,使得交易失败。

贪婪合约:这是指那些永远停留在以太坊的智能合约,上述的 Parity 漏洞正是一种贪婪合约,它会把智能合约所涉及的商品以及加密货币锁定在以太坊中,交易双方均无法得到,也不能取消。

遗嘱合约:在那些已完成或者被关闭的智能合约中,虽然他们的代码和全局变量被清楚了,但是其中一部分仍然在继续执行。遗嘱合约和贪婪合约一样,均是由以太坊的错误引起,目前并不能被黑客利用。

图丨 MAIAN 工具

这四种漏洞是最具代表性的,不过他们并不是以太坊智能合约的全部漏洞。研究人员们虽然通过自制的 MAIAN 工具检测出了包含这四种漏洞的智能合约,然而他们并没有找到解决方案。

那么这样看来,即使传统金融交易模式比智能合约要麻烦,但是它能最大程度地避免漏洞,使得交易更加安全可靠。

什么是智能合约?

接着,DT 君给各位读者做个科普。以太坊是一个基于公链的分布式计算平台,同时,它还提供了一个去中心化的虚拟主机。以太坊一共分为五层:

数据层:层如其名,数据层包含了以太坊中最基本的数据结构以及账户加密算法,而该层也是以太坊的基础组成部分。

网络层:用于校验以太坊中各个节点数据传输。

共识层:用于保存基于作量的共识机制。

激励层:用于保存激励机制,主要负责激励节点自主挖矿,维持以太坊运行。

合约层:以太坊独有结构,是一台封装了可以执行图灵完备脚本语言的虚拟机,可以通过编写脚本语言作为智能合约部署到以太坊区块链中,以此实现应用的去中心化。

智能合约则是一种编码,在合约层有着可以自动运行的业务逻辑,并依靠以太坊的虚拟机而运行。智能合约代码基于堆栈的字节码低级语言,每一种字节代表着不同的操作。通常来讲,代码的执行过程中是无限循环的,只有代码完成执行、中断指令等才能停止其工作。


图丨去中心化架构

以太坊虚拟机是执行交易代码的引擎,这也是以太坊区块链和其他区块链最大的不同之处。它并不是像沙盒一样完全独立的,这意味着智能合约代码在虚拟机中运行时,不需要网络和文件系统。

另外,在智能合约的执行过程中,合约账户的作用也非常关键。该账户的地址取决于合约建立的时间,当以太坊虚拟机运行时,账户的计算状态可以通过 block_state、transaction 等元组来定义。通过程序执行时对元组数据的修改(block_state 包含所有账户的全局信息),从而实现智能合约的执行过程。

从应用方面来讲,智能合约是一项能够改善传统金融模式的技术,它通过上述的网络架构以及虚拟电子货币简化了价值转移的过程。大概可以被理解为三步:

1、A 向区块链发送一条信息,并在信息中定义了一笔交易;

2、B 通过网络广播接受该交易信息;

3.、区块链网络验证,完成交易。

也就是说,智能合约和“把大象装进冰箱”的原理差不多。在传统金融模式中,交易双方都需要通过监管中心,而智能合约则可以利用区块链的分布式账本来跳过金融监管,以达到便捷交易的目的,这也是所谓的“去中心化”。

在以太坊中,智能合约由二进制字节码组成,其使用的编程语言为 Solidity。以太坊将智能合约编译后,存储于区块链中,从而实现了上述的信息中定义交易。



智能合约能否实现?

实际上,以太坊也在日益进步。想要开发一个完善的智能合约,还需要时间磨砺。

以太坊去中心化的核心是其可以运行图灵完备的脚本语言,而开发以太坊智能合约则有四种语言:Serpent、Solidity、Mutan、LLL。这些语言都是面向底层设计的语言。目前来看,Solidity 是首选语言,这是由于它内置了 Serpent 语言的所有特性,语法类则似于使用广泛的 JavaScript。再加上 Solidity 的语言特性较少,该语言则可以更简单地实现完备的智能合约体系。

区块链去中心化的应用程序通常为 DApp,它由智能合约和后端代码构成。在 DApp 中,所有的服务和逻辑都运行于区块链上,也就意味着 DApp 不仅需要设计前端应用,还要开发基于以太坊的智能合约代码。



图丨 DApp 与智能合约的关系

这些智能合约代码以 JsonPRC 的方式提供给应用程序进行调用,而此时,智能合约就如以太坊中的转账操作一样,被广播到所有节点上,通知这些节点运行被调用的智能合约 ABI,然后这些被调用的 ABI 会各自运行在该节点的虚拟机中。最后通过区块链的生成将运行过程和结果打包进区块链,并通过区块链的同步实现全网统一。

换句话说,要想实现没有漏洞的智能合约,开发步骤则是关键所在。截止至 2018 年 3 月 4 日,开源社区中比较流行的 DApp 开发工具是 browser-solidity。听名字就知道是一款基于浏览器的工具,用户可以在线编写智能合约代码,同时还能编译成二进制字节码部署到用户所属的区块链中。



图丨browser-solidity开发界面

目前, Solidity 的版本是 0.4.21,看版本号就知道还处于测试阶段。这也就意味着其开发工具 browser-solidity 也存在不成熟的地方,导致 DApp 出现漏洞,最终影响了智能合约。不过 Solidity 的更新速度并没有资本追逐区块链的速度快,若过早将智能合约投入使用,势必会造成大量的经济损失。

另外,区块链存在问题的不只是合约层。以共识层为例,以太坊采用的是 PoW 共识机制,需要进行大量的哈希运算才能确保全网共识。它会造成算力浪费,并且在联盟链中,该机制的可信程度也不怎么高。

如果真有一天区块链可以被应用于现实中,那么它需要的不是化妆,而是整容。