假如给你一个亿贷款,但是3秒钟你就必须还回去,你会拿他来做什么?
闪电贷是一种无抵押借贷工具,由于区块链交易的原子性和回滚特性得以诞生。用户需要在一个原子交易内完成借款和还款并且不需要任何抵押品。让用户拥有在接近0成本情况下使用巨量资金的能力。
在大众的认知下,大量的闪电贷被用于攻击各种项目,并被冠以闪电贷攻击的标签。事实上,闪电贷技术并不是用来进行项目攻击。恰恰相反,它是区块链世界一项伟大的金融创新。它让人们拥有了对于大量资金的控制能力,而真正有问题的是它本身各种协议自身的实现缺陷,被不法分子加以利用。
在实际的用途中,闪电贷还有着在借贷市场自我清算、在更换抵押物、债务迁移等用例。协议只关心你是否在你的transaction的最后是否如约归还了你的贷款,而不关心这笔贷款在你的transaction的用途是什么。因此,闪电贷只是一种能力。
DODO是一个由主动做市商(PMM)算法驱动的去中心化交易平台。在用户将流动性聚合到平台时,其提供了去中心化的闪电贷服务。具体而言,我们可以使用闪电贷调用DODO的资金,在使用后注意在操作的最后归还即可,否则这笔原子交易将会判定为失败,之前的所有操作被判定无效,不发生实际价值
如何在DODO借100个BNB并归还,示例代码如下
在remix编译如下代码:
链接ganache-cli
3.在fork链上部署合约代码并调用dodoFlashLoan方法
4.通过报错报出本地址的WBNB的amount,证明回调了DVMFlashLoanCall/DPPFlashLoanCall/DSPFlashLoanCall方法且代币已转发到了本地址。
如何在pancake-dex借100个BNB并归还,示例代码如下
在remix编译如下代码:
2.链接ganache-cli
3.在fork的私链上部署闪电贷合约,并调用startSwap方法执行闪电贷
4.通过报错报出本地址的WBNB的amount,证明回调了pancakeCall方法且代币已转发到了本地址。
在区块链世界中,一个调用的顺序执行会成为一笔交易,这样的一笔交易具有原子性。最通俗而言若发生异常(EVM操作码REVERT)那么这笔调用会执行失败,前面所有的操作均处于未执行的状态;
我们将其在DODO中观察,其在回调DVMFlashLoanCall/DPPFlashLoanCall/DSPFlashLoanCall完成后,返回到上一级函数flashloan并通过require检查是否自己的余额没有减少,否则主动抛出REVERT:
同样的,对pancake而言,其swap回调pancakeCall后也检测了余额和储备的关系,同时swap也是交换的核心函数,这也是笔者认为该协议设计的神来之笔(设计取自Uniswap)
本文中我们讲述了闪电贷的价值和具体实例,结合函数报错我们将借来的WBNB进行了显示,证明了WBNB已在该步骤发送到了执行合约。在借来贷款的后续步骤用户可具体利用该WBNB用于相应的套利/自我清算/更换抵押物/债务迁移并在最后进行归还。否则在回调完成回到上级函数时在检查闪贷池子余额时将会主动回滚,由于函数调用的原子性,若回滚后这些所有借取操作将不复存在。
来源:金色财经