flash loan之所以能在一次交易中完成各种资产交易,实际上是通过使用去中心化交易和贷款合同。
原题:浅析闪电贷款“实现”金融自由的原则
最近,各种关于通过闪贷攻击进行区块链套利的新闻都把闪贷推上了一个热门话题。2021年初,金融业受到了闪电贷款的冲击。我们看看这个交易,发现一个交易中有这么多的操作,这完全刷新了作者对区块链和智能合约的理解。我不禁想,为什么黑客一开始就可以向dydx借钱,把借来的虚拟货币抵押成复利,**一系列操作结束后再偿还给dydx。在此期间,发生了161次代币转让。这需要一杯茶。然而,事实上,闪电贷款攻击是如此不合理。
交易链接:
https://cn.ETHerscan.com/tx/0x6dc268706818d1e6503739950abc5ba2211fc6b451e54244da7b1e226b12e027
接下来,我们开始逐步分析智能合约交易如何完成借贷平台和中心化交换之间的所有操作。
智能合约存储在哪里
以以太坊的go语言客户端为例。以太坊客户端收到创建智能合约的交易后,使用哈希算法生成智能合约的合约地址,智能合约的代码和合约中的数据将存储在该地址下。智能合约将存储在与此地址对应的客户机数据库中,称为statedb。Statedb记录区块链上的所有地址(包括智能合约)余额、nonce、状态等信息。以太坊客户端可以通过合约地址将合约代码加载到内存中执行。**,数据将被持久化到leveldb并存储在以太坊客户端的磁盘上。通过statedb实现的这些接口(如下图所示),客户端可以通过getcode方法获取智能合约地址下对应的代码。
客户端完成块同步后,从以太坊Genesis块创建的所有帐户地址信息和智能合约地址信息都将同步到statedb。因此,一个合格的以太坊矿工客户端可以直接在本地加载所有合同代码,而无需通过网络和客户端进行调用。
如何实施智能合约
智能合约代码由以太坊客户端中名为EVM的虚拟机执行。以太坊虚拟机定义了各种操作指令,每条指令对应一个处理函数,以及该指令的成本。
以太坊智能合约根据指令的实际消耗量计算气体(燃料)。具有不同复杂性的指令所消耗的气体也不同。智能合约指令越复杂,消耗的汽油就越多。查看此交易,我们发现挖矿费高达3.37117716 ETH,消耗天然气8644044,占区块产能的74.3%。梦中可以依靠闪电借来空手套的白狼朋友,还是先算算矿工费很重要。
如何在智能合约中调用另一个智能合约
在智能合约中,我们调用另一个合约的代码,它将被编译成一个名为call的EVM虚拟机指令。其基本瓦斯费为40瓦斯,实际挖矿费按另一合同执行指令收取。
通过opcall的实现,我们发现通过EVM虚拟机的call方法调用另一个智能合约与当前的智能合约是相同的。
因此,我们可以发现,实际上,智能合约的执行和智能合约之间的调用都是在矿工客户机上执行的,没有跨客户机和网络调用。事务失败也会在矿工的客户机上回滚。因此,闪电贷款攻击可以很快完成事务中的所有操作。
如果智能合约的某一步失败了会发生什么
Statedb提供了两种方法:snapshot和reverttosnapshot。一个用于获取statedb的快照,另一个用于还原快照。在执行事务之前,statedb将调用snapshot方法来获取快照。如果在事务执行期间发现错误,它将调用reverttosnapshot进行回滚。因此,闪电贷款攻击是可以实现的。如果任何一步都出现了错误,就如同从未向贷款平台借款一样。在执行事务之前,所有状态都会回滚到。当然,当交易失败时消耗的挖矿费仍然是可以获得的。
总结
闪电贷之所以能在一次交易中完成各种虚拟资产交易,实际上是通过调用去中心化交易所和各种去中心化借贷平台的智能合约。这些调用只需要在本地客户端中完成。事务将在接收事务广播的所有合格以太坊客户端中执行。谁先完成执行并将其打包到下一个区块,谁将赢得挖矿费。
文章标题:闪贷智能合约执行原理的技术分析
文章链接:https://www.btchangqing.cn/218217.html
更新时间:2021年03月25日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。