0%

ETH十一---反思

反思

​ 回顾The DAO事件,应该引起什么样的反思?

关于智能合约的反思

​ Is smart contract really smart?

智能合约里并没有用到人工智能的技术,有人认为其实应该把它叫做自动合约,按照实现编写的代码,自动执行某些操作,我们现实世界当中,例如ATM取款机可以看作物理世界的一个自动合约,你把银行卡插进去,输入密码,他就把钱吐给你。所以智能合约其实并不只能,其实挺笨的,一旦写好之后就改不了了,实际上一种代码合同,这个可以作为第一个反思。

​ smart contract is anything but smart.

​ 智能合约写好之后就不能篡改了,这就涉及到了区块链的不可篡改性,一般来说,提到不可篡改性,是区块链的一个优点,有很多区块链的应用都是应用了区块链的不可篡改性,比如说用它来做,防伪、溯源,但是通过The DAO事件,我们应该意识到,不可篡改性,其实是一个双刃剑。

​ Irrevocability is a double edged sword.

一方面来说,不可篡改性增加了合约的公信力,我们大家都只能按照合约中的规则中来,没有人可以篡改这个规则,这是好的一方面,但是另一方面,不可篡改性也意味着规则中有漏洞,我们想要修补这个漏洞都是很困难的。

​ 软件升级必须硬分叉,不想现实世界中,发布一个一个的patch,对于比特币也好,以太坊也好,硬分叉都不是随便搞的,像这次以太坊的硬分叉,最后就造成了两条平行的链,而且你要硬分叉的话,你要说明理由,一旦说明理由,就有可能把系统漏洞的信息泄漏出去,有恶意的攻击者可能会在还没有来得及升级软件之前抢先发动攻击,这些都是区块链上不可篡改性带来的一些问题,另外,即使已经发现恶意漏洞,有人已经进行攻击了,想要冻结账户,终止交易都是很困难的,这个也是和我们日常生活的体现不太一样的。如果你发现你的私钥泄漏了,这时候不是想着怎么冻结账户,而是把剩下的以太币转移到另外一个安全的账户上去。

​ 与之相关的问题,智能合约发布到区块链上去之后,没有办法阻止对他的调用,比如说这次的盗币事件,黑客偷走了1/3的以太币,还有2/3的以太币是在The DAO这个智能合约以及它的子基金里面,同样存在着安全的风险,这样的想法是,既然这个智能合约存在问题,就不能让别人去调用它了,但是区块链上没有办法阻止,要阻止的话,就必须软分叉(增加一个规则,调用这个智能合约的交易都不予执行)。如果你是一个The DAO的用户,你应该怎么办?马上通知以太坊团队这是对的,还能做什么?其实和私钥泄漏的情况是一样的,你应该在第一时间把剩下的2/3的钱转到一个安全的账户:用黑客的漏洞把钱转走。

​ Nothing is irrevocable.

​ 有什么是真的不可篡改的,其实都可以改,我们前面说的比较多的是分叉攻击的例子,比如说有一笔交易本来是写在区块链里面,然后有一个黑客,从这个区块前面进行分叉,后面的交易被回滚,以太坊的The DAO事件,实际上是用软件升级的方法强行改变某些账户的状态,不要迷信区块链的不可篡改性。

语言设计上的反思

​ 为什么会出现重入攻击这样的事情?从某种意义上说,solidity这种语言是“反自然”的,我们一般的理解是我给你转账,你是一个被动的接受者,你不可能再回来调用我,但是solidity语言的特点是,我给你转账,等于是隐性地调用了你的fallback函数,虽然表面上我没有调用任何函数,但是转账本身就是调用了你的fallback函数,接着你可以调用我,这个和我们平时的生活体验不太一样,所以就可能忽视这样一个安全漏洞。有的人提出,干脆使用函数式编程语言,函数式编程语言不容易出现这样的漏洞,而且从长远来看,要实现的是证明智能合约功能的正确性。

​ Is solidity the right programming language?

编写智能合约的语言应该具有什么样的表达能力,比特币的脚本语言是很简单的,表达能力很差,而以太坊的编程语言,叫图灵完备的,凡是计算机程序能够完成的任务,solidity能够实现。但是这种图灵完备的表达能力是不是一个好事情。

​ 出现智能合约的漏洞之后,有些人认为,应该去选取一种表达能力适中的语言,不能像比特币脚本语言的表达能力太弱,也不要像以太坊的solidity一样,表达能力是图灵完备的:可以实现智能合约要实现的功能,但是又不容易出现安全漏洞。

​ 设计的语言很难预料到将来可能出现的应用场景,也很难预料到将来可能出现的所有安全攻击,所以这么设计是很难设计出来的,包括比特币脚本,虽然简单,但是实际应用当中,大多数矿工也只是接受几个常用的脚本,有一个安全脚本的白名单(white list),如果脚本不在白名单里面,很多矿工缺省情况下是不接受的。