而最靠近完美的一刻,
就是最容易走向相反的时刻。
列夫·托尔斯泰《安娜·卡列尼娜》
11月以来至少有三大EOS竞猜类DApp因“随机数漏洞”相继被黑——包括EOSDice、FFgame和EOS.WIN。 这里的所谓“随机数漏洞”其实是出现在智能合约上的。 大多数人都是从以太坊了解到“智能合约”的概念,事实上,智能合约早在以太坊出现之前就已经存在了。
1993年,计算机科学家、加密大师尼克·萨博(Nick Szabo)就提出了“智能合约(Smart Contract)”的概念。 最初的目的是为了将他所谓的“高度演进”的合同法和惯例算法设计成互联网上陌生人之间的电子商务协议。
1994年,他写成了《智能合约》论文,这是智能合约的开山之作这一重要的研究成果也为V神开创区块链2.0时代奠定了重要基础。
之所以被称为智能合约,主要由于合约的条款由计算机代码进行评估并执行,而非使用人力。
此外,合约代码一旦上链,执行的过程和结果都完全透明公开且不可篡改。
但是,随着智能合约的广泛利用,人们发现智能合约有可能出现漏洞,也同时存在着很多无法预料的安全风险。 目前,以太坊智能合约的编程语言solidity和以太坊智能合约运行的虚拟环境EVM的设计还不够完善,漏洞一旦被黑客利用就可能导致很多无法预料的安全问题,特别是资产方面的安全。 根据安全公司Hosho的数据显示,智能合约的漏洞普遍存在。 经过Hosho审计的总额高达10亿美元的智能合约项目中,有25%被发现存在严重漏洞,约有60%至少存在一个安全问题。
早在2016年就曾发生过区块链历史上沉重的一次攻击事件。 一个基于以太坊区块链平台的业界最大的众筹项目the DAO就受到了黑客的攻击。
原因是the DAO编写的智能合约中包含的一个splitDAO函数。 攻击者利用此函数的漏洞,不断从the DAO项目的资产池中分离出the DAO资产并转到黑客自己建立的child DAO。
事实上,child DAO设计的目的最初是为了保护在DAO投票中处于弱势地位的Token持有者。 通过创建child DAO给予他们一个小规模的可提议、投票以及分红的新的分布式自治组织的环境。 黑客在发起攻击的三个小时内,有大约300万以太币资产被转出the DAO资产池。 按照当时的以太币交易价格,市值近6000万美元的以太币被转移到了黑客的child DAO里。
随后,the DAO监护人提议社区发送垃圾交易阻塞以太坊网络,以减缓the DAO资产被分离出去的速度。
Vitalik也在以太坊官方博客发布题为《紧急状态更新:关于the DAO的漏洞》的文章。 Vitalik提议进行一次软分叉且不会有回滚,也不会有任何交易或者区块被撤销的可能。
软分叉将从块高度1760000开始把任何与the DAO和child DAO相关的交易认作无效交易,以此来阻止攻击者在27天后提现被盗的以太币。
这次攻击事件被称为区块链史上的“黄金大劫案”,也是直接导致以太坊社区分叉的“罪魁祸首”。 除了此次最严重的攻击事件外,智能合约中还存在着一类经常被利用的影响资产安全的高危漏洞。计算机语言中的整数类型都有一个宽度。换句话说,一个整数类型有一个最大值和一个最小值。
当两个整数计算时,结果大于最大值或小于最小值也就是溢出。
若超出整数类型的最大表示范围,数字便会由一个极大值变为一个极小值或直接归零。
若超出整数类型的最小表示范围,数字便会由一个极小值或者零变成一个极大值。
黑客利用类似的机制凭空向一个账户中转入很大数额的代币,而合约中的逻辑只要求他花费很小的代价,这样一来就能够轻易地进行漏洞攻击。
今年已经发生了多起由于整数溢出造成的资产安全事件。 4月,黑客利用BatchOverFlow对美链BEC智能合约发起攻击,凭空取出大量BEC代币并在市场上进行抛售。 BEC随即急剧贬值,价值几乎为0,即使事后采取回滚,也并没能挽回损失。 随后,SMT项目方也发现其交易存在异常,黑客利用其函数漏洞创造了大量SMT币,火币Pro随即暂停了所有币种的充值提取业务,以防止黑客进行大量抛售。 此外,还包括奇偶校验错误漏洞,该事件曾使价值1.68亿美元的以太坊无法使用。
为了减少智能合约漏洞所带来的损失,不少公司都有不同的解决方案。 今年1月,智能合约安全初创企业Quanstamp设计了一个基于以太坊编程语言Solidity的智能合约安全审计协议。
通过他们所设计的安全审计协议,客户可以通过预先审查软件和“Bug Finders”来仔细检查智能合约中的漏洞,同时也会奖励那些在智能合约上纠错的用户。 虽然这看似这一个有效的解决方案,但是对于客户本身来说,除了需要审查源代码之外,还必须人工手动进行修改。
另一家名为CertiK也提出了解决方案,他们将提供区块链生态所有组件的验证平台,包括智能合约和DApps。
CertiK平台应用深度学习技术来构建智能标签框架。
通过这个框架,大多数共享逻辑和属性代码都可以被自动标记,从而使得程序的逻辑和语义更加清晰和规范,验证的工作量也可以大大减少。 这样,就可以将复杂的证明任务分解成为更小的任务,并在适当的抽象层面验证其中的每一个。 这种工作方式将有效地激励和奖励社区的构建,并在一定程度上改进解决算法,保持一个有弹性、经济有效的解决方案。
此外,以太坊基金会(Ethereum Foundation)开发者Alex Van de Sande公布了一项有关“保险池”的提议。 由于智能合约代码漏洞造成的资金冻结的事故,在寻找解决方案的过程中可能产生分歧,从而带来分裂网络的风险。
Van de Sande是以太坊Mist浏览器团队的领导者,他在一篇文章中提到过创建一个存有专用保险资金的“赎回合约”(recovery contract)的方法。这样,能够降低个人或组织通过争议性硬分叉来获得部分或全部因为代码漏洞所损失的资金。 但是,Van de Sande的提议中最具争议性的部分是涉及到了为超过51.3万ETH发行赎回代币的计划。 这个数量也是因合约代码漏洞被错误锁定在Parity多重签名钱包中的以太坊数量。 Parity团队表示无意通过争议性硬分叉的方式取回资金。 因此,Van de Sande认为他的这项计划将会使受害者(包括大多数以太坊核心开发者)成为利益相关者。 区块链技术虽然被吹的神乎其神,但如果一味地忽略其中的漏洞而不解决,只会阻碍区块链的进一步发展。