ETH-24TheDAO事件带来的反思

内容整理自 北京大学肖臻老师《区块链技术与应用》公开课 ETH-24-TheDAO

智能合约真的智能么?

 智能合约并没有用到人工智能,应该叫做“自动合约”,按照事先写好的代码自动执行某些操作。现实世界中自动执行某些操作的例子是ATM取款机,物理世界的自动合约,插入银行卡输入密码,就会自动把钱给你。智能合约其实并不智能,反而有些“笨”,因为一旦写好之后就无法修改,实际上是一种代码合同。

不可篡改性是一把双刃剑。

一方面来说不可篡改性增加了合同的公信力,大家都只能按照合约中的规定去做,没有人能篡改。

另一方面不可篡改性也意味着如果规则中有漏洞,想要修补这个漏洞,想软件升级,都是很困难的。在区块链的世界里,软件更新需要硬分叉来实现,无论是比特币还是以太坊,硬分叉都不是随便搞得,以太坊的硬分叉,最后就造成了两条平行的链。而且硬分叉要说明理由,否则矿工不会升级软件,但是一旦说明理由就容易把漏洞的信息泄露出去,有恶意的攻击者可能会在没来得及升级软件之前抢先发动攻击。

不可篡改性的另一个问题在于即使已经发现了安全漏洞,已经有人进行恶意攻击了,我们想要冻结账户终止交易都很麻烦。想要冻结账户,需要软分叉,实质上是要发布一个比特币软件的更新,凡是与你账户相关的交易,都不予执行,这才能够冻结。像TheDAO的盗币事件之后,以太坊一开始采取的措施就是软分叉。但是对于个人账户来说不会因为你账户私钥泄露出去,就软分叉。这时候要做的是尽快把账户上的钱转到另一个账户上去。

还有一个问题就是智能合约一旦发布到区块链上之后,没有办法阻止对它的调用。比如说盗币事件,黑客偷走了接近1/3的以太币,还有2/3的以太币仍然是在TheDAO智能合约以及它的子基金里,同样存在安全风险。这时候没有办法阻止对智能合约的调用,要阻止的话又要软分叉,等于要增加一条新的规则,凡是调用这个智能合约的交易都不予执行。这时候需要应该在第一时间把剩下2/3的钱转到一个安全的账户,转走的方式是用黑客同样的方法发动攻击,利用漏洞把钱转走,自己攻击自己。

没有什么是真的不可篡改的。

一个篡改的例子就是分叉攻击,以太坊团队通过软件升级的方法强行改变某些账户的状态。一般情况下区块链上的内容想要篡改是很难的,但是遇到重大事件真的想改还是能改得了的。

开源的好处?

一个好处就是可以增加合约的公信力,接受监督。因为在区块链中,如果合约代码不开源,没有多少人会相信这个合约。

另外一个好处是安全,开源的代码不容易出现安全漏洞, 因为有很多人在看这些代码,但是我们看到了智能合约的代码出现了漏洞,而且问题不是智能合约所特有的,其他开源领域也有类似问题,这就引发一个思考:既然这么多人在看这些代码,为什么还会出现漏洞?这个有人称之为Many eyeball fallacy,就是说理论上代码是开源的谁都可以看,应该更安全,但是实际上真正去看源代码的人是很少的,例如TheDAO,涉及到财产安全的,要把钱投进去,按道理来说投钱之前应该检查智能合约是否靠谱,但是很多人都没有仔细看,就算看了也不一定有足够的专业知识能够检测出安全漏洞。所以不要认为开源一定比不开源安全,有很多人用的软件也不一定就没有安全漏洞。

去中心化意味着什么 ?

去中心化并不是全自动化,让机器决定一切,不能有人为干预。去中心化并不是说已经制订的规则就不能修改,而是说对规则的修改要用去中心化的方法来完成。TheDAO的硬分叉之所以能够成功,是因为大多数矿工认为以太坊团队做出的决定是符合公众利益的。

关于分叉。

一般认为分叉是件坏事,本来是一条链,分叉之后变成了两条链。但是分叉恰恰是去中心化的一种体现,在中心化的系统里可以放弃但是不能分叉。

去中心化不等于分布式。

一个去中心化的系统必然是分布式的,如果系统只运行在一台机器上,那必然不会是去中心化的,但是分布式系统不一定是去中心化的,即使系统运行在很多机器上,如果这些计算机都是由同一个组织所管理的,那么也不能叫做去中心化的。在一个分布式的平台上,可以运行一个中心化的应用,也可以运行一个去中心化的应用。比特币和以太坊都是属于交易驱动的状态机,这种状态机的模式的特点是让系统中几千台机器重复做同一组操作,付出很大的代价来维护状态的一致性,这个并不是分布式系统常用的工作模式。大多数分布式系统是让每台机器做不同的事,然后再把各台机器的工作结果汇总起来的到最后的结果,这样的目的是为了比单机速度快。状态机的目的不是为了比单机快,而是为了容错,状态机的最早应用场景是mission critical applications,特点是这些程序必须无间断的对外提供服务,哪怕宕机一分钟都会有很大损失,所以才会有好多计算机重复做同一组操作,这样即使有一台出现故障,剩下的还能继续对外提供服务,这是状态机模式的原理。这样的代价是效率低,几台机器一起要比一台还要慢,因为要同步状态,而且集群里机器越多速度越慢。

不要以为智能合约是分布式系统的常态,大多数分布式系统不是这样的。不要把智能合约当做是大规模计算或者大规模存储的服务,如果这么做的话不仅速度慢,而且成本高,因为耗很多gas fee。智能合约是用来编写控制逻辑的,只有在那些互不信任的实体之间建立共识的操作,才需要写在智能合约里。

你可能感兴趣的:(区块链学习)