近日,EDU 智能合约出现重大漏洞,任意账户中的EDU Token可被转走,这些漏洞造成了来自项目方地址中的30亿万枚EDU Token被偷走,并被陆续转手在火币上进行抛售,引发市场进一步恐慌,价格持续走低 。比特币价格在23点30分开始暴跌,从7880跌到7400美元,2小时内跌幅达到6%。
这次的原因是在EDU智能合约中存在一个transferFrom函数,该函数缺少Safemath验证,可以让攻击者从任何一个EDU余额不为0的账号内向另外一个账号转出EDU Token,也可以理解为可以从智能合约里偷币。
为什么会有这么大的漏洞呢?这是因为以太坊只是一个记录 dapp 执行结果的区块链,其本身并没有加密货币复式记账所需的 utxo 模型。以太坊自身的以太币也是由 balance 来表示账号余额,用余额的区块链会有一个明显的缺陷,很容易遭受重放攻击(交易的请求再发送一次)。以太坊用了 nonce 等 tricky 的做法避免主链货币重放,但对于基于 dapp 的代币,就需要依赖开发者自己来保障其安全逻辑。
所以基于以太坊的设计,Token合约风险主要有两种:
一是自己写的智能合约出现漏洞, 被人攻击。以太坊作 对于基于合约层的智能合约,需要依赖开发者自己来保障其安全逻辑,一旦合约编写者一时粗心,便可能造成一失足成千古恨的后果。例如18年4月22日BeautyChain出现重大安全漏洞,价值几乎归零,BEC凭空蒸发了10亿美元,事后证明是程序员忘记做溢出检查。
二是合约调用的底层合约出问题,间接产生风险。合约层是一台封装了可以执行图灵完备脚本语言的虚拟机,可以通过编写脚本语言作为智能合约部署到以太坊区块链中。
以太坊智能合约运行的大致流程是,取得写区块的节点运行 dapp 并记录运行结果到新的区块,当这个结果被其他节点验证之后这个新区块就被整个网络认可,验证的方法也是执行一遍这个合约脚本,智能合约的设计约束是 deterministic, 但并无其他机制可保证这个执行的安全性及正确性。即使有 bug,只要 bug 能被其他节点运行出相同结果,记录就会上链,erc20 或 erc721 是一个智能合约接口的约定,方便通用的钱包可以访问这些合约。
去年,一个叫做“devops199”的开发者触发了以太坊Parity钱包漏洞,漏洞出在钱包调用的一个library(以太坊的底层库函数,可以理解成公用合约)上。因为以太坊的合约调用是把地址当指针使用,每次执行用户编写的智能合约都要调用library。“devops199”把底层库函数破坏的同时相当于把所有合约的指针都破坏了,从而使得所有钱包里的资金被永久冻结。
在数字货币的时代,重要的 token 资产本身是需要货币级别的安全程度,以太坊目前的设计更适合游戏积分之类的合约运行结果,目前看来,重要的 token 资产不适合构建在 erc 20 基础之上。它没有任何货币安全设计的考虑。