当前位置: 首页 > ai >正文

肖臻《区块链技术与应用》第23-26讲 - The DAO事件、BEC事件、反思和总结

“代码即法律”的终极考验:The DAO事件与以太坊的硬分叉

摘要:
重入攻击”不仅仅是理论上的安全漏洞,它曾在现实世界中引发了一场惊天动地的黑客攻击,并最终导致了以太坊社区的分裂。本文基于北京大学肖臻老师的公开课内容,详细回顾了以太坊历史上里程碑式的The DAO事件。文章将带领读者了解The DAO这一早期去中心化自治组织的宏大愿景,剖析其智能合约中致命的“先转账后清零”漏洞是如何被黑客利用的。随后,我们将深入探讨事件发生后,以太坊社区内部关于是否应该“回滚交易”以挽回损失的激烈哲学辩论,以及从失败的软分叉到最终实施硬分叉的曲折历程,最终揭示以太坊(ETH)与以太坊经典(ETC)因此诞生的历史根源。


1. The DAO:一个伟大的去中心化实验

在比特币成功实现“去中心化货币”后,社区开始探索:“如果货币能去中心化,还有什么可以?”DAO(Decentralized Autonomous Organization,去中心化自治组织)的概念应运而生,它旨在用代码构建一个组织的规章制度,实现组织的自治。

The DAO是2016年5月在以太坊上发起的一个具体的DAO项目,其本质是一个去中心化的众筹投资基金

  • 运作原理: 任何人都可以向The DAO的智能合约发送以太币,换取The DAO的代币。持有代币的人可以投票决定投资哪些项目,投资产生的收益也按照代币持有比例进行分配。
  • 巨大成功: 这一理念在当时引起了巨大轰动。在短短一个月内,The DAO筹集到了当时价值1.5亿美元的以太币,占据了当时以太币总流通量的百分之十几,成为史上规模最大的众筹项目之一。社区普遍认为,它代表了未来的组织形态。

2. 致命漏洞:重入攻击的现实上演

然而,这个被寄予厚望的项目,在其设计中埋下了一颗定时炸弹。问题出在投资者取回投资和收益的唯一途径——拆分DAO(Split DAO)函数的代码实现上。

2.1 拆分DAO的逻辑

投资者如果想退出,可以调用splitDAO函数,将自己的代币份额从主DAO中拆分出去,成立一个自己的“子DAO”(Child DAO),相应的以太币也会被转移到这个子DAO中。

2.2 “先转账,后清零”的漏洞

splitDAO函数的代码逻辑存在一个与我们上节课讨论的拍卖合约完全相同的致命缺陷:

// The DAO 拆分函数的错误逻辑(简化版)
function splitDAO(...) {// ... 检查条件 ...// 1. 先将ETH转给调用者的新地址recipient.transfer(amount);// 2. 后更新调用者在The DAO中的余额balances[msg.sender] = 0;// ...
}

2016年6月,黑客正是利用了这个“先转账后更新状态”的漏洞,发起了教科书般的重入攻击。黑客通过一个恶意合约反复调用splitDAO函数,在The DAO合约将其余额清零之前,循环地、递归地将资金转出。

最终,黑客成功盗取了The DAO中约三分之一的资金,价值约5000万美元。曾经前途无量的The DAO,上线不足三月便轰然倒塌。

3. 社区的抉择:回滚交易还是坚守原则?

黑客攻击虽然成功,但由于The DAO的设计中存在28天的资金锁定期,被盗资金暂时无法被黑客取走。这给了以太坊社区宝贵的应对时间,但也引发了一场激烈的哲学辩论。

  • 回滚派(以Vitalik Buterin为首):
    他们认为,The DAO事件影响巨大(Too Big to Fail),如果不加以干预,不仅会使大量投资者的利益受损,更会对整个以太坊生态的信心造成毁灭性打击。他们主张采取补救措施,通过硬分叉回滚交易,将被盗资金物归原主。
http://www.xdnf.cn/news/17948.html

相关文章:

  • select、poll 和 epoll
  • RK3568 NPU RKNN(二):RKNN-ToolKit2环境搭建
  • Java应届生求职八股(5)---并发编程篇
  • 【OpenGL】LearnOpenGL学习笔记10 - 平行光、点光源、聚光灯
  • ZCU国产化方案选型,哪家物料更齐全
  • 图像相似度算法汇总及Python实现
  • Linux内核内存管理深度解析
  • 自适应阈值二值化参数详解 ,计算机视觉,图片处理 邻域大小 调整常数(C=3)和可视化调节参数的应用程序
  • [Linux] Linux硬盘分区管理
  • 配置 Docker 镜像加速,解决 docker pull 拉取镜像失败、docker search 查询镜像失败等问题
  • 数据库Microsoft Access、SQL Server和SQLite三者对比及数据库的选型建议
  • Win11和Win10共享打印机提示709用添加Windows凭据来解决的小方法
  • 【UHD】vivado 2021.1 编译
  • 接口自动化测试框架搭建
  • maven与maven-archetype-plugin版本匹配问题
  • 一周学会Matplotlib3 Python 数据可视化-绘制绘制甘特图
  • 跑实验记录
  • Python Day30 CSS 定位与弹性盒子详解
  • python---内置函数
  • 微服务之注册中心与ShardingSphere关于分库分表的那些事
  • 【手撕JAVA多线程】1.从设计初衷去看JAVA的线程操作
  • Camera相机人脸识别系列专题分析之十九:MTK ISP6S平台FDNode原生代码
  • 【自动化运维神器Ansible】Ansible比较操作符详解:从基础到实战应用
  • 笔试——Day40
  • AI生成视频开源模型技术解析
  • 算法题打卡力扣第42题接雨水(hard)
  • OpenJDK 17的C1和C2编译器实现中,方法返回前插入安全点(Safepoint Poll)的机制
  • 拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用
  • 贺雨禾《梨花往事》北京首映,“野草型演员”深耕走出新赛道
  • 第4问 常见的指标有哪些?