北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊(四):The DAO、反思、美链、总结

10、ETH-The DAO

1)、The DAO

比特币实现了去中心化的货币,以太坊实现了去中心化的合约,有人想既然去中心化这么好,为什么不把所有的东西都改成去中心化呢?有人提出口号:let’s decentralize everything。DAODecentralized Autonomous Organization,去中心化的自治组织)就是在这个背景下产生的。传统社会中,组织都是建立在某种法律文件基础上的,比如说可以有个章程规范组织的行为,有时候还可能到政府登记注册。那DAO就是把组织的规章制度写在代码里,通过区块链的共识协议来维护这种规章制度的正常执行

在2016年5月,出现了一个致力于众筹投资的DAO,它的名字为The DAO。DAO是一个通用的概念,凡是去中心化的自治组织都可以称为DAO,The DAO是指具体的这个DAO,它的工作原理有点像众筹的投资基金,本质是运行在以太坊上的一个智能合约。如果你想参与The DAO,那你可以把以太币发给这个智能合约,然后可以换回The DAO的代币。需要决定投资哪个项目的时候,是大家投票决定的,手里的代币越多,投票的权重越大,最后有了收益也是按照智能合约中制定的规章制度进行分配的

工作原理有点像DAC(Decentralized Autonomous Corporation)去中心化的自治公司,一般来说,DAC是出于盈利目的,DAO的话可以是出于非盈利性目的,比如某种公益事业。DAC虽然有公司这个词,但是在现实社会中,它没有公司应有的法人地位,一般来说也没有像董事长、CEO这样的职务

The DAO 2016年5月份开始众筹的时候在当时受到了很大的关注度,因为以前从来没有这样民主的投资基金,一个月的时间筹集到了当时价值1.5亿美元的以太币。当时媒体都在预测,未来几年The DAO的影响里会有多么多么的大,有的人甚至说在3到5年以后The DAO的影响力甚至会超过以太坊本身。遗憾的是,The DAO一共只存活了3个月

如果你是The DAO的投资者,你怎么取回自己的收益,比如你参与The DAO,投了一笔以太币过去,换回一些The DAO的代币,过一段时间你需要用钱了,想把以前投资的以太币换回来,怎么办?

这个在The DAO的基金里是通过拆分的方式实现的,叫做:split DAO。拆分的做法不止是取回自己的收益,也是一种建立子基金的方式,拆分完之后得到一个child DAO

设计理念是这样的,The DAO投资项目是靠大家手里的代币去投票,如果有一小部分人他的投资理念和其他人不一样怎么办。这一小部分人可以用拆分的办法从The DAO独立出来,成立一个自己的子基金,叫做child DAO。拆分的时候,他们手中的代币会被收回,换成相应数量的以太币,把相应的以太币打到子基金里,然后他们就可以投自己想投的项目了。拆分的一个极端例子就是单个的投资者成立一个子基金,然后在子基金里就可以把所有的钱投给他自己,这是投资者取回投资和收益的唯一途径。拆分之前有7天的辩论期,拆分完之后有28天的锁定期,就是这28天的锁定期给了后面事故中的补救时间

拆分的理念并没有错,而且是民主制度的进一步体现,民主制度并不是绝对的少数服从多数,而是说也要尊重少数人选择的权力。拆分的理念没有错,那问题出在哪里呢?问题就出在split DAO的实现上

上图是split DAO的代码,从withdrawRewardFor这个语句开始,首先把钱还给调用这个函数的人,然后把The DAO中的总金额减少相应的数量,再把调用者的账户清0。在上一节讲过,正确的操作是先把账户清0,然后再转账。黑客就是利用这个漏洞进行的重入攻击,转走了5千万美元的以太币,差不多 1 3 \frac{1}{3} 31

这件事情在以太坊社区引起了很大的恐慌,引起了币价的大跳水。以太坊社区对此进行了激烈的讨论,该怎么办?

社区的意见分裂为两派:

一派认为,要回滚交易,成立的子基金有28天的锁定期,所以黑客暂时还没有办法取走以太币,还有时间可以采取补救措施

另一派认为,不需要做任何补救措施,因为黑客的行为没有违法,code is law。在疑似黑客的公开信中,黑客声称自己没有做错任何事情,只是利用了代码中的feature,既然代码里写的可以让我重复多次取钱,我就没有违反任何法律。这方认为,不应该回滚交易,区块链最重要的特性是不可篡改性,如果出了问题就回滚,怎么能叫不可篡改呢。而且这次出问题的只是以太坊上的一个应用而已,以太坊本身的代码没有问题,如果每个智能合约出了问题都回滚的话,不就乱套了吗

以太坊的开发团队是支持采取补救措施的,主要是这个事情的影响太大了,The DAO筹集的以太币数目已经占到了当时以太币总流通量的百分之十几。too big too fail,太大了以至于不能倒。那现在怎么补救呢?

比如说从黑客盗取以太币的区块的前一个区块开始分叉,让分叉链更长,这样行不行。如果这样,不光是黑客的交易回滚了,区块上所有的交易都回滚了,会影响大量正常交易的人,所以这样做是不行的

要回滚的话只能是精确定位,只能是针对黑客盗取以太币的那些交易,其他发生的正常交易不能受到影响。怎么操作呢?以太坊的团队制度了两步走的方案。第一步,首先要锁定黑客的账户。第二步,把盗取的以太币设法退回去,清退The DAO基金上的这些钱

第一步,怎么锁定这些账户。以太坊团队发布了一个软件升级,增加了一条规则,凡是和The DAO这个基金上的账户相关的,不能做任何的交易。许多矿工都升级了软件。这个是软分叉,软件升级是增加了一条判断的规则,新矿工挖出来的区块,旧矿工是认可的,旧矿工可以继续在这个区块后来开始挖,旧矿工挖出来的区块,新矿工有可能不认可,如果这个区块里包含了The DAO账户的交易,新账户就不认可,这样对系统只会造成临时性的分叉

遗憾的是,升级的软件有个问题,那就是判断是否和The DAO相关的交易这个步骤还要不要收取汽油费,如果不收取的话,可能有恶意的攻击者不断的发放非法的交易,拒绝服务(deny of service),浪费矿工的资源,反正对攻击者来说成本很低。以太坊的这个升级没有收汽油费,受到了deny of service,矿工之后就受不了了,纷纷重新使用升级前的软件。于是软分叉的方案失败了

这个时候形式严峻了,子基金成立之后有28天的锁定期,然后黑客就可以把钱取走了,软分叉的方案失败了,剩余的时间不多了。以太坊团队想软的既然不行,那就来硬的了,设计了一个硬分叉的方案,通过软件升级的方法,把The DAO账户上的所有资金强行转到另外一个新的智能合约上去,新的智能合约就只有一个功能,那就是退钱,当初是用以太币买的The DAO的代币,现在可以把代币退回成以太币

这个为什么是硬分叉?这种做法的本质是用软件升级的方法强行重新记账,本来的转账是要有合法的签名,比如说我要把你账上的钱转走,需要有你的签名才行,而这个升级的转账是没有合法的签名的,凡是The DAO上面的资金不管本人是否同意都要强行转到新的智能合约上去,挖到第192万个区块的时候,自动执行这条交易。新矿工挖出来的区块,旧矿工是不认可的,所以是个硬分叉

由此,社区彻底分成了两派,以太坊团队还写了一个智能合约来进行投票,用手中的以太币去投票,结果显示大多数人支持硬分叉,于是绝大数矿工升级了软件。最后硬分叉没有出现意外,成功了

2)、ETH和ETC

但故事没有结束,反对者认为,参与投票的人并不是很多,此外,投票的结果就一定是正确的吗?旧的那条链并没有消亡,还有矿工在上继续挖,算力大幅度下降,不到原来的 1 10 \frac{1}{10} 101,挖矿难度大幅度下调。旧链上挖出来的币叫做ETCEthereum Classic,经典以太坊),并在交易所上市交易了。一部分人挖是由于投机,一部分人挖则是出于信仰,坚持这种纯而又纯的去中心化理念,认为旧链才是正宗的以太坊,根正苗红,那些搞硬分叉的是在搞修正主义

刚开始硬分叉的时候带来了一些问题,比如重放攻击,在新链上的合法交易放到旧链上去同样是合法的,反过来旧链上的合法交易放在新链上也是可以执行的。后来给两条链增加了chainID来解决

为什么针对的都是The DAO中所有的账户,而不只是对应黑客的账户?

如果只冻结黑客的账户,由于合约的bug修不了,那人人都可以成为黑客去继续盗取,所以必须把与The DAO相关的所有账户都冻结了

11、ETH-反思

1)、智能合约的反思:智能合约真的智能吗?(Is smart contract really smart?)

首先我们必须了解智能合约里面并没有用到任何人工智能的技术,所以有人认为应该把它叫做自动合约,按照事先写好的代码,自动执行某些操作,现实世界当中,有什么自动合约的例子吗?ATM取款机可以看作物理世界上的一个自动合约,按照事先规定好的逻辑去做某些事情。所以智能合约其实并不智能,而且挺笨的,一旦写好了之后就改不了了,就是作为代码合同(Smart contract is anything but smart)

2)、不可篡改性是把双刃剑(Irrevocability is a double edged sword)

一般来说我们提到区块链的不可篡改性都认为这个是区块链的一个优点,很多区块链的应用都利用了不可篡改的特性,比如防伪、溯源。但是从The DAO事件当中,可以看出不可篡改性其实是一个双刃剑。一方面,不可篡改性增加了合约的公信力,但另一方面,不可篡改性也意味着如果规则中有漏洞,我们想要修补这个漏洞,想软件升级都是很困难的。The DAO的盗币事件有传闻说The DAO的开发团队在发生盗币事件前几天已经收到了有关智能合约中存在安全漏洞的消息,但是没有来得及发布更新后的软件。这个如果是对于一个中心化的系统,大家可能会觉得是很难想象的,如果你发现你的软件中的安全漏洞,你干嘛不及时发布一个安全补丁呢。但是问题在于在区块链的世界里你怎么发布补丁,软件更新需要硬分叉来实现,还需要得到大部分矿工的支持。无论是比特币还是以太坊,硬分叉都不是随便搞的,这次以太坊搞的硬分叉,最后就造成了两条平行的链,而且要搞硬分叉要说明理由,否则别的矿工为什么要升级你的软件,而你一旦说明理由的话,那就会把安全漏洞的信息泄露出去,那么有恶意的攻击者在还没有来得及升级软件之前抢先发动攻击,这些都是区块链上不可篡改性带来的一些问题

不可篡改性还导致另一个问题,即使我们发现了这个安全漏洞,已经有人进行恶意攻击了,我们想要冻结账户,终止交易都是很困难的。这个和我们日常生活的体验不太一样的地方,比如说你的银行卡的信息被泄露了,第一反应是通知银行,冻结账户,修改密码。很多人在刚接触区块链的时候也是同样的反应,发现比特币账户的私钥泄露出去了,怎么办,赶紧通知谁把账户给冻结了,没有办法冻结,要冻结的话只能软分叉,实质上要发布一个软件更新,有关要冻结的账户的交易都不予执行,这才可以冻结,对于个人来说,你的私钥泄露出去了搞一个软分叉,这是不可能的,对于普通人只能尽快将剩下的资金转到安全账户

与之相关的一个问题,智能合约发布到区块链上就无法阻止别人对它的调用,比如说这次的盗币事件,黑客偷走了差不多 1 3 \frac{1}{3} 31的以太币,还有 2 3 \frac{2}{3} 32的以太币还在The DAO相关的子基金里,同样存在着安全的风险。我们传统直观的认为,智能合约出问题了,那就不能让别人去调用它了。但在区块链上你没办法组织别人对它的调用,你要阻止的话又要软分叉,增加一条新的规则,凡是调用这个智能合约的交易都不予执行。所以还剩的 2 3 \frac{2}{3} 32的资金也应该及时转走,怎么转走?利用黑客的这个漏洞把钱转走。当时就有人建议这么做的,比如说你是个好人,你创建一个新的智能合约,把这个事情公布给大家,说现在要利用黑客的漏洞把剩下的钱转移到安全的智能合约,手段和重入攻击是一样的,只不过你的目的是好的,这个新的合约的目的是将来把钱退给大家

3)、没有什么是真的不可篡改的(Nothing is irrevocability)

理论上,没有什么是绝对不可篡改的,比如分叉攻击可以回滚交易。The DAO事件中,以太坊开发团队通过软件升级方式强行改变了某些账户的状态,所以不能迷信不可篡改的特性。毕竟代码是死的人是活的,没有什么是绝对改不了的,连宪法都可以修宪,比如美国的宪法修正案,修宪是很难的,但是有必要的时候还是可以改的。区块链上是一样的,想要篡改是比较难的,但是遇到重大事件,要是想改还是改的了的

4)、合约语言设计的反思(Is solidity the right programming language?)

为什么会出现重入攻击这样的事情,从某种意义上来说,Solidity语言上有一些反自然的特性,我们一般的理解是我给你转账,你是一个被动的接收者,你不可能再回来调用我。但Solidity语言的特性是,我给你转账等于调用了你的fallback()函数,虽然表面上我没有调用任何的函数,结果你还可以倒过来调用我。这个和平时的生活体验不一样,所以容易忽视这样的安全漏洞

有人提议应该改进为函数式编程语言,这样比较安全,不容易出现漏洞,而且从长远来看,要实现理论上证明智能合约的正确性。如果能够用形式化验证(formal verification)的方式,证明一段程序的正确性,那么将能够解决智能合约的漏洞问题,这个有些人曾经认为是智能合约的一个终极目标。但是形式化验证距离实用仍有很大的距离,一般只能证明一些逻辑简单的正确性,而且在证明过程要屏蔽掉很多实现上的细节,这样导致的结果就是即使这个程序从理论上可以证明的正确的,实际跑起来可能仍然有问题。从语言设计上来说,Solidity有很多值得改进的地方,但是不是说我们就该用函数式编程语言,就应该用formal proof的方法证明程序的正确性,这个还有待探讨

语言设计上的第二个反思是,编写智能合约的语言应该有什么表达能力。我们前面讲过比特币和以太坊的区别,比特币的脚本语言就是很简单的,表达能力很差,而以太坊的编程语言是图灵完备的,凡是计算机能完成的任务,语言都能实现,但是图灵完备的表达能力是不是一个好事情。出现智能合约的漏洞后,有些人认为,应该选取一种表达能力适中的语言,它可以实现智能合约的功能,又不容易出现漏洞。但是难以设计出适当的语言,因为设计语言的时候很难预料将来所有可能出现的所有应用场景,也很难预料将来可能出现的所有安全攻击

我们说比特币脚本是很简单的,但在实际应用中大部分矿工也只是接收几个常用的脚本,有一个安全脚本的白名单,如果交易的脚本不在白名单里面,很多矿工缺省情况下是不接受的。联想到现实中的合同,也会出现由于不严谨出现一些纠纷,所以通常使用模板写合同来规避这些问题。智能合约可以参考这种在模板基础上书写合约的方法,以后应该也会出现类似写智能合约的专门机构。所以大家不要对智能合约出现了各种各样的问题就对它丧失信心,智能合约的历史相对来说比较短的,最终还是会走向成熟

5)、开源软件漏洞的反思(Many eyeball fallacy)

去中心化的系统一般都是开源的,因为需要所有节点执行同样的操作,才能达成共识。开源的一个好处就是增加合约的公信力,接受群众的监督;有人认为另一个好处是不容易出现安全漏洞,因为全世界有这么多双眼睛在看着这个代码,但实际情况并不如此,我们也看到了智能合约的代码出现了各种各样的漏洞,而且这个问题不是智能合约所特有的,其他开源的软件也有类似的问题。那全世界有这么多双眼睛看着为什么还出现了这么多漏洞?

理论上代码是开源的,但实际上去研究代码的人是很少的,像The DAO这样涉及到财产安全的项目,你要把你的钱投进去,投钱之前是不是需要检查下这个智能合约靠不靠谱,但是很多人都没有仔细看,看的人可能也没有足够的安全知识去检测里面的安全漏洞。有很多手机上的区块链钱包也是开源的,也是涉及到财产安全的,那么有多少人是去看了钱包的源代码的,有多少是看的懂的,大家都认为别人一定看过了,实际上可能没有谁认真看过,所以不要认为开源软件一定比不开源的软件安全,有很多人用的软件也不一定没有安全漏洞,历史上有很多开源软件的安全漏洞是很多年后发现的。所以这些关键性应用我们还是要小心仔细,需要自己去检查下智能合约是否有安全问题

6)、去中心化的反思(What does decentralization mean?)

区块链技术的追随者一般都是去中心理念的拥护者,这些人对于现实生活中中心化的管理方式不满意,所以在区块链的世界中去寻找一种全新的管理方式。这也是为什么以太坊开发团队在推出了硬分叉的解决方案后引发了这么大的争议,有很多人认为又回到了中心化的老路上面,你开发团队凭什么用一个软件升级就把一个人账上的钱转走,这个岂不是比中心化更中心化,在中心化的社会里要没收一个人的财产还需要通过法律各种各样的程序,28天以内还不一定能完成

但是回想一下这个硬分叉的过程,是不是就是以太坊的开发团队说的算的。首先他们搞了一个投票,最后是大部分人投票支持硬分叉,但是更重要的是以太坊的团队是没有办法强迫大家支持这个投票结果,最后硬分叉能够成功是因为90%以上的矿工升级了软件,用行动支持了硬分叉,即使是这样还有少部分的矿工不支持硬分叉的方案,继续留在旧链上挖矿,那也是他们的自由,以太坊的团队没有什么办法强制他们转过来。所以说去中心化并不是说全自动化,让机器决定一切,不能有人为的干预,去中心化也不是说已经制定的规则就不能修改,而是说对规则的修改需要用去中心化的方式完成。我们平时说是用脚投票,区块链的世界里是用挖矿来投票的。这次硬分叉为什么成功,是因为绝大多数矿工认为以太坊的开发团队所做的决定是符合大部分人的利益的,大家不要低估了广大部分矿工的思想觉悟。如果以太坊开发团队为了一己私利做了什么决定,那广大工人阶级是不会跟着他们这样干的,这是关于去中心化的反思

关于分叉的事情,我们一般认为分叉是件坏事,但是你仔细想一下分叉恰恰是去中心化的体现。在一个中心化的系统里,你是没有办法分叉的,你可以选择放弃,但是你不能选择分叉。比如以太坊创始人Vitalik的故事,19岁的他非常喜欢打魔兽世界,直到有一天暴雪公司把他最喜欢的技能去掉了,他非常生气,多次找暴雪公司的人反馈,没有得到任何满意的结果,他一气之下就不玩了,后来他就想为什么会出现这种情况, 本质上是因为这个游戏是一个去中心化的游戏,决定权在公司,普通用户没有任何办法,所以他决定要去创建一个去中心的平台,用户不满意就有选择分叉的权利。所以存在分叉的选项恰恰是民主的体现

7)、去中心化与分布式的反思(decentralized ≠ distributed)

一个去中心化系统必然是分布式的,但是分布式系统不一定是去中心化的,即使这个系统运行在成千上万的计算机上,如果这些计算机都是由同一个组织所管辖的,那么也不能叫做去中心化的。在分布式的平台上可以运行一个中心化的应用,也可以运行一个去中心化的应用

比特币和以太坊都是交易驱动的状态机(state machine),它的特点是让系统中几千台计算机做同一个操作,付出很大的代价来维护状态的一致性,而这个并不是分布式系统常用的工作模式,大多数的分布系统是让不同机器做不同的事情。然后再把各台机器的结果汇总起来,得到最后的结果,这样做的目的是为了比单机的速度要快。比如说1台计算机要完成的任务,可能需要一个星期,用10台计算机的分布式集群,可能一天就完成了,最理想的状况是得到线性加速,就是10台计算机的速度比1台计算机的速度要快10倍,但是实际应用当中,线性加速是很难达到的,因为存在任务切分、任务通讯、结果汇总都是有开销(overhead),所以实际应用当中10台计算的速度可能相当于1台计算机的6、7倍,但是任然要比1台计算机要强,这样分布式系统才有意义

状态机的模式不是这样的,状态机的目的不是比1台计算的处理速度快,而是为了容错。状态机最早的应用场景是什么,是一些mission critical applications(关键任务应用),比如像air traffic control, stock exchange, space shuttle,这些是状态机常见的应用场景,这些场景的特点是什么?这些应用程序必须无间断的向外提供服务,所以需要好几台计算机重复同一种操作,这样即使1台计算机宕机,剩下的计算机还能向外提供服务,这是状态机模式的原理。这样付出的代价是什么,效率很低,几台机器合在一起比一台机器还要慢,因为它要同步状态,而且集群里的机器越多速度越慢,所以传统利用状态机的模型里面机器的数量是比较少的,有很多就是个位数的。像比特币、以太坊这样上千台机器重复同一组操作,在以前是从来没有过的。所以不要以为比特币和以太坊是分布式系统的常态,我们理解了这点就能理解智能合约比较适用的场景是什么,不要把智能合约EVM平台当成大规模计算或者大规模存储等服务,如果你这么做的话,不光是速度很慢,而且也是非常贵的,因为要耗很多汽油费、智能合约是用来编写控制逻辑的,只有那些需要在互不信任的实体之间建立共识的操作,才需要写在智能合约里。如果你需要大规模计算服务的话,可以用亚马逊的云服务平台

12、ETH-美链

1)、背景介绍

2018年4月发生的事件,美链(Beauty Chain)是发行在以太坊上的代币,这些代币没有自己的区块链,而是以智能合约的形式运行在以太坊的EVM平台上。发行这个代币的智能合约,对应的是以太坊状态树的一个节点,这个节点有它自己的账户余额,就相当于这个智能合约一共有多少个以太币,就是发行这个代币的智能合约它总的资产有多少个以太币,然后在这个合约里每个账户上有多少个代币,这个是作为存储树中的变量,存储在智能合约的账户里。代币的发行、转账、销毁都是通过调用智能合约中的函数来实现的,这个也是跟以太坊上的以太币不太一样的地方,它不像以太坊一样需要挖矿来维护一个底层的基础链,像以太坊上每个账户有多少个以太币,这个是直接保存在状态树中的变量,然后以太坊上面两个账户转账是通过发布一个交易到区块链上,这个交易会打包到发布的区块链上面,而代币发生转账的话实际上就是智能合约上面两个账户之间发生转账,通过调用智能合约上的函数,就可以完成了。每个代币都可以制定自己的发行规则,比如某个代币是1个以太坊兑换100个代币,那么比如说从某个外部账户转1个以太币给这个智能合约,这个智能合约就可以给你在这个智能合约里的代币账户上发送100个代币,每个代币账户上有多少个代币的信息都是维护在存储树里面,发行这个代币的智能合约的存储树里面

以太坊平台的出现让发行代币提供了方便,包括以前说的EOS,这个在上线之前也是作为以太坊上的代币形式,上线的意思是有自己的基础链了,不用依附在以太坊上了。以太坊发行代币的标准为ERC20(Ethereum Request for Comments)

美链中有一个叫batchTransfer的函数,就是一次性向很多个接收者发送代币,然后把这些代币从调用这个函数的账户上扣掉。美链的代币叫BEC,比如我有很多BEC,给10个不同的账户发送代币,调用这个batchTransfer函数,每个人发送100个代币,那么这个batchTransfer函数先从我的账户上扣掉1000个代币,然后给10个账户分别增加100个代币

2)、batchTransfer函数的实现

<img src=“https://img-blog.csdnimg.cn/bffa86c5ad0d467b9f0185f8d1e29d77.png#pic_center” width=80%">

batchTransfer函数有两个参数,第一个参数是数组,接收代币者的地址,函数中规定接收者的数目最多是20个,第二个参数value是转账的金额,先算一下总金额amount,recevier的数目和每人接收的代币计算;然后检查一下发起调用的账户msg.sender确实是有这么多代币的。之后把发起账户的代币数目减去amount,下面一个循环是给每一个接收者接收value这么多的代币

上图红框中的乘法,当value值很大的时候可能会发生溢出,amount算出来可能是个很小的一个值,所以从调用者的代币中减的时候是很小一部分的代币,但还是给每个receivers增加那么多value的代币,这样做造成了系统中凭空多发行了很多代币

3)、攻击细节

上图中一堆数字是函数调用的参数,该函数有两个参数,分别对应那串数字的前两行,第一个参数是地址,第一行给出的实际上是第一个参数出现的具体位置,这里是16进制的,40也就是64,也就是说第一个参数出现在第64个字节的位置,每一行是32个字节,所以实际上是从第2号开始出现的。第二行是这个value的值,这是个很大的数,前面是8,后面都是0,第三行是这个数组的具体内容,数组的长度,是2,接下来两行是两个接收的地址

参数的特点:第二行amount是8,再乘以2,算出来的amount恰好溢出为0,add(value)的时候还是加原来特别大的那一串数目

上图红框中是接收地址接收的代币,每个地址都接收到了很大一部分代币

攻击使代币的价格造成致命性的打击,差不多快要归零了

代币上市的交易所在发生攻击后暂停提币的功能,防止黑客携款逃走。两天之后回滚交易,这个事件影响没有The DAO影响的大

4)、反思

在进行数学运算的时候一定要考虑溢出的可能性。Solidity有一个safeMath库,里面提供的操作运算都会自动检测有没有出现溢出

mul()函数中,先用a * b = c,再用c/a看看是否等于b,如果发生溢出的话,assert()会抛出异常

C语言里,两个数相乘会有一定的精度损失,再除以一个数,不一定会得到和另外一个数一模一样的数。但是在Solidity里面是不存在的,因为两个数都是256位的整数,整数先进行乘法,再进行除法

batchTransfer的加法和减法都用的safeMath库,只有乘法不小心没有使用,结果酿成了悲剧。曾经有人怀疑是不是故意的,但从事件的结果来看又不像使故意的

13、总结

1)、区块链应用的争议

现在社会上对区块链的争议是非常大的,有很多对区块链的质疑其实也是有道理的,为什么会有那么多人会质疑这个技术,其中一个原因是区块链的概念被滥用了。有些人把什么问题都往区块链上放,无论是效率上的问题,还是监管上的问题,好像区块链是解决一切问题的法宝,无论什么问题放在区块链上都可以解决了,这个是不对的

举个例子,国外有人提出把保险理赔业务放在区块链上,原因是现有的保险理赔业务非常的慢,可能需要几个星期甚至更长的时间,所以他们觉得放在区块链上之后,因为区块链的转账速度,比如说比特币等6个区块确认,大概一个小时的时间就可以完成,这比保险理赔几个星期的速度要好很多了,这个应用场景有什么问题吗?保险理赔的速度慢并不是支付技术的局限性,就用普通的银行转账就行,是因为理赔的内容需要人工审核才会比较慢,而在这方面上区块链并没有好的优势

还要人提出用区块链做防伪溯源的,比如有人提出把有机蔬菜生产的全过程放在区块链上,他们认为区块链是不可篡改的,在区块链上可以查到有机蔬菜生产的全过程,所以是很好的应用场景,这个应用场景有什么问题吗?这个应用本身没有问题,但是是不是说只要你用区块链把生成的全过程记录下来了就能保证你买到的蔬菜就是有机的,这个是不一定的。如果这块地是施过化肥的,或者撒上农药的,但是被当作有机蔬菜记录在区块链里,那么区块链技术本身是检测不出来的,同样在运输销售过程中被人掉包了,这个也不是区块链能检测出来的。区块链的不可篡改性只是说这个内容写到区块链上是不可篡改的,但是写入到区块链的时候,本身写的就是假的内容,这个是没有办法检测出来的

还有一些区块链技术的争议是和信任机制相关的,区块链的一个共识机制的目的是要在互不信任的实体之间建立共识,有些人认为这个本身就是一个伪命题,因为互不信任的实体之间是没有办法进行实体交易的。比如说网上购物,假设有某个电商网站,它是去中心化的,你不信任它,那还怎么会在上面买东西呢。比如说你把比特币付给这个电商网站,对方不给你发货怎么办,或者收到之后发现商品有质量问题怎么办。在一个中心化的世界里,你可以通过各种机构比如说信用卡有一些保护措施,在去中心化的世界这些是没有办法做到的。这个质疑有一定道理,但是中心化和去中心化的界限并不是黑白分明的,在一个成功的商业模式里面,既可以有中心化的成分也可以有去中心化的成分,比特币只不过是一种支付方式,并不是说采用比特币作为支付方式的商业模式本身也必须是去中心化的。比如像亚马逊这样一个中心化的网站,它将来也可以采用比特币作为一种支付方式

2)、区块链的不可篡改性

与之相关的一个问题是区块链的不可篡改性,比如说网上购物的例子,交易已经写在区块链上不可撤销了,但商品有问题要退货怎么办。但其实包括信用卡支付,退款也不是撤销原来的付款交易,而是在应用层发起一个新的交易。用比特币支付也是同样的道理的

3)、区块链的监管

还要一些是和法律的监管保护相关的,传统的支付方式法律是有保护的,而区块链目前是缺乏监管的,有些认为这是好事情,去中心化可以不受到监管,但监管本身不一定是坏事情,没有法律监管同时也意味着没有司法保护。这里我们要注意的是,这些法律的监管和支付技术本身是没有什么关系的,信用卡被盗刷有些国家提供保护,但也有一些国家不提供保护。更重要的是比特币本来就不应该是和已有的支付方式进行竞争,在已有的支付方式已经解决的很好的领域不应该使用比特币。那哪些领域可以用呢,互联网把信息传播的很好,但对于跨界支付难度就要大很多,现有的体系当中支付渠道和信息传播渠道是分开的。有人说下一代互联网是价值交互网络,现在的互联网可以说是信息传播网络。未来的发展趋势就是支付渠道和信息传播渠道可以融合在一起,使得价值交互可以和信息传播一样的方便(Information can flow freely on the internet, but payment can not)

3)、支付方式的效率

还要一些质疑是和支付效率相关的,有些人认为加密货币的支付方式是十分低效的还耗能。第一,加密货币本来就不是用于和已有的支付方式做竞争的。第二,随着技术和共识协议的发展,已经有加密货币的效率大大提高了。第三,我们评价一个支付方式的好坏要和特定的历史条件下去评判,加密货币在某些场景下已经是非常高效的了

4)、智能合约

还有一些质疑是和智能合约相关的,有那么多安全漏洞,还不如用法律合同,老百姓还能看的懂。但程序化是个大趋势,Software is eating the world(软件将会改变颠覆世界),任何事件领域在转型的早期都会有一些问题,这是正常的。将来会出现智能合约常用的一些模板。但是不要以为智能合约和去中心化会解决任何问题。比如The DAO如果没有出问题,它的模式也不一定好,虽然它是由投票来决定投资很民主,但是民主就一定是好事情吗,大多数人的决定就一定是正确的吗?

Democracy is the worst form of Government except for all those other forms that have been tried from time to time.

丘吉尔说的,民主制度不是一种最完美的制度,就像高考不是一种最好的选拔人才的制度,但相对于其他制度是不错的。但不要以为用民主制度,投票能解决所有的问题,如果真是这样的话,那这个世界太简单了。The DAO的例子也是一样的,去中心化就一定是好事情吗?不一定的,这些风投的投资基金需要去调查许多方面,绝不是像智能合约中简单的投投票就完成了。历史上98 99年的互联网淘金热的时候,有些人就是把所有的概念都往互联网上靠,互联网相关的股票涨的很厉害。当时有人在互联网上卖狗粮,赔的一塌糊涂,因为狗粮很沉,当时的邮费就要不少钱。不要因为某种商业模式用去中心化的概念包装一下就把它捧上天,中心化和去中心化的管理方式其实是各有利弊的,要具体问题具体分析。像The DAO这个项目本就不应该那么热

对应课程

北京大学肖臻老师《区块链技术与应用》公开课

猜你喜欢

转载自blog.csdn.net/qq_40378034/article/details/126673999