原文标题:《闪电贷,秒速「实现」财务自由的原理分析》 最近各种通过闪电贷攻击在区块链中套利的新闻将闪电贷(Flash Loans)送上了热门话题,2021 年初,Yearn Finance 受到闪电贷款攻击,我们查看这个交易,发现一笔交易中,居然有如此多的骚操作,完全刷新了笔者对区块链和智能合约的认识。不禁开始思考,为什么黑客一开始可以从 dYdX 借款,又将借到的虚拟货币抵押到 Compound,最后一系列操作完成后还款到 dYdX,这期间发生了 161 次代币转移,这怎么的也要一杯茶的时间吧。然而事实上,闪电贷攻击快得就是这么不讲道理。 这笔交易的链接: 接下来我们开始一步一步的分析,一笔智能合约交易是如何完成在借贷平台和中心化交易所之间的所有操作。 智能合约究竟存储在哪里这里用以太坊的 go 语言客户端为例,以太坊客户端在收到创建智能合约的交易以后,会使用 Hash 算法为智能合约生成一个合约地址,在这个合约地址下存储智能合约的代码与合约中的数据。智能合约会被存储在客户端的数据库中与这个地址对应,这个数据库叫做 StateDB。StateDB 记录了区块链上所有的地址(包含智能合约)余额、Nonce、状态等信息。以太坊客户端可以通过合约地址,将合约的代码加载到内存中进行执行。最终这些数据会被持久化到 LevelDB 中,存储在以太坊客户端的磁盘上。通过 StateDB 实现的这些接口(如下图),客户端通过 GetCode 这个方法,可以获取到智能合约地址下对应的代码。 客户端完成区块同步后,从以太坊创世块开始创建的所有账户地址信息与智能合约地址信息都会同步到这个 StateDB 中,因此一个合格的以太坊矿工客户端可以直接在本地加载所有的合约代码,是不需要跨网络和客户端进行调用的。 智能合约如何执行智能合约代码是通过以太坊客户端内部的一个叫作 EVM 的虚拟机进行执行的,以太坊的虚拟机定义了各种的操作指令,每一个指令对应了一个处理函数,以及这个指令需要消耗的矿工费。 以太坊智能合约是按照实际指令执行的消耗来计算 gas (燃料)的,不同复杂度的指令消耗的 gas 也有差别,越复杂的智能合约指令,消耗的 gas 越多。查看这笔交易,我们发现矿工费高达 3.37117716 ETH,消耗了 8644044 gas,占据一个区块容量的 74.3%。梦想着可以靠闪电贷空手套白狼的朋友们,还是先算一算矿工费要紧。 (责任编辑:admin) |