熊市就像一块试金石,Defi的各核心业态,哪些能够穿越周期,更好的发展?在周期中又暴露了哪些问题,值得后来者借鉴?SharkTeam合约安全系列课程之【DeFi安全】和您一起讨论和深入。第二课【闪电贷技术详解】。
文章较长,分为3个部分,这是第3部分:
1.闪电贷原理和应用场景;
2.闪电贷合约实现和风险防范。
3.闪电贷相关项目协议分析。
这里主要分析3个典型的实现了闪电贷的项目:
Uniswap是 DeFi 中最受欢迎的去中心化交易所之一。Uniswap 包含 V2 和 V3 两个版本,V2 版带来了一个新的功能,叫做 Flashswap,即闪电兑。Flashswap 本质上是 Uniswap 对闪电贷的称呼。
在 Uniswap 上,当你想在他们的平台上购买 token:
重要的是,你可以“忘记”发送给你的支付 token,先收到你购买的 token 再付款。 一旦你收到了这些 token,你就可以以任意使用它们。例如,你可以用它们在 Uniswap 或者其他 DeFi 协议上做一些套利。
而在你套利之后,你必须把支付 token 最后发给 Uniswap。如果你不这样做,整个交易就会失败。
优点:
缺点:
UniswapV2 闪电贷原理如下:
UniswapV2 闪电贷合约如下:
Aave是一个借贷协议。你可以在他们的平台上借入和借出 token。在 2020 年初,他们想出了“闪电贷”的点子,最终他们以“闪电贷”闻名,尽管这并不是他们的主要产品。
优点:
缺点:
AaveV1 闪电贷原理与实现
实现原理如下:
合约实现如下:
IFlashLoanReceiver 代码如下:
FlashLoanReceiverBase 代码如下:
Aave V2 版本的闪电贷与V1版本的闪电贷有所不同,V2版本的闪电贷在V1版本基本业务基础上增加了不还款时开立债务的功能,此外还实现了批量资产的闪电贷。V2 版本实现原理如下:
AaveV2 闪电贷合约如下:
Aave V3版本的闪电贷兼容了前两个版本的特性,包含了2个闪电贷接口,即单一资产闪电贷接口 flashLoanSimple 以及批量资产闪电贷接口 flashLoan。
实现原理类似于V1,如下:
合约实现如下:
其中,executeFlashLoanSimple 函数如下:
其中,executeFlashLoan 函数如下:
dYdX 是一个去中心化衍生品协议,也是一个针对专业交易者的去中心化交易所。它有一些先进的功能,如保证金交易和合成资产,可以跟踪其他资产的表现,如比特币。dYdX 还提供闪电贷款,但这是一个有点隐藏的功能。
首先,我们需要了解 dYdX 是如何工作的。在大多数去中心化交易所的智能合约中,它们的 Solidity 代码中都有不同的切入点或功能,用于你的各种操作。
例如,有一些功能,如存款、提款、购买等。
这就带来了一个问题,交易者必须发送几笔交易才能进行一次交易,这就需要花费更多的手续费。
我们可以用所谓的元交易来解决这个问题。使用元交易,你可以在一个交易中执行多个交易。
dYdX 内置了元交易功能。通过 dYdX,只需要一个入口就可以与智能合约进行交互。所以无论你想做哪种操作,买入、卖出、存入 token,你总是调用同一个 Solidity 函数。在dYdX中,该函数即SoloMargin合约中的operate函数。当你调用这个函数时,你将定义一组你想要执行的行为(Action)。dYdX共支持9种行为,即存款 Deposit、提款 Withdraw、转账 Transfer、交易 Trade、购买 Buy、出售 Sell、清算 Liquidate、汽化 Vaporize、调用 Call。通过operate函数执行一组行为时,在执行前和执行后对状态做检查和校验,对于执行的多个行为的中间结果不会进行检查和校验。因此,通过operate函数,可以先进性提款,后进行存款,保证执行前后的状态可以通过校验。如果再加上调用行为,构成 “提款 – 调用 – 存款 ” 的执行行为,则可以实现闪电贷的业务功能。
因此,在dYdX上进行闪电贷需要3个步骤:
dYdX 闪电贷优缺点
优点:
缺点:
实现原理如下:
合约实现如下:
SoloMargin 合约中的 operate 函数如下:
OperationImpl 库中的 operate 函数如下:
_runActions 函数如下:
_withdraw 函数如下:
_call 函数如下:
_deposit 函数如下:
更多的请参考dydx源代码:https://github.com/dydxprotocol/solo
实现闪电贷需要调用operate函数,重要的是如何在自定义合约中构造operate的参数, 从而在执行operate函数时实现闪电贷业务。相关参数结构如下:
其它函数请参考dYdX代码库:https://github.com/dydxprotocol/solo
以下是一个构造 operate 函数参数的示例:
关于我们:SharkTeam的愿景是全面保护Web3世界的安全。团队成员分布在北京、南京、苏州、硅谷,由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约的底层理论,提供包括智能合约审计、链上分析、应急响应等服务。已与区块链生态系统各个领域的关键参与者,如Huobi Global、OKC、polygon、Polkadot、imToken、ChainIDE等建立长期合作关系。
Telegram:https://t.me/sharkteamorg
Twitter:https://twitter.com/sharkteamorg
Reddit:https://www.reddit.com/r/sharkteamorg
更多区块链安全咨询与分析,点击下方链接查看
D查查|链上风险核查 https://m.chainaegis.com