1

闪电贷技术详解(3)

 1 year ago
source link: https://www.tuoniaox.com/news/p-537239.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

摘要:

闪电贷相关项目协议分析

熊市就像一块试金石,Defi的各核心业态,哪些能够穿越周期,更好的发展?在周期中又暴露了哪些问题,值得后来者借鉴?SharkTeam合约安全系列课程之【DeFi安全】和您一起讨论和深入。第二课【闪电贷技术详解】。

文章较长,分为3个部分,这是第3部分:

1.闪电贷原理和应用场景;

2.闪电贷合约实现和风险防范。

3.闪电贷相关项目协议分析。

image.png

1 闪电贷项目分析

这里主要分析3个典型的实现了闪电贷的项目:

1. Uniswap:典型的去中心化交易所(DEX)项目,支持闪电兑换业务

2. Aave:典型的借贷协议,支持闪电贷业务

3. dYdX:针对专业交易者的去中心化交易所,与Uniswap属于不同的类型,闪电贷是其隐藏的功能

1.1 Uniswap

Uniswap是 DeFi 中最受欢迎的去中心化交易所之一。Uniswap 包含 V2 和 V3 两个版本,V2 版带来了一个新的功能,叫做 Flashswap,即闪电兑。Flashswap 本质上是 Uniswap 对闪电贷的称呼。

在 Uniswap 上,当你想在他们的平台上购买 token:

l 首先,你要发送一些 token 用于支付

l 然后调用一个 swap()的函数,它将发送你刚刚购买的 token。

重要的是,你可以“忘记”发送给你的支付 token,先收到你购买的 token 再付款。 一旦你收到了这些 token,你就可以以任意使用它们。例如,你可以用它们在 Uniswap 或者其他 DeFi 协议上做一些套利。

而在你套利之后,你必须把支付 token 最后发给 Uniswap。如果你不这样做,整个交易就会失败。

UniswapV2 闪电贷优缺点

l token 的选择很多;

l 可以直接借 eth,而不是 weth;

l 你可以使用 Uniswap 闪电贷 在 Uniswap 上交易;

l 可供闪电贷的资产选择非常多,你可以从众多的 Uniswap 交易对中选择一个;

l 闪电贷还款时,可以还同种代币,也可以还交易对中的另一种代币。

l 每次使用 Uniswap 的 闪电贷都要收取 0.3% 的费用。需要说明的是,这不是使用闪电贷的额外费用。这是你在 Uniswap 上进行每笔交易的常规费用。

UniswapV2 闪电贷原理与合约

UniswapV2 闪电贷原理如下:

1. 闪电贷执行前,对于交易对 token0/token1,满足以下条件:

image.png

2. 闪电贷执行:乐观转账

image.png

3. 闪电贷执行:获得闪电贷转账后调用 uniswapV2Call 函数,执行业务逻辑,包括还款(借款+手续费),还款后的余额 balance0'' 和 balance1'' :

image.png

4. 恒定乘积检查:

image.png

相信没有人会还两种代币,既是因为手续费的原因,更是使用闪电贷的实际业务的需求。

另外,这里的手续费指的是代币兑换时的费用,收取兑换代币的 0.3%,并不是专为闪电贷设置的手续费。

5. 更新状态:使用当前balance更新reserve,即更新 k 值,同时更新交易对代币的价格。

UniswapV2 闪电贷合约如下:

image.png

1.2 Aave

Aave是一个借贷协议。你可以在他们的平台上借入和借出 token。在 2020 年初,他们想出了“闪电贷”的点子,最终他们以“闪电贷”闻名,尽管这并不是他们的主要产品。

Aave 闪电贷优缺点

l 很多类型的 token 可以选择;

l 可以直接借用 ETH,而不是 WETH;

l 代码很容易集成,因为他们有很好的文档,甚至还有一个Truffle box,你可以使用 Truffle 模板快速创建自己的 flash-loan

l Aave 对每笔闪电贷收取 0.09%的费用,闪电贷代币数量越大,手续费越多

l 闪电贷还款时必须还同种代币。

AaveV1 闪电贷原理与实现

实现原理如下:

1. 检查闪电贷的代币数量,必须大于0且不能超过矿池中的总储备量。

2. 计算手续费和协议费,并检查手续费以及协议费必须大于0,注意协议费是手续费中的一部分

3. 闪电贷乐观转账,将代币从矿池中转入接受合约地址

4. 执行接受合约中的自定义业务函数 excuteOperation,并在该函数的最后进行还款(闪电贷+手续费)

5. 检查还款(闪电贷+手续费),还款代币要与借款代币相同

6. 更新状态并转移手续费和协议费

合约实现如下:

image.png

IFlashLoanReceiver 代码如下:

image.png

FlashLoanReceiverBase 代码如下:

image.png

AaveV2 闪电贷原理与实现

Aave V2 版本的闪电贷与V1版本的闪电贷有所不同,V2版本的闪电贷在V1版本基本业务基础上增加了不还款时开立债务的功能,此外还实现了批量资产的闪电贷。V2 版本实现原理如下:

1. 参数检查,检查批量借贷传入的参数中资产数组与数量数组长度是否一致

2. 循环执行闪电贷乐观转账并计算每一种代币的手续费

3. 执行自定义业务函数 excuteOperation,并检查返回值。其中不包含还款业务,但需要代币授权

4. 循环遍历每一种闪电贷代币,根据利率模式,闪电贷还款(闪电贷+手续费),还款(转账)失败则交易回退;或者不还款,检查抵押物后开立一个新的债务仓位,若抵押物不足,则回滚。

5. 触发 FlashLoan 事件

AaveV2 闪电贷合约如下:

image.png
image.png

AaveV3 闪电贷原理与实现

Aave V3版本的闪电贷兼容了前两个版本的特性,包含了2个闪电贷接口,即单一资产闪电贷接口 flashLoanSimple 以及批量资产闪电贷接口 flashLoan。

flashLoanSimple

实现原理类似于V1,如下:

1. 检查储备池的配置

2. 计算手续费

3. 闪电贷乐观转账

4. 执行自定义业务函数,不包括还款,但包括还款前的授权批准

5. 闪电贷还款,还款失败则回退

6. 触发 FlashLoan 事件

合约实现如下:

image.png

其中,executeFlashLoanSimple 函数如下:

image.png
image.png
image.png

flashLoan

image.png

其中,executeFlashLoan 函数如下:

image.png
image.png

1.3 dYdX

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个步骤:

l 首先,通过提款 Withdraw 行为,你可以提现很多代币,可以超出你余额中的代币。

l 然后,通过调用 Call 行为,你可以在以太坊公链上进行套利,调用任何你想要的 DeFi 协议。 比如 Uniswap、Kyber 等等。

l 最后,通过存款 Deposit 行为,偿还你借的地阿比,闪电贷就完成了。

dYdX 闪电贷优缺点

l dYdX 闪电贷手续费跟闪电贷的代币数量无关,而且近乎于无(仅2 wei),相比与Aave 0.09% 以及 Uniswap 0.3% 的手续费,这是dYdX最大的优势,尤其是闪电贷的金额越大,该优势越大。

l 你可以用闪电贷的资金对 dYdX 本身进行套利,也可以对其他协议进行套利。

l 在一笔交易内可以闪电贷不只一种代币,最多可以在一笔交易内闪电贷dYdX支持的全部类型的代币

l token 的种类不多(ETH/USDC/DAI)。

l 你不能直接借 ETH,只能借 WETH,操作起来不太方便。

l 代码可读性较低,集成起来比较复杂,他们也没有足够详细的文档,这点是为了隐藏他们的闪电贷。

l 闪电贷还款时需要还同种代币,不能还其他类型的代币。

dYdX闪电贷原理与实现

实现原理如下:

1. 提款 Withdraw(借贷):从 dYdX 市场中提取指定数量的代币到自定义业务合约中

2. 调用 Call(自定义业务):调用自定义业务合约中的函数,将提取的代币用于dYdX或其他协议实现套利

3. 存款 Deposit(还贷):将自定义业务合约中的代币存入dYdX市场,即还贷。

合约实现如下:

SoloMargin 合约中的 operate 函数如下:

image.png

OperationImpl 库中的 operate 函数如下:

image.png

_runActions 函数如下:

image.png

_withdraw 函数如下:

image.png

_call 函数如下:

image.png

_deposit 函数如下:

image.png

更多的请参考dydx源代码:https://github.com/dydxprotocol/solo 

实现闪电贷需要调用operate函数,重要的是如何在自定义合约中构造operate的参数, 从而在执行operate函数时实现闪电贷业务。相关参数结构如下:

image.png

其它函数请参考dYdX代码库:https://github.com/dydxprotocol/solo

以下是一个构造 operate 函数参数的示例:

image.png
image.png

 

关于我们:SharkTeam的愿景是全面保护Web3世界的安全。团队成员分布在北京、南京、苏州、硅谷,由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约的底层理论,提供包括智能合约审计、链上分析、应急响应等服务。已与区块链生态系统各个领域的关键参与者,如Huobi Global、OKC、polygon、Polkadot、imToken、ChainIDE等建立长期合作关系。

Web:https://www.sharkteam.org

Telegram:https://t.me/sharkteamorg

Twitter:https://twitter.com/sharkteamorg

Reddit:https://www.reddit.com/r/sharkteamorg

更多区块链安全咨询与分析,点击下方链接查看

D查查|链上风险核查 https://m.chainaegis.com


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK