闪电贷攻击全解析:一笔交易如何完成 161 次代币转移?
最近,随着多起闪电贷(Flash Loan)套利与攻击事件的发生,这一概念再次成为区块链领域的热门话题。早在 2021 年初,Yearn Finance 就曾遭遇闪电贷攻击。我们追踪其中一笔交易(交易详情),发现短短一笔链上操作,竟然涉及 161 次代币转移,刷新了人们对智能合约的认知。
问题来了:为什么黑客能够在几秒钟之内完成从 dYdX 借款、抵押至 Compound、再一系列操作后完成还款的全过程?答案就在以太坊智能合约的底层机制中。
智能合约存储在哪里?
以太坊上的智能合约并不是存在某个“服务器”上,而是写入到区块链的 状态数据库(StateDB) 中。
-
当用户创建一个合约时,以太坊客户端会为其分配唯一的合约地址;
-
合约的代码和数据会被存储在本地的 StateDB 中,并最终持久化到 LevelDB;
-
任何以太坊节点都可以通过合约地址加载代码到内存,并由虚拟机执行。
这意味着矿工本地就能完整运行合约逻辑,无需跨网络请求,从而保证了执行的高速与确定性。
智能合约是如何执行的?
以太坊使用 EVM(Ethereum Virtual Machine) 执行合约代码。EVM 定义了一系列指令,每个指令对应执行逻辑与消耗的 Gas。
-
合约复杂度越高,Gas 消耗越大;
-
在这笔闪电贷攻击交易中,Gas 消耗高达 8,644,044,约占一个区块容量的 74.3%;
-
黑客为此支付了 3.37 ETH 的矿工费。
这也是为什么闪电贷虽然看似“零成本借钱”,但实际上背后仍有高额矿工费需要承担。
合约之间如何相互调用?
合约调用另一个合约,最终会被编译为 CALL 指令。
-
CALL 本身的基础费用为 40 Gas;
-
实际开销取决于被调用合约的执行复杂度;
-
所有调用过程都在矿工本地客户端中完成,不需要跨客户端网络交互。
因此,一笔闪电贷攻击交易能在同一客户端内快速完成“借款、抵押、兑换、还款”等连续动作。
如果合约执行失败会怎样?
以太坊为合约执行提供了 快照与回滚机制:
-
在执行前,客户端会调用 Snapshot 保存当前状态;
-
若执行中途出错,则调用 RevertToSnapshot 回滚到原状态;
-
即便交易失败,Gas 费用依旧会被扣除。
这就是闪电贷攻击能够“零风险试错”的原因——失败了也只是损失矿工费,而不会背上债务。
总结
闪电贷攻击的本质,是利用了 EVM 高速执行 + 合约调用链条 + 状态回滚机制,在一笔交易中完成复杂的套利与攻击操作。
-
所有操作均在矿工客户端本地完成,无需跨网络调用;
-
成功与否取决于交易能否率先被打包进区块;
-
尽管表面上“零抵押借贷”,但背后依旧需要高昂的 Gas 支出。
正因如此,闪电贷既成为了黑客的攻击利器,也被套利者视为“空手套白狼”的神器。未来,如何在智能合约设计中防御此类攻击,仍是 DeFi 领域亟待解决的核心问题。