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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值