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

肖臻《区块链技术与应用》第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),如果不加以干预,不仅会使大量投资者的利益受损,更会对整个以太坊生态的信心造成毁灭性打击。他们主张采取补救措施,通过硬分叉回滚交易,将被盗资金物归原主。
  • 原则派(“代码即法律”):
    他们坚决反对任何形式的回滚。他们认为区块链的不可篡改性是其核心价值。黑客的行为虽然不道德,但完全符合智能合约的代码逻辑。如果因为一个应用层的合约漏洞就去修改底层区块链,那么“不可篡改”就成了一句空话,以太坊与中心化系统将毫无区别。

4. 从软分叉失败到硬分叉决裂

4.1 第一步:失败的软分叉

以太坊团队首先尝试了一个“温和”的解决方案:通过软分叉发布一个软件升级,规定“任何与The DAO相关的交易都视为非法”。然而,这次升级的代码存在一个Bug——它在拒绝这些非法交易时,没有收取Gas费。这导致网络遭到了大量的拒绝服务攻击,矿工们不堪其扰,最终纷纷回退到了旧版本,软分叉方案宣告失败。

4.2 第二步:决定性的硬分叉

眼看28天的锁定期即将结束,以太坊团队提出了一个激进的硬分叉方案:

  • 方案内容: 在软件升级中写死一条规则——在第192万个区块高度,强行执行一笔特殊的交易,将The DAO合约账户(包括黑客的账户)中的所有资金,全部转移到一个新的、仅用于退款的智能合约中。
  • 本质: 这相当于开发团队代替法院,对链上资产进行了一次“强制执行”。这种无需签名、强行修改账本的行为,是典型的硬分叉。

尽管遭到了原则派的强烈反对,但在社区投票中,该方案获得了大多数人的支持。

5. 历史的诞生:以太坊(ETH)与以太坊经典(ETC)

2016年7月20日,在第192万个区块,硬分叉被成功执行。

  • 以太坊 (ETH):
    绝大多数矿工和社区成员都升级到了新版本。这条经过修改、挽回了投资者损失的链,继承了“以太坊”的名字,成为了我们今天熟知的ETH
  • 以太坊经典 (ETC):
    那些坚守“代码即法律”、反对回滚的原则派,拒绝了这次升级。他们选择继续在原始的、未经修改的、保留了黑客攻击记录的旧链上挖矿。这条链为了以示正统,命名为“以太坊经典”,即ETC

至此,曾经统一的以太坊社区正式分裂。这个由智能合约漏洞引发的事件,最终通过一次充满争议的硬分叉,深刻地改写了区块链的历史。它不仅催生了两条独立的公链,更将“代码即法律”与“社区共识”哪个更重要这一哲学问题,永远地摆在了所有从业者面前。


一行代码的“悲剧”:深入解析BEC智能合约的整数溢出漏洞

摘要:
The DAO事件的重入攻击之后,以太坊的历史上再次发生了一起因代码漏洞而引发的、足以载入史册的安全事件。这次的主角是美链(BeautyChain, BEC)代币,而元凶则是计算机编程中最古老、最经典的Bug之一——整数溢出(Integer Overflow)。本文基于北京大学肖臻老师的公开课内容,详细复盘了2018年4月发生的BEC智能合约攻击事件。文章首先介绍了以太坊ERC20代币的基本概念,然后逐行分析了BEC合约中batchTransfer函数的致命缺陷,揭示了攻击者如何通过一次精心构造的乘法运算,“凭空”铸造出天文数字的代币,最终导致该代币价值瞬间归零。


1. 以太坊上的“代币”:ERC20合约简介

在深入案例之前,我们首先需要理解以太坊上“代币”(Token)的本质。

  • 代币并非原生货币: 与以太币(ETH)不同,代币并非区块链底层的原生资产。
  • 代币是智能合约的“账本”: 每一个代币,其本质都是一个智能合约。这个合约内部维护着一个“账本”(通常是一个mapping结构),记录了每个地址拥有多少个该代币。
  • 转账即函数调用: 当你“转让”一个代币时,你实际上是在向这个代币的智能合约发起一笔交易,调用其内部的转账函数,来修改它内部账本的数据。
  • ERC20标准: 为了保证不同代币之间的互操作性,社区制定了ERC20等标准接口,规定了代币合约必须实现哪些基本功能(如transfer, approve, balanceOf等)。

2. 案件重现:美链(BEC)的batchTransfer函数

美链(BEC)就是一种发行在以太坊上的ERC20代币。除了标准功能外,它的合约代码中实现了一个自定义的、用于提高效率的函数——batchTransfer

  • 功能: 允许用户一次性地多个地址转让相同数额的代币。例如,项目方可以调用一次这个函数,向100个早期用户每人空投50个BEC。
  • 代码实现(简化版):
function batchTransfer(address[] _receivers, uint256 _value) public returns (bool) {// 接收者数量uint256 cnt = _receivers.length;// 计算需要转账的总额uint256 amount = uint256(cnt) * _value;// 1. 检查调用者余额是否足够require(balances[msg.sender] >= amount);// 2. 从调用者账户中扣除总额balances[msg.sender] -= amount;// 3. 循环为每个接收者增加相应数额for (uint256 i = 0; i < cnt; i++) {balances[_receivers[i]] += _value;}return true;
}

这段代码看起来逻辑清晰,似乎毫无破绽。然而,一个微小但致命的疏忽就隐藏在其中。

3. 致命的缺陷:整数溢出漏洞

3.1 什么是整数溢出?

在计算机中,整数类型都有一个最大值上限。例如,一个8位的无符号整数(uint8)最大值为255。如果你对255进行加1操作,它不会变成256,而是会因为“溢出”而“绕回”到0。

Solidity中使用的uint256类型也有一个极其巨大的最大值(2²⁵⁶ - 1)。如果两个uint256的数字相乘,其结果超过了这个最大值,就会发生整数溢出,乘积的结果会“绕回”变成一个非常小的数字。

3.2 攻击者的“神来之笔”

BEC合约的漏洞就出在计算总额的那一行代码上:
uint256 amount = uint256(cnt) * _value;

攻击者发现,这里的乘法运算没有进行溢出检查。于是,他精心构造了一笔交易:

  • 接收者数量 (cnt): 2
  • 转账金额 (_value): 一个极其巨大的数字(8后面跟了许多个0

这个巨大的_value恰好是uint256最大值的一半左右。当它乘以2时,结果正好超过了uint256的最大值,发生了溢出,amount的值因此“绕回”变成了0

3.3 “凭空印钞”的后果

amount变为0后,整个函数的执行流程就变得极其荒谬:

  1. require(balances[msg.sender] >= 0); -> 余额检查轻易通过,因为任何人的余额都大于等于0。
  2. balances[msg.sender] -= 0; -> 调用者的余额丝毫未减
  3. for循环开始执行,为两个接收者地址(均由攻击者控制)分别增加了那个原始的、巨大的_value

最终结果是:攻击者没有花费任何成本,就成功地为自己的两个账户**“凭空”铸造**了天文数字的BEC代币。

事件发生后,BEC代币的价值在交易所瞬间断崖式下跌,趋近于零。相关交易所紧急暂停了提币功能,但这起攻击已对该项目造成了毁灭性打击。

4. 教训与反思:SafeMath的重要性

这起悲剧本可轻易避免。社区早已开发出名为SafeMath的安全数学库,用于防止此类溢出。

  • SafeMath的原理: 它将简单的a * b运算,封装成a.mul(b)。在这个封装的函数内部,会先进行乘法运算,然后立刻进行一次除法校验,以确保运算没有溢出。
// SafeMath 乘法示例
function mul(uint256 a, uint256 b) internal pure returns (uint256) {if (a == 0) {return 0;}uint256 c = a * b;// 校验:如果乘积除以其中一个乘数不等于另一个,说明发生了溢出require(c / a == b, "SafeMath: multiplication overflow");return c;
}

最具讽刺意味的是,BEC合约的开发者在代码的其他地方(如加法和减法)都使用了SafeMath库,却唯独在batchTransfer这个关键的乘法操作上,掉以轻心,使用了原生的乘法运算符,最终酿成大祸。

总结: The DAO事件和BEC事件分别揭示了智能合约安全的两大经典漏洞——重入攻击整数溢出。它们共同警示我们,在“代码即法律”且不可篡改的区块链世界中,任何一个微小的编程疏忽都可能被无限放大,带来无法挽回的损失。对于智能合约开发者而言,遵循最严格的安全范式、使用经过审计的安全库,是不可逾越的铁律。

开启区块链认知之门:反思

摘要:
在喧嚣与争议之中,区块链技术究竟是“堪比蒸汽机的伟大发明”,还是“世界上最慢的数据库”?为了拨开迷雾、回归技术本源,北京大学计算机系的肖臻老师开设了《区块链技术与应用》这门面向研究生的公开课。本文根据该课程的开篇导言整理而成,旨在为学习者呈现这门经典课程的核心理念、教学大纲与学习路径。文章将阐述课程为何聚焦于比特币以太坊两大基石,强调其“代码即真理”的硬核学习方法,并传达课程最重要的原则:我们只探讨技术,不构成任何投资建议。


1. 为何学习区块链?—— 超越炒作,回归技术本源

2017年,加密货币经历了一场惊心动魄的爆发式增长,随后又在2018年急转直下。面对如此剧烈的波动和外界两极分化的评价,我们应该如何客观看待区块链技术?

肖臻老师指出,社会上充斥着大量关于区块链的讨论,但其中许多人并不真正理解其底层技术,讨论的也多是务虚的商业模式。本课程的核心目的,就是穿透商业炒作的表象,带领计算机专业的学生深入理解区块链的技术内核,建立起远超社会平均水平的深刻认知。

课程强调了两点时代背景:

  • 时机尚早: 尽管比特币已诞生多年,但整个区块链领域仍处于非常早期的发展阶段。现在深入学习,依然能成为该领域的先行者。
  • 超越比特币: 比特币开创了先河,但其市场份额已从一家独大发展到百花齐放。以太坊等新兴平台的崛起,极大地扩展了区块链的应用边界。因此,我们的视野绝不能仅限于比特币。

2. 比特币与以太坊的双核驱动

本课程将主要围绕两种最重要、最具代表性的加密货币展开:

  • 比特币 (Bitcoin): 作为区块链技术的“开山鼻祖”,理解比特币是理解整个领域所有后续创新的基础。
  • 以太坊 (Ethereum): 它在比特币的基础上引入了智能合约,将区块链从一个去中心化货币系统,提升为了一个“世界计算机”,开启了去中心化应用(dApp)的时代。

通过对这两大系统的深入学习,学生将能掌握区块链技术的核心原理与关键的演进脉络。

3. 代码即真理

3.1 课程受众与基础要求

本课程主要面向计算机专业的研究生,默认学生已具备扎实的数据结构、算法和编程等本科基础知识。

3.2 教材与一手资料

虽然课程推荐了《Bitcoin and Cryptocurrency Technologies》作为参考教材,但肖臻老师明确指出,该书内容已相对过时,课程将按照他自己设计的、更贴近当前技术发展的思路进行。

本课程更强调对一手资料的学习,包括:

  • 白皮书与黄皮书: 理解项目最初的设计哲学与技术规范。
  • 官方文档: 如学习智能合约需阅读Solidity的官方文档。
  • 源代码: 尤其是对于像以太坊这样快速迭代的项目,文档常有滞后甚至与实现不符之处。本课程遵循**“以代码为准”**的根本原则,在有疑问时,直接从源代码中寻找最真实的答案。

区块链的现实拷问:肖臻老师结课演讲中的应用、质疑与反思

摘要:
在深入探索了区块链技术的底层细节之后,我们必须回归现实,审视其真正的应用价值与面临的诸多挑战。本文基于北京大学肖臻老师《区块链技术与应用》公开课的结课演讲整理而成。文章系统性地剖析了社会上对区块链应用的常见“误解”,例如在保险理赔和食品溯源中的局限性。同时,文章直面了针对区块链技术的几大核心质疑——交易不可撤销、能源消耗巨大、智能合约漏洞频出等,并以精妙的比喻和深刻的洞察,为这些问题提供了更为理性、辩证的视角。最后,本文以“去中心化并非万能”作为反思,为这门硬核的技术课程画上了一个充满哲学思辨的句号。


1. 应用的“陷阱”:为何区块链不是万能灵药?

在区块链概念火热的背景下,许多人试图将其应用于各种场景。然而,肖臻老师指出,很多所谓的“应用”其实是混淆了问题的本质,区块链并非解决所有问题的灵丹妙药。

1.1 保险理赔与供应链:当技术错配了问题
  • 场景一:保险理赔

    • 常见误解: 传统保险理赔流程长达数周,而比特币交易只需一小时即可确认,用区块链可以大大提速。
    • 现实剖析: 理赔流程的瓶颈不在于支付环节,而在于前期的人工审核(勘定损失、审核材料、防止骗保)。一旦理赔金额确定,传统的银行转账本就很快。区块链无法解决真正耗时的人工审核问题。
  • 场景二:有机蔬菜溯源

    • 常见误解: 将蔬菜从生产到销售的每个环节信息写入区块链,利用其不可篡改性,就能保证消费者买到的是真正的有机蔬菜。
    • 现实剖析: 这是典型的“垃圾入,垃圾出”(Garbage In, Garbage Out)问题。区块链能保证链上的数据不被篡改,但它无法保证写入链上的初始数据就是真实的。如果源头输入的蔬菜信息本身就是虚假的,那么区块链只会将这个谎言“不可篡改”地永久记录下来。
1.2 “无需信任”的悖论与中心化的回归
  • 常见质疑: 区块链旨在让互不信任的实体进行交易,但这本身就是个伪命题。如果你完全不信任一个电商网站,无论它用什么支付方式,你都不会在上面买东西。
  • 现实剖析: 这个观点混淆了“商业模式”与“支付方式”。中心化和去中心化并非黑白分明。一个成功的商业模式,完全可以融合两者的成分。
    • 例如,亚马逊是一个高度中心化的、依赖品牌信任的电商平台。但这并不妨碍它未来接受比特币这种去中心化的支付方式。用户信任的是亚马逊这个实体,而比特币只是提供了一种新的支付选项。

2. 核心价值主张:构建“价值互联网”

如果区块链不适合解决上述问题,那么它的核心应用场景在哪里?答案在于解决现有支付体系无法很好解决的问题,尤其是跨境价值流转

  • 互联网的现状: 互联网实现了信息的自由、高效传播,但价值(支付)的流动却依然受到国界、银行体系的严重束缚。一个巴西人想向中国的专家支付咨询费,或者一个中国人想聘请以色列的专家,都会面临手续繁琐、周期漫长、费用高昂的困境。
  • 区块链的愿景: 加密货币被称为“世界货币”(Worldwide Currency),其目标就是构建一个价值互联网(Internet of Value),让价值的交换能像信息传播一样自由、无摩擦。

3. 直面三大核心质疑

3.1 质疑一:交易不可撤销是缺陷吗?
  • 质疑: 信用卡支付可以申请退款,有消费者保护,而比特币交易不可撤销,对消费者不利。
  • 反思: 首先,信用卡的“退款”并非技术上的“交易撤销”,而是在应用层由商家发起的一笔新的、方向相反的转账。这种操作在比特币上完全可以实现。其次,所谓的“消费者保护”是法律和政策层面的规定,而非支付技术本身的功能,且各国的法律差异巨大。
3.2 质疑二:效率低下且耗费能源?
  • 质疑: 一个比特币交易耗电上千度,效率远低于信用卡。
  • 反思: 评价一个支付方式的效率,必须结合其应用场景和当时的历史条件
    • 肖臻老师的“电报”比喻: 在今天看来,发电报是一种极其低效的通讯方式。但在电话和互联网普及之前,与耗时数周的信件相比,电报是革命性的、相对高效的通讯手段。
    • 同理,对于一笔需要数天才能完成的国际电汇来说,比特币一小时的确认时间就是一种质的飞跃。我们不应该用加密货币去解决信用卡已经完美解决的问题(如买咖啡),而应该看到它在传统金融体系效率低下的领域所展现的巨大优势。
3.3 质疑三:智能合约漏洞百出?
  • 质疑: The DAO等事件表明,智能合约代码复杂难懂,且一旦出现漏洞就无法修复,非常危险。
  • 反思:
    • 程序化是历史大趋势(Software is eating the world)。
    • 任何新技术在早期都有阵痛。 肖臻老师以ATM机为例,它诞生了几十年,至今仍会发生故障,但这并不妨碍它成为现代金融不可或缺的一部分。只有两三年历史的智能合约出现一些安全漏洞,是发展过程中正常现象。随着技术成熟,未来会出现更多经过审计的、标准化的合约模板来提高安全性。

4. 最后的反思:去中心化并非终极答案

在课程的最后,肖臻老师引导大家进行更深层次的反思:我们是否陷入了“去中心化崇拜”?

  • The DAO的治理困境: 即使没有被黑客攻击,The DAO的治理模式——让所有代币持有者投票决定投资项目——本身也可能存在问题。专业的风险投资需要深入的尽职调查,这并非简单的“少数服从多数”就能做好的。
  • 互联网泡沫的教训: 90年代末的互联网泡沫中,人们试图将所有商业模式都搬到网上,甚至包括在网上卖沉重的狗粮(邮费高昂)。事实证明,“如果一个商业模式本身是糟糕的,把它搬到互联网上,它仍然是糟糕的。
  • 结论: 中心化与去中心化各有利弊,应具体问题具体分析。去中心化是一种强大的工具,但它不是解决所有问题的终极答案。

结语: 这门暑期课从密码学原理出发,带领我们穿越了比特币和以太坊的技术迷宫,最终回归到对技术、商业与社会关系的理性思考。正如肖臻老师在开篇和结尾反复强调的,课程的目的是求知,而非投机。只有真正理解了技术的边界、优势与挑战,我们才能在未来的浪潮中,做出最清醒的判断。

http://www.dtcms.com/a/333973.html

相关文章:

  • 陪诊小程序系统开发:让就医不再是一件难事
  • UniApp 页面传参方式详解
  • 告别在线转换风险:本地运行的PDF转Word技术评测
  • Redis-plus-plus 安装指南
  • AI杀死的第一个仪式:“hello world”
  • 分享一个Oracle表空间自动扩容与清理脚本
  • 告别重复纹理:用Substance Designer构建UE5程序化地貌材质系统
  • 设计模式之静态代理
  • 基于Python3.10.6与jieba库的中文分词模型接口在Windows Server 2022上的实现与部署教程
  • 跑实验记录
  • HTTP 通信中的认证方式
  • macOS 中查看当前生效 shell 及配置文件的方法
  • Boost搜索引擎项目(详细思路版)
  • 数字化与人工智能的崛起及其社会影响研究报告
  • Navicat 为 SQLite 数据库设置密码指南
  • 学习游戏制作记录(制作系统与物品掉落系统)8.16
  • AT89C52单片机介绍
  • 《设计模式》代理模式
  • Day56 Java面向对象10 方法重写
  • 《Python学习之字典(一):基础操作与核心用法》
  • duiLib 实现鼠标拖动状态栏时,窗口跟着拖动
  • 拒绝造轮子(C#篇)使用SqlSugar实现数据库的访问
  • Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
  • 玩转tokenizer
  • huggingface TRL中的对齐算法: KTO
  • PMP-项目管理-十大知识领域:成本管理-估算预算、控制成本、避免超支
  • 免费下载 Landsat 系列遥感影像——地理空间数据云
  • 《吃透 C++ 类和对象(中):const 成员函数与取地址运算符重载解析》
  • ALBEF/BLIP/BLIP2/Instruct BLIP/X Instruct BLIP
  • 从废弃到珍宝——旧物二手回收小程序系统的价值发现之旅