比特币交易平台,比特币价格走势,区块链数字货币交易平台-比特币入门网

技术剖析闪电贷中智能合约实行原理

www.xuanrender.com

闪电贷之所以可以在一笔买卖中完成各种资产买卖,事实上是通过调用去中心化买卖和借贷合约来完成的。

原文标题:《闪电贷,秒速「达成」财务自由的原理剖析》

撰文:创宇区块链安全实验室

近期各种通过闪电贷攻击在区块链中套利的新闻将闪电贷(Flash Loans)送上了热点话题,2021 年初,Yearn Finance 遭到闪电贷款攻击,大家查询这个买卖,发现一笔买卖中,居然有这样多的骚操作,完全刷新了笔者对区块链和智能合约的认识。不禁开始考虑,为何黑客刚开始可以从 dYdX 借款,又将借到的数字货币抵押到 Compound,最后一系列操作完成后还款到 dYdX,这段时间发生了 161 次代币转移,这如何的也要一杯茶的时间吧。然而事实上,闪电贷攻击快得就是这么不讲道理。

智能合约怎么样实行

智能合约代码是通过ETH推广客户端内部的一个叫作 EVM 的虚拟机进行实行的,ETH的虚拟机概念了各种的操作指令,每个指令对应了一个处置函数,与这个指令需要消耗的矿工费。

ETH智能合约是根据实质指令实行的消耗来计算 gas (燃料)的,不同复杂度的指令消耗的 gas 也有差别,越复杂的智能合约指令,消耗的 gas 越多。查询这笔买卖,大家发现矿工费高达 3.37117716 以太币,消耗了 8644044 gas,占据一个区块容量的 74.3%。梦想着可以靠闪电贷空手套白狼的朋友们,还是先算一算矿工费要紧。

智能合约中是怎么样调用另一个智能合约的

在智能合约中,大家调用另一个合约的代码,最后会被编译成一个叫作 CALL 的 EVM 虚拟机指令,它的基础 gas 成本 是 40 gas,实质产生的矿工费依据另一个合约实行的指令来计费。

查询 opCall 这个办法的达成,发现,调用另一个智能合约与目前智能合约同样都是通过 EVM 虚拟机的 Call 办法完成的。

因此,大家可以发现,其实智能合约的实行,与智能合约之间的调用,都是在矿工的推广客户端实行的,并没进行跨推广客户端与互联网调用,买卖失败也是在矿工的推广客户端进行回滚,因此闪电贷攻击才可以这样快的在一笔买卖中完成所有些操作。

智能合约某一步实行失败会如何

StateDB 提供了两个办法,分别是 Snapshot 与 RevertToSnapshot,一个用于对 StateDB 进行网站快照,另一个用于恢复网站快照。在实行买卖前,StateDB 会调用 Snapshot 办法进行网站快照,假如买卖实行到某一步发现错误,则会调用 RevertToSnapshot 进行回滚。因此闪电贷攻击可以达成假如在任何一步出现错误,就当从来没从借贷平台借过一样,所有状况回滚到买卖实行之前,当然买卖失败时消耗的矿工费还是得出。

这笔买卖的链接:

下面大家开始一步一步的剖析,一笔智能合约买卖是怎么样完成在借贷平台和中心化交易平台之间的所有操作。

概要

闪电贷之所以可以在一笔买卖中完成各种虚拟资产的买卖,事实上都是通过调用去中心化交易平台和各种去中心化借贷平台的智能合约来完成的,这部分调用仅需在矿工推广客户端当地即可完成。这笔买卖会在收到买卖广播的所有拥有打包资格的ETH推广客户端中实行,哪个先实行完成,并打包到下一个区块中,哪个就能取得这笔矿工费。

智能合约到底存储在哪儿

这里用ETH的 go 语言推广客户端为例,ETH推广客户端在收到创建智能合约的买卖将来,会用 Hash 算法为智能合约生成一个合约地址,在这个合约地址下存储智能合约的代码与合约中的数据。智能合约会被存储在推广客户端的数据库中与这个地址对应,这个数据库叫做 StateDB。StateDB 记录了区块链上所有些地址(包含智能合约)余额、Nonce、状况等信息。ETH推广客户端可以通过合约地址,将合约的代码加载到内存中进行实行。最后这部分数据会被持久化到 LevelDB 中,存储在ETH推广客户端的磁盘上。通过 StateDB 达成的这部分接口(如下图),推广客户端通过 GetCode 这个办法,可以获得到智能合约地址下对应的代码。

推广客户端完成区块同步后,从ETH创世块开始创建的所有竞价推广账户地址信息与智能合约地址信息都会同步到这个 StateDB 中,因此一个合格的ETH矿工推广客户端可以直接在当地加载所有些合约代码,是无需跨互联网和推广客户端进行调用的。

标签:ETH(12)以太坊(27)区块链(13)