主页 > imtoken.im > 北京大学ETH肖震老师《区块链技术与应用》笔记——12.0反思

北京大学ETH肖震老师《区块链技术与应用》笔记——12.0反思

imtoken.im 2023-07-20 05:15:12

12.0 反思

1. 对智能合约的反思——智能合约真的智能吗? (智能合约真的很智能吗?)

首先我们要明白,智能合约没有使用人工智能技术,所以有人认为应该叫自动合约。 根据预先编写的代码,自动执行某些操作。 在现实世界中,有自动合约的例子吗? ? ATM提款机可以看作是物理世界中的自动合约,按照预先指定的逻辑做某些事情。 所以智能合约其实并不智能,而且相当愚蠢。 一旦写好,就无法更改,它只是一个代码契约。 (智能合约一点也不智能。)

2. 不可撤销性是一把双刃剑。

一般来说,当我们提到区块链的不可篡改时,我们认为这是区块链的一个优势。 许多区块链应用都使用了不可篡改的特性,例如防伪和可追溯性。 但从“The DAO”事件可以看出,不变性其实是一把双刃剑。 一方面,不变性增加了合约的可信度,但另一方面,不变性也意味着如果规则出现漏洞,我们很难修复漏洞,甚至升级软件。 The DAO 盗币事件 有传言称,The DAO 的开发团队在盗币事件发生前几天就收到了智能合约存在安全漏洞的消息,但并未前来发布更新软件。 如果这对于中心化系统来说,大家可能会觉得难以想象。 如果您发现软件存在安全漏洞,为什么不及时发布安全补丁呢? 但是问题在于你如何在区块链世界中发布补丁。 软件更新需要硬分叉才能实现,也需要大部分矿工的支持。 不管是比特币还是以太坊,硬分叉都不是随便做的。 以太坊的这次硬分叉,最终创建了两条平行链,你必须解释硬分叉的原因,否则其他矿工为什么要升级你的软件,一旦你解释了原因,你就会泄露安全漏洞的信息,恶意攻击者就会在他们有时间升级软件之前发动攻击。 不变性带来的一些问题。

不可变修改也会导致另一个问题。 即使我们发现了这个安全漏洞,也已经有人进行了恶意攻击。 我们很难冻结账户并终止交易。 这种体验不同于我们正常的生活体验。 比如你的银行卡信息被泄露,第一反应就是通知银行,冻结账户,修改密码。 很多人在刚接触区块链的时候,都会有同样的反应。 他们发现比特币账户的私钥被泄露了。 怎么办,赶紧通知谁冻结了账户。 ,本质上是需要发布一个软件更新,与被冻结账户相关的交易将不会被执行,这样才能被冻结。 个人认为泄露私钥搞软分叉是不可能的。 对于普通人来说,剩下的资金只能尽快转到安全的账户。

一个相关的问题是智能合约在区块链上发布时无法避免被他人调用。 以太坊还在The DAO相关的子基金中比特币是什么语言完备的,同样存在安全隐患。 我们传统上和直觉上认为,如果智能合约出现问题,那么其他人就无法调用它。 但是在区块链上,你无法阻止其他人调用它。 如果你想阻止它,你需要软分叉并添加一个新规则。 任何调用此智能合约的交易都不会被执行。 那么剩余2/3的资金应该及时划转,如何划转? 利用黑客的这个漏洞把钱转走。 当时有人提出这个建议。 比如你是个好人,你创建了一个新的智能合约,并向大家公布这个,说现在你需要利用黑客的漏洞,把剩下的钱转到一个安全的智能合约上。 重入攻击是一样的,但是你的目的是好的,这个新合约的目的就是为了以后把钱还给大家。

3. 没有什么是真正不可撤销的。 (没有什么是不可撤销的。)

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

4. 合约语言设计的思考(solidity是正确的编程语言吗?)

为什么会发生重入攻击之类的事情? 从某种意义上说,solidity 语言具有一些反自然的特征。 我们一般的理解是我给你转钱,你是被动的收款人。 你不能回来给我打电话。 但是solidity语言的特点就是如果我给你转钱,就相当于调用了你的fallback()函数。 虽然我表面上没有调用任何函数,但是你可以反过来调用我。 这与通常的生活体验不同,因此很容易忽略此类安全漏洞。

有人建议改进为函数式编程语言,更安全,更不容易出现漏洞。 而且从长远来看,还需要从理论上证明智能合约的正确性。 如果能通过形式验证(formal verification)来证明程序的正确性,就能解决智能合约存在漏洞的问题,这曾被一些人认为是智能合约的最终目标。 然而,形式验证离实用还很远。 一般只能证明一些简单逻辑的正确性,在证明过程中需要屏蔽很多实现细节。 这就导致即使程序能够证明是正确的,实际运行起来还是可能会出现问题。 从语言设计的角度来看,Solidity有很多值得改进的地方,但并不意味着我们应该使用函数式编程语言,我们应该使用形式化的证明方法来证明程序的正确性。 这还有待探索。

语言设计的第二个思考是编写智能合约的语言应该具备什么样的表达能力。 我们之前讲过比特币和以太坊的区别。 比特币的脚本语言非常简单,表达能力差,而以太坊的编程语言是图灵完备的。 计算机可以完成的任何任务,语言都可以完成。 up,但是图灵的完整的表达能力并不是什么好东西。 智能合约出现漏洞后,有人认为应该选择表达能力适中的语言,既能实现智能合约的功能,又不易出现漏洞。 但是设计一门合适的语言是困难的,因为在设计语言时很难预测未来所有可能发生的事件,也很难预测未来所有可能发生的安全攻击。

我们说比特币的脚本很简单,但在实际应用中,大部分矿工只接收到几个常用的脚本,并且有一个安全脚本白名单。 如果交易脚本不在白名单中,很多矿工默认是不能接受的。 联想到现实中的合同,也会因为不严谨而产生一些纠纷,所以通常会使用模板来编写合同,来避免这些问题。 智能合约可以参考这种基于模板编写合约的方式,以后应该会有类似编写智能合约的专门机构。 所以不要在出现各种问题的时候对智能合约失去信心。 智能合约的历史比较短,最终会走向成熟。

5. 对开源软件漏洞的反思(很多眼球谬误。)

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

理论上代码是开源的,但是真正去研究代码的人却寥寥无几。 比如像“The DAO”这样涉及到财产安全的项目,你就得把钱投进去。 投资前需要检查吗? 这份智能合约并不可靠,但很多人并没有仔细阅读,而阅读过的人可能没有足够的安全知识来检测其中的安全漏洞。 手机上有很多区块链钱包也是开源的,跟财产安全有关。 那么有多少人看过钱包的源码,有多少人能够看懂呢? 大家都以为别人肯定看过,其实可能没有人仔细看过,所以不要认为开源软件就一定比非开源软件安全,很多人用的软件不一定有安全性漏洞。 历史上,很多开源软件的安全漏洞都是多年后才被发现的。 的。 因此,我们还是需要对这些关键应用保持警惕,需要排查智能合约是否存在安全问题。

6、对去中心化的反思(去中心化是什么意思?)

区块链技术的追随者一般都是去中心化理念的支持者。 这些人不满于现实生活中的中心化管理方式,因此在区块链世界中寻找新的管理方式。 这也是以太坊开发团队推出硬分叉方案后引起如此大争议的原因。 很多人认为它又回到了中央集权的老路上。 把账户里的钱转过去,这不是比中心化更中心化吗? 在一个中央集权的社会,没收一个人的财产仍然需要经过各种合法的程序,而且不一定能在 28 天内完成。

但是你回想一下这次硬分叉的过程,是不是以太坊的开发团队说的? 首先,他们进行了投票。 最终大多数人都投了硬分叉的票,但更重要的是,以太坊团队没有办法强制大家支持这个投票结果。 最终,硬分叉之所以成功,是因为90%以上的矿工升级了软件,用行动支持了硬分叉。 尽管如此,仍有小部分矿工不支持硬分叉方案,继续在老链上挖矿。 那是他们的自由。 以太坊团队几乎无能为力迫使他们转身。 因此,去中心化并不意味着完全自动化,让机器在没有人为干预的情况下决定一切。 去中心化并不是说已经制定的规则不能修改,而是规则的修改需要去中心化的方式进行。 结束。 我们通常说我们用脚投票,但在区块链的世界里,我们用挖矿来投票。 这次硬分叉之所以成功,是因为绝大多数矿工认为以太坊开发团队的决定符合大多数人的利益。 不要小看广大矿工的思想觉悟。 如果以太坊开发团队为了一己私利做出决定,大多数工人阶级不会跟随他们。 这是对去中心化的反思。

关于分叉,我们一般认为分叉是一件坏事,但仔细想想,分叉只是去中心化的一种体现。 在中心化系统中,你没有办法分叉,你可以选择放弃,但不能选择分叉。 比如以太坊创始人V神的故事。 19岁那年,他非常喜欢玩魔兽世界。 直到有一天,暴雪移除了他最喜欢的技能。 对结果很满意,他一气之下就不玩了。 后来,他想了想为什么会这样。 本质上是因为这个游戏是去中心化的游戏,公司有决定权。 普通用户别无选择,于是他决定打造一个去中心化的平台,用户有不满意的分叉权。 因此,分叉选项的存在正是民主的体现。

七、对去中心化与分布式的思考(去中心化≠分布式)

去中心化系统一定是分布式的,但分布式系统不一定是去中心化的,即使系统运行在几千台计算机上,如果这些计算机都由同一个组织管理,那么也不能称为去中心化。 一个集中式应用程序或一个分散式应用程序可以运行在一个分布式平台上。

比特币和以太坊都是交易驱动的状态机(state machine),其特点是允许系统中数千台计算机执行相同的操作,并付出高昂的代价来维持状态的一致性,这不是分布式的一种常见对于分布式系统的工作模式,大多数分布式系统允许不同的机器做不同的事情。 然后汇总每台机器的结果,得到最终的结果。 这样做的目的是为了比单台机器更快。 例如,1 台计算机完成一项任务可能需要一周的时间,但如果是 10 台计算机的分布式集群,可能一天就可以完成。 理想情况是获得线性加速度,即10台电脑的速度比1台电脑的速度快。 速度快了10倍,但是在实际应用中,线性加速是很难做到的,因为有任务切分,任务通信,结果汇总都有重叠,所以10台计算机在实际应用中的速度可能相当于1 computer是计算机的6、7倍,但还是比计算机强,所以分布式系统才有意义。

状态机的模式不是这样的。 状态机的目的不是为了比计算机处理得更快比特币是什么语言完备的,而是为了容错。 状态机最早的应用场景是什么? 一些mission critical applications(关键计算应用),比如空中交通管制,证券交易所,航天飞机,这些都是状态机的一些常见的应用场景,这些场景有什么特点呢? 这些应用程序必须不间断地对外提供服务,因此需要多台计算机重复相同的操作,这样即使一台计算机宕机,仍然可以对外提供服务。 这就是状态机模型的原理。 为此付出的代价是什么? 效率很低。 几台机器在一起比一台机器慢,因为需要同步状态,集群中机器越多速度越慢。 因此,在使用状态机的传统模型中,机器的数量是比较少的,很多都是个位数。 成千上万的机器像比特币和以太坊一样重复着同一套操作,这在以前从未发生过。 所以不要认为比特币和以太坊是分布式系统的常态。 我们明白这一点,就能明白智能合约更适用于哪些场景。 不要把智能合约EVM平台看成是大规模计算或大规模存储等服务。 如果这样做的话,不仅很慢,而且成本也很高,因为要消耗大量的gas,智能合约是用来写控制逻辑的,只有那些需要在实体之间建立共识的操作,不需要相互信任,需要写在智能合约里。 如果需要大规模计算服务,可以使用亚马逊的云服务平台。