最近各种通过闪电贷攻击在区块链中套利的新闻将闪电贷送上了热门话题,2021年初,YearnFinance受到闪电贷款攻击,我们查看这个交易,发现一笔交易中,居然有如此多的骚操作,完全刷新了笔者对区块链和智能合约的认识。不禁开始思考,为什么黑客一开始可以从dYdX借款,又将借到的虚拟货币抵押到Compound,最后一系列操作完成后还款到dYdX,这期间发生了161次代币转移,这怎么的也要一杯茶的时间吧。然而事实上,闪电贷攻击快得就是这么不讲道理。这笔交易的链接:https://cn.etherscan.com/tx/0x6dc268706818d1e6503739950abc5ba2211fc6b451e54244da7b1e226b12e027接下来我们开始一步一步的分析,一笔智能合约交易是如何完成在借贷平台和中心化交易所之间的所有操作。智能合约究竟存储在哪里
PeckShield:Cellframe Network疑遭闪电贷攻击,攻击者或获利245枚BNB:6月1日消息,PeckShield监测显示,基于分片架构的区块链网络 Cellframe Network 疑似遭遇闪电贷攻击,链上数据显示,攻击者或获利 245 枚 BNB(约 7.4 万美元),代币 CELL 已下跌逾 65%。[2023/6/1 11:51:37]
这里用以太坊的go语言客户端为例,以太坊客户端在收到创建智能合约的交易以后,会使用Hash算法为智能合约生成一个合约地址,在这个合约地址下存储智能合约的代码与合约中的数据。智能合约会被存储在客户端的数据库中与这个地址对应,这个数据库叫做StateDB。StateDB记录了区块链上所有的地址余额、Nonce、状态等信息。以太坊客户端可以通过合约地址,将合约的代码加载到内存中进行执行。最终这些数据会被持久化到LevelDB中,存储在以太坊客户端的磁盘上。通过StateDB实现的这些接口,客户端通过GetCode这个方法,可以获取到智能合约地址下对应的代码。
安全团队:WEEB遭受闪电贷攻击,黑客获利约16ETH:金色财经报道,据区块链安全审计公司Beosin旗下Beosin EagleEye安全风险监控、预警与阻断平台监测显示,WEEB项目遭受价格操控攻击(0xcb58fb952914896b35d909136b9f719b71fc8bc60b59853459fc2476d4369c3a),黑客利用WEEB代币中的performUpkeep函数,将pair中大量WEEB代币的余额烧毁,从而提高WEEB价格,获利16ETH。目前资金仍在黑客地址中(0xe9ba23db4cab47621d72b7a51ef166992a025b16),Beosin Trace将持续对资金流向进行监控。[2023/5/10 14:53:59]
BSC链上DeFi协议xWin发布闪电贷攻击总结,共计损失1007枚BNB:官方消息,BSC链上DeFi协议xWin发布此次遭遇闪电贷攻击的总结,BSC链上区块编号为8589726和8589740。据介绍,xWIN协议中有4种方式可获得xWIN代币奖励:xWIN推荐系统、xWIN奖励系统、xWIN资金库所有者/经理奖励系统、以及xWIN资金库代币挖矿和质押。xWin团队决定终止推荐费系统、奖励费系统、经历奖励费系统。此前推荐地址中累积的所有奖励费和推荐费仍然可以提取。
此前消息,PeckShield派盾预警显示,BSC链上DeFi协议xWin遭到闪电贷攻击。[2021/6/27 0:09:41]
客户端完成区块同步后,从以太坊创世块开始创建的所有账户地址信息与智能合约地址信息都会同步到这个StateDB中,因此一个合格的以太坊矿工客户端可以直接在本地加载所有的合约代码,是不需要跨网络和客户端进行调用的。智能合约如何执行
慢雾:yearn攻击者利用闪电贷通过若干步骤完成获利:2021年02月05日,据慢雾区情报,知名的链上机池yearnfinance的DAI策略池遭受攻击,慢雾安全团队第一时间跟进分析,并以简讯的形式给大家分享细节,供大家参考:
1.攻击者首先从dYdX和AAVE中使用闪电贷借出大量的ETH;
2.攻击者使用从第一步借出的ETH在Compound中借出DAI和USDC;
3.攻击者将第二部中的所有USDC和大部分的DAI存入到CurveDAI/USDC/USDT池中,这个时候由于攻击者存入流动性巨大,其实已经控制CruveDAI/USDC/USDT的大部分流动性;
4.攻击者从Curve池中取出一定量的USDT,使DAI/USDT/USDC的比例失衡,及DAI/(USDT&USDC)贬值;
5.攻击者第三步将剩余的DAI充值进yearnDAI策略池中,接着调用yearnDAI策略池的earn函数,将充值的DAI以失衡的比例转入CurveDAI/USDT/USDC池中,同时yearnDAI策略池将获得一定量的3CRV代币;
6.攻击者将第4步取走的USDT重新存入CurveDAI/USDT/USDC池中,使DAI/USDT/USDC的比例恢复;
7.攻击者触发yearnDAI策略池的withdraw函数,由于yearnDAI策略池存入时用的是失衡的比例,现在使用正常的比例体现,DAI在池中的占比提升,导致同等数量的3CRV代币能取回的DAI的数量会变少。这部分少取回的代币留在了CurveDAI/USDC/USDT池中;
8.由于第三步中攻击者已经持有了CurveDAI/USDC/USDT池中大部分的流动性,导致yearnDAI策略池未能取回的DAI将大部分分给了攻击者9.重复上述3-8步骤5次,并归还闪电贷,完成获利。参考攻击交易见原文链接。[2021/2/5 18:58:47]
智能合约代码是通过以太坊客户端内部的一个叫作EVM的虚拟机进行执行的,以太坊的虚拟机定义了各种的操作指令,每一个指令对应了一个处理函数,以及这个指令需要消耗的矿工费。
以太坊智能合约是按照实际指令执行的消耗来计算gas的,不同复杂度的指令消耗的gas也有差别,越复杂的智能合约指令,消耗的gas越多。查看这笔交易,我们发现矿工费高达3**.**37117716ETH,消耗了8644044gas,占据一个区块容量的74.3%。梦想着可以靠闪电贷空手套白狼的朋友们,还是先算一算矿工费要紧。智能合约中是如何调用另一个智能合约的
在智能合约中,我们调用另一个合约的代码,最终会被编译成一个叫作CALL的EVM虚拟机指令,它的基础gas费用是40gas,实际产生的矿工费根据另一个合约执行的指令来计费。
查看opCall这个方法的实现,发现,调用另一个智能合约与当前智能合约同样都是通过EVM虚拟机的Call方法完成的。
因此,我们可以发现,其实智能合约的执行,以及智能合约之间的调用,都是在矿工的客户端执行的,并没有进行跨客户端与网络调用,交易失败也是在矿工的客户端进行回滚,因此闪电贷攻击才可以如此快的在一笔交易中完成所有的操作。智能合约某一步执行失败会怎么样
StateDB提供了两个方法,分别是Snapshot与RevertToSnapshot,一个用于对StateDB进行快照,另一个用于恢复快照。在执行交易前,StateDB会调用Snapshot方法进行快照,如果交易执行到某一步发现错误,则会调用RevertToSnapshot进行回滚。因此闪电贷攻击可以实现如果在任何一步出现错误,就当从来没有从借贷平台借过一样,所有状态回滚到交易执行之前,当然交易失败时消耗的矿工费还是得出。
总结
闪电贷之所以能够在一笔交易中完成各种虚拟资产的交易,实际上都是通过调用去中心化交易所和各种去中心化借贷平台的智能合约来完成的,这些调用只需要在矿工客户端本地即可完成。这笔交易会在收到交易广播的所有具备打包资格的以太坊客户端中执行,谁先执行完成,并打包到下一个区块中,谁就能赢得这笔矿工费。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。