币安官网注册链接: 币安(Binance)
北京时间2017年7月20日凌晨,以太坊钱包Parity发生极其严重的漏洞,导致15万枚以太币(价值约3200万美元)被盗。
该漏洞是由Parity钱包的多重签名智能合约代码引起的,尚未被其他钱包发现。 黑客在Parity钱包的enhanced-wallet.sol文件中反复调用两个智能合约initMultiowned和initDayLimit。 这两个初始化代码本来应该只调用一次,但代码执行时没有任何限制,导致资金非法转移。
截至撰写本文时,Parity 正在正式处理此漏洞,但尚未正式修复。 因此,建议所有使用多重签名协议的客户将资金全部转出,待漏洞修复后再转回。
Parity钱包被盗会对以太坊造成什么影响?
Parity 是目前以太坊中使用最广泛的钱包之一。 这次盗窃事件与 2016 年 6 月发生的 DAO 事件类似。DAO 事件也是由于智能合约代码存在漏洞,导致 350 万枚以太币被盗(当时价值 5000 万美元,超过 700 美元)。万元(按现价计算)。
DAO事件发生后,以太坊创始人Vitalik Buterin提出修改以太坊代码,对以太坊区块链实施硬分叉,回滚被黑客窃取的资金交易记录。 此举得到了社区大部分矿工的支持,但也遭到了少数人的强烈反对。 最终,少数坚持不同意回滚的矿工将自己开采的区块链命名为以太坊经典(ETC),从而导致以太坊社区出现分裂。
不过,Parity事件发生后,Vitalik Buterin很快表示,由于被盗资金金额并不大,因此不会考虑像上次那样实施硬分叉回滚交易。 结果,事件发生后,以太坊的价格并没有大幅下跌,目前以太坊ETH的价格为213美元,以太坊经典的价格为15美元。
什么是智能合约?
以太坊诞生于2014年,是继比特币之后又一个成功的区块链项目。 目前其市值约为200亿美元,仅次于比特币(约400亿美元)。
以太坊基于比特币开发了区块链技术,维护了全球共享的计算平台,实现了图灵完备的虚拟机EVM,并试图通过图灵完备的智能合约实现灵活性、安全性和全功能。 计算。
比特币最初被设计为一种电子现金系统,其内置脚本语言是专门为资金转移交易而设计的。 为了保证安全,故意放弃了图灵完备性(没有跳转或循环指令),所以它只是一个全局共享账本而不是一个计算平台。
以太坊实现了具有多种内置编程语言的区块链协议。 这些编程语言都是图灵完备的,可以支持条件分支、循环、跳转、函数调用等复杂的运算逻辑。 理论上,以太坊可以在区块链上运行任何应用程序。
具体来说,作为运行在以太坊区块链上的应用程序,程序员可以根据业务需求使用以太坊支持的编程语言自行设计和编写代码,而不必为应用程序运行单独的区块。 链。 基于以太坊区块链协议,应用开发者可以高效、快速地开发各种应用。 这样的程序称为智能合约。 智能合约代码发布到区块链上后,可以在以太坊区块链上自动执行,无需中介参与,任何人都无法阻止其运行。
目前以太坊上运行着数百个智能合约,Parity 和 DAO 就在其中。
受以太坊的启发,近年来出现了很多类似的项目,比如Fabric、QTUM等,它们从不同角度和层面对以太坊进行了部分优化,但总体思路是相似的,核心都是图灵完备的智能。 合同。
如何防范智能合约漏洞?
值得注意的是,虽然Parity事件造成的损害比DAO事件要小,但问题的根本原因是相同的。
随着智能合约开始得到越来越多的使用,智能合约的流程和代码变得越来越复杂,人们发现,就像现实世界的合约一样,如果不仔细审查,设计和编码过程可能会失败。 人为错误很难避免。 一旦黑客发现漏洞,损失往往是巨大的。
但需要强调的是,该漏洞并非以太坊区块链本身的漏洞,人们不应对以太坊及区块链的安全性产生不必要的疑虑。 此次事件不会对区块链的应用产生严重的负面影响。 类似的事件今后还会发生。 这并不意味着区块链技术的终结。
当然,区块链从业者应该吸取教训,尽量减少类似的安全事件。 笔者认为,在区块链和智能合约的设计和编码实践中,需要做到以下几点:
1、简化区块链脚本语言设计,为了安全性牺牲一些图灵完备性。 由于其设计上的非图灵完备性以及中本聪大幅删除了许多脚本指令的事实,比特币非常安全。 自2009年诞生以来的8年多时间里,平安经历了无数次黑客攻击,但从未因比特币区块链和脚本本身而导致资金损失。 然而,功能丰富性和安全性是永恒的矛盾,不可能两者兼顾。 因此,在设计区块链脚本语言时,尽量不要为了功能而使用通用的编程语言,而是要完善语言的功能。 做出权衡,使用最小的可用指令集,同时在智能合约虚拟机的设计中使用沙箱等隔离方法,严格限制CALL指令的使用。
2、严格执行智能合约代码审查。 就像现实中的合约文本一样,智能合约代码也必须经过多层次严格的代码审查,包括业务流程/逻辑审查、代码走查、详细测试流程、安全测试、专家审查等。对于逻辑复杂的智能合约对于涉及大资金的情况,应尽可能对代码进行形式化验证,并通过数学证明来验证智能合约的确定性。
3、加强智能合约程序员的培训。 虽然智能合约编程语言表面上看起来和传统的编程语言非常相似,但它属于一种新的编程范式,思维方式也与传统的面向过程、面向对象、面向函数有很大不同。编程范式。 需要将公平交易、诚信等主观概念纳入智能合约的设计和编码中。 为此,需要加强对智能合约程序员的培训,在实践中细化智能合约编程和设计模型,特别是安全模型,减少程序员犯错误的可能性。
4、应用实践要谨慎、循序渐进。 在实践中应用区块链智能合约时,应采取循序渐进的策略,由简单到复杂,从小规模试点到全面推广,涉及的资金数额也应由小到大,不需贸然涉及大量资金。 这样一来,即使前期某个漏洞被攻击,损失也不会太大。