清华大学金融科技研究院孵化
金融科技与金融创新全媒体

扫描分享

本文共字,预计阅读时间

最近以太坊因为The DAO智能合约的缺陷,要实行紧急的软分叉。然而在软分叉快当完成之际,又突然被发现软分叉本身会导致更多缺陷,被逼放弃计划。究竟为什么会出现这种荒谬的情况,对比特币的发展又有什么启示?

什么是软分叉?

软分叉泛指数字货币系统的规则改动,把一些原本有效的交易变为无效。

以太坊为何要软分叉?

以太坊内的The DAO智能合约由于设计错误,被黑客夺取了价值五千万美元的以太币,转移到另一份智能合约(称作”Child DAO”)。软分叉的目的是禁止一切和该Child DAO有关的交易。虽然软分叉不能令其它投资者取回被盗的款项,但也把被盗的款项永远冻结,最少令黑客不能直接得益。

以太坊软分叉为何失败了?

本来软分叉计划已在进行中,矿池也相继升级。然而在快当完成之际,被Emin Gun Sirer指出软分叉设计缺陷,一旦被实现,攻击者可以瘫痪以太坊网络。

以太坊的主要卖点是可以实现远比比特币复杂的程序,包括有回圈的程序(所谓图灵完备)。为防止被滥用,使用者必须用以太币为程序的每一步支付手续费;当手续费被用光,程序就必须停止。和比特币很不同的,是即使程序最终被判定为失败,矿工仍然可以收到手续费,那样就不怕有人以无效程序来消耗矿工的运算资源。

然而这个软分叉却禁止一切和指定Child DAO有关的交易。攻击者因此可以发出一项需要大量运算的交易,而最后一步却涉及了有关Child DAO。这会使矿工作出大量运算,最终却不能收到任何手续费。攻击者可以发出大量这种交易,从而瘫痪以太坊网络,而且是完全免费。

以太坊的设计缺陷如何导致软分叉失败?

以太坊的设计有极大的野心,目标是实现一个去中心化的计算机,因此其程序语言Solidity远比比特币的脚本(Script)复杂,希望借此挑战比特币的地位。然而这也是直接导致DAO被袭,以及令软分叉失败的原因。

首先,我们并不能对以太坊程序进行静态程序分析(Static program analysis)。静态程序分析是指我们可以单靠阅读程序,而无需实际运行程序,就可以知道程序会干什么。如果能够进行静态程序分析,面对上述的攻击,矿工只需要先把程序阅读一遍,如果见到有关指定Child DAO的代码,就放弃运行。然而以太坊的设计容许攻击者以代码运算出代码,矿工只有运行程序,直至碰到被禁的代码才停止,已经浪费了大量运算力。

另外,也不能通过封锁传播无效交易的节点来阻止攻击。由于程序运算涉及大量资源,而非矿工的普通节点不会收到任何手续费,因此普通节点在传播交易之时,只会查看交易格式是否正确,而不会实际运行。如果以封锁节点来阻止攻击,结果就会令所有普通节点都被封锁,同样达到瘫痪以太坊网络的效果。

在同样的问题上,比特币又是如何设计?

非图灵完备:首先,比特币的脚本并非图灵完备,没有循环,因此可以保证程序的终结,这是中本聪刻意的设计。 DAO漏洞本身就是攻击者利用程序循环特性,可以重复提取本来不属于他的款项。
事实上,比特币在2011年差点意外地透过BIP12 OP_EVAL变为图灵完备,幸而在最后一刻被发现而被放弃了。

静态程序分析:比特币的脚本必须把代码直接写出,因此可以通过静态程序分析直接找出无效的操作。 OP_EVAL容许以代码运算出代码,也是被放弃的另一个原因。
另外,除了交易以外,比特币区块本身的一些限制也是可以通过静态程序分析直接找出,包括区块大小及签名检查量的限制。现在的区块除了著名的1MB限制以外,还要求不能有超过20000个签名检查。这20000个限制包括了没有被执行的签名检查,因此不需要做实际验证,只要查看区块交易,就可以知道有没有超过这20000个的限制。

值得注意的是,著名的BIP109 (即Bitcoin Classic 硬分叉) 实际上并非只是把1MB改为2MB这样简单,它也会把签名检查限制改变为以实际被执行的数量计算,以致失去了静态程序分析的特性。

全节点检查交易:比特币的全节点虽然也不能得到手续费,但会把交易完成检查后才会传播出去,因此传播无效交易的节点会被封禁。但由于运行全节点没有直接的收入,过多的交易会令全节点数量下降,令系统得到不足够的监察。

标准交易与软分叉:事实上,比特币交易功能虽然不如以太坊,但仍然是有很大弹性。但在这无限的可能性之中,只有极少部份的交易被定义为标准交易,只要矿工和节点不修改Bitcoin Core的源代码,他们并不会传播非标准交易,也不会把非标准交易纳入区块。然而当非标准交易被纳入区块,仍然会被视为有效。

一直以来多次的软分叉,都是透过把非标准交易重新定义,而达到加入新功能的目的,例如刚完成的相对锁定时间(CSV),以及即将推出的隔离见证。这样做的最大好处,是旧节点会视这些交易为非标准交易而拒绝传播,即使在软分叉之后,也不会因为传播无效交易而被封禁。然而当这些交易被纳入区块,旧节点仍会视为有效,从而达到软分叉向后兼容的目的。

以太坊事件的教训

以太坊从一开始设计,就已经一直有声音批评其对安全性的忽视。非图灵完备,没有程序循环,静态程序分析等比特币一直坚持的特性,在以太坊都被刻意摒弃,并以此为卖点,视比特币为保守落后的象征。

以太坊这策略的确成功了,DAO一共圈了1亿5千万美元的投资,但这个神话在一个月以内就变为耻辱。笔者可以断言今次只是以太坊第一次自食其果,绝不会是最后一次,一切都是贪心冒进所惹来的祸。无论如何,在这事件以后,实在难以相信仍会有人愿意向以太坊的智能合约投资1亿5千万美元。

对比特币而言,这次也是一个重大警号,提醒我们必须谨慎地走每一步。经过过去数个月的上涨,比特币市值已超过100亿美元,无论是开发员还是矿工,都要以守护系统安全性为最大责任,并在安全的情况下加入新功能,确保系统能长期健康发展,而非为求一夜暴富而牺牲长远利益。

[Source]

本文系未央网专栏作者发表,属作者个人观点,不代表网站观点,未经许可严禁转载,违者必究!

本文为作者授权未央网发表,属作者个人观点,不代表网站观点,未经许可严禁转载,违者必究!

本文版权归原作者所有,如有侵权,请联系删除。

评论


猜你喜欢

扫描二维码或搜索微信号“iweiyangx”
关注未央网官方微信公众号,获取互联网金融领域前沿资讯。