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

The DAO事件始末

DAO,英文全称是Decentralized Autonomous Organization ,去中心化自治组织,代码即法律。

在The DAO项目中,发行代币,以太币可以换取一定数量的代币。代币越多的人投票权重越大,项目资金的用途需要代币持有人投票决定,相关的提议由智能合约支撑。如果你觉得这个投资不符合你的预期你可以执行拆分出去,经过七天的拆分期,期间其他用户可以加入这个拆分。拆分之后在过28天的锁定期,锁定期一过你就可以提现了。

The DAO则是区块链公司Slock.it发起的一个众筹项目2015。1个月就筹集到1.5亿

重入攻击,一下是代码,从代码上可以看到,代码先把钱转给了个人然后再把thedao里面用户的钱清零。问题来了如果我在执行在清零的时候报错不让他执行清零,是不是我可以一直给自己转钱呢?

//totalSupply:当前代币总量
//rewardAccount:奖励账户,用于管理奖励的账户,奖励将分配给该 DAO 的 DAO 代币持有者
//paidOut:已支付到某个地址的奖励金额(以wei为单位)以太币
function splitDAO(uint _proposalID,
    address _newCurator) 
    noEther onlyTokenholders returns (bool _success) {
    	.........
    	// Burn DAO Tokens
           Transfer(msg.sender, 0, balances[msg.sender]);//把用户账户代币转给0,也就是销毁代币
           withdrawRewardFor(msg.sender); // be nice, and get his rewards;将你拥有的代币连同奖励一起给到你的新账户
           totalSupply -= balances[msg.sender];//将合约账户中的钱减少
           balances[msg.sender] = 0;//将合约账户中该用户金额置0
           paidOut[msg.sender] = 0;
           return true;
}
function withdrawRewardFor(address _account) 
    noEther internal returns (bool _success) {
        if ((balanceOf(_account) * rewardAccount.accumulatedInput()) / totalSupply < paidOut[_account])
            throw;

        uint reward =
            (balanceOf(_account) * rewardAccount.accumulatedInput()) / totalSupply - paidOut[_account];
        if (!rewardAccount.payOut(_account, reward))//转账到_account这个账户,同时这里会调用fallback函数
            throw;
        paidOut[_account] += reward;
        return true;
}

其实在被黑客攻击之前就有人发现这个里面的漏洞,但是Thedao社区还没有来的急处理

withdrawRewardFor调用过程最后转账的时候会调用fallback函数,黑客利用这个fallback函数再次调用splitDAO函数,就在这无限循环嵌套,永远没有办法将账户置0,黑客在程序嵌套流程中已经把账上的钱转走了,想追也追不回来了。这时就算黑客写了跳出循环的规则也没有用了。

如此熟悉The DAO代码与机制的人,全世界或许不超过100个。黑客利用这两个漏洞,进行了两百多次攻击,总共盗走了360万的以太坊,超过了该项目筹集的以太坊总数目的三分之一。

幸好有28天的锁定期,这就有了操作的空间了。thedao意识到赶紧把剩下的钱转走不能再被盗了,问题来了!怎么转走?合约里面没有写啊,又不能改合约(去中心化无法修改合约,或者说极其困难修改合约),只能用黑客的方式把剩下的钱转到一个安全的账户。到现在应该算是及时止损了吧。

这时以太坊社区闹翻了天了,一部分人觉得这个太严重了对以太坊可以说是一个重创,投资者损失太严重了,事实也证明以太坊市值也在该事件的影响下不断下跌,他们认为必须把黑客手里的钱还给投资者。另一部分人觉的黑客有没有犯法只是利用你们智能合约里面的漏洞,你不是说的代码即法律,退一万步将你THE dao只是以太坊众多合约里面的一个很普通的合约犯得着为他这样干吗!这不是自毁信用吗?说什么去中心化,说什么无法篡改,你们现在所做的就是强盗强行把别人的钱转走,你们已经背离了以太坊的初衷了。

不过玩归玩闹归闹别把Money开玩笑,以太坊还是做出了这个艰难的决定--分叉(软分叉)。以太坊升级了代码,代码规定所有有关这个黑客账户转账交易都不允许写到区块链中。因为是个软分叉以太坊中绝大部分人都把软件更新了。(软分叉:升级后的程序认为老程序执行的交易不合法,未升级的程序认为升级后的程序所执行的交易同样是合法的)

大家都以为这个事情就告一段落了,但是情况又有了新变化,以太坊出现了大量的关于黑客账户的转账交易,很多挖矿的节点执行这样的交易之后没有汽油费得,旷工发现这样下去吃力不讨好啊,很多节点由于不堪重负就回退了。现在离28天的锁定期没有几天了情况已经非常紧急了。

以太坊社区也没有很好的办法了只能硬分叉,然后就在社区里面举行投票,最后投票结果是决定硬分叉。将黑客所有的以太币强行转到一个特殊的合约账户,这个账户只有一个功能“退钱”,大多数节点都在192w个区块的时候执行这样的“非法的交易”。但是以太坊社区质疑的声音还是一直存在,有人说投票不能代表所有还有好多人没有参与投票,这样非法的交易已经违反了我们建立以太坊的初衷了,这就是强盗行径,别人把就算钱存在银行被扣留了我还可以去法院辩解,现在就你们投票就把我的钱给强行转走了。(硬分叉:未升级的程序认为升级后的程序所执行的交易是不合法的)

过了没多久有就发现还有人在沿着老版本在挖矿他们觉的自己才是正统是纯粹的。再后来有的交易所也在慢慢接受经典以太坊。以太坊社区发现硬分叉的后果已经无法挽回了但是分成两条链会出现双花攻击,于是将代码升级添加版本号,老版本成为经典以太坊ETC

自此以后以太坊社区再也没有为任何一个漏洞合约分叉过了,后果太严重了

相关文章:

  • 工业智能网关BL110应用之六: 支持PLC,Modbus,BACnet,电表等协议列表
  • Jackson公司蛋白质印迹指南丨样品制备
  • 数字IC必学之《Skill入门教程》
  • Operator 基础原理和概念
  • Math对象常用的方法
  • MySQL高级篇——锁
  • 【编程题】【Scratch二级】2022.06 画正方形
  • 【学习笔记】内存的连续分配管理方式
  • 图解 cv2.HoughLines cv2.line 参数原理
  • 使用简易网络实现二分类
  • XAML笔记
  • 5个自动化小技巧:聪明的员工和管理者如何提升效率?
  • JAVA轻量级错误码设计最佳实践
  • Nidia的Deepstream,官方给的案例介绍,deepstream-test1\deepstream-tes2\deepstream-test5
  • RESTful风格学习笔记【包含示例】
  • Apache的基本使用
  • docker-consul
  • JavaScript 基本功--面试宝典
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • node学习系列之简单文件上传
  • Protobuf3语言指南
  • Vue官网教程学习过程中值得记录的一些事情
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 阿里研究院入选中国企业智库系统影响力榜
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 无服务器化是企业 IT 架构的未来吗?
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 译米田引理
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (13):Silverlight 2 数据与通信之WebRequest
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (JS基础)String 类型
  • (三)mysql_MYSQL(三)
  • (一)基于IDEA的JAVA基础12
  • (转)Linux下编译安装log4cxx
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .Net Memory Profiler的使用举例
  • .net refrector
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .NET关于 跳过SSL中遇到的问题
  • @ResponseBody
  • [ 数据结构 - C++]红黑树RBTree
  • [20181219]script使用小技巧.txt
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [Android Pro] Notification的使用
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C++]拼图游戏
  • [CF407E]k-d-sequence
  • [codeforces]Recover the String
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
  • [FTP]pureftp部署和优化