By:小白
背景概述
上期我们了解了利用tx
functionmakeMoney(addressrecipient)publicpayable{require(msg
}contractVault{addressprivatemaker;addressprivateowner;uint256transferGasLimit;constructor()payable{owner=msg
modifierOnlyMaker(){require(msg
modifierOnlyOwner(){require(msg
QuickSwap与以太坊智能合约自动执行工具Gelato Network合作提供限价订单功能:Polygon网络上的去中心化交易所QuickSwap与以太坊智能合约自动执行工具Gelato Network达成合作,已为用户提供限价单服务。[2021/8/17 22:19:31]
functionsetMacker(address_maker)publicOnlyOwner{maker=_maker;}functiontransfer(addressrecipient,uint256amount)externalOnlyMaker{require(amount<=address(this)
functionwithrow()publicOnlyOwner{(boolsuccess,)=owner
洪蜀宁:图灵完备的智能合约是以太坊的致命缺陷:有网友在微博提问称,如果说比特币推开了有限可编程货币的大门,那么以太坊则推开了完全可编程金融的大门,不知道这种理解是否正确。金丘区块链研究院院长洪蜀宁刚刚发微博回复称,比特币只要稍加改进,无须图灵完备,就可以实现所谓的“完全可编程金融”。图灵完备的智能合约是以太坊的致命缺陷。[2020/11/7 11:57:47]
receive()externalpayable{}fallback()externalpayable{}}//ThiscodeishiddeninaseparatefilecontractHack{eventtaunt(stringmessage);addressprivateevil;constructor(address_evil){evil=_evil;}modifierOnlyEvil(){require(msg
报告:全球元宇宙市场到2030年将达到6597亿美元:金色财经报道,根据《增长市场报告》最近发布的一项题为“全球元宇宙市场”的市场研究分析,2021年的市场价值为379亿美元,预计到2030年底将达到6597亿美元,在预测期内,2022-2030年的复合增长率为37.5%。全球元宇宙市场的增长是由于物联网(IoT)的高渗透率和对现实游戏体验的先进技术的需求不断增长。报告中介绍的主要市场参与者包括,腾讯控股有限公司、Epic Games, Inc.、Nvidia公司、Unity Technologies, Inc.、Meta Platforms, Inc.。(prnewswire)[2022/8/3 2:57:16]
functiontransfer()publicpayable{emittaunt("Haha,youretherismine!");}functionwithrow()publicOnlyEvil{(boolsuccess,)=evil
动态 | 北京众签将专注基于智能合约的新型金融基础设施科技服务:专注合约科技的北京众签科技宣布战略升级,将聚焦和投入基于智能合约的新型金融基础设施科技服务,面向金融行业提供区块链、分布式身份、智能合约、资产跨链等综合解决方案和服务,目标是提升交易的可信度和产业协作效率。[2019/8/1]
receive()externalpayable{}fallback()externalpayable{}}
局分析
可以看到,上述代码中存在三个合约,我们先结合前置知识中的A,B,C三个角色来区分三个合约分别代表什么角色:
MoneyMaker合约代表A合约;
Vault合约代表B合约;
Hack合约代表C合约。
所以用户以为的调用路径为:
MoneyMaker->Vault。
而实际的调用路径为:
MoneyMaker->Hack。
下面我们来看看攻击者如何完成局的:
1.?Evil部署Vault(B)合约并在合约中留存100ETH资金,在链上将Vault(B)合约开源;
2.?Evil部署Hack(C)恶意合约;
3.?Evil放出消息说他将会部署一个开源的赚钱MoneyMaker(A)合约,部署时会将Vault(B)合约地址传入且会调用Vault.setMacker()将maker角色设置为MoneyMaker合约地址,任何人调用MoneyMaker.makeMoney()向合约中打入不少于一个以太都会得到双倍以太的回报;
4.?Bob收到消息,了解到MoneyMaker合约的存在,他看了MoneyMaker(A)和Vault(B)合约的代码并检查了Vault(B)合约中的余额发现逻辑确实如Evil说的那样,他在没有检查MoneyMaker(A)部署交易的情况下就相信了Evil;
5.?Bob调用MoneyMaker.makeMoney()向合约中打入自己全部身家20ETH,在他满怀期待等着收到Vault(B)打来的40ETH时等来的却是一句"Haha,youretherismine!"。
咋回事呢?其实这个局非常简单但是很常见。Evil在部署MoneyMaker合约时传入的并不是Vault合约的地址,而是传入了Hack合约的地址。所以当Bob调用MoneyMaker.makeMoney()时并不会像他想像中的那样MoneyMaker.makeMoney()去调用Vault.transfer()回打给他双倍的以太,而是调用了Hack.transfer()抛出了一个事件:"Haha,youretherismine!"。最后Evil调用Vault.withrow()将Vault合约中的100ETH转出,并通过Hack.withrow()将Bob转入的20ETH转出。
预防建议
以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的话术,交易记录不会造假,只有自己验证了对应的那笔交易后才能相信对方说的话是对的。
注:本文参考自《SoliditybyExample》https://solidity-by-example.org/hacks/randomness
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。