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

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

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

2.闪电贷合约完成和危险防范。

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

1 闪电贷原理介绍

1.1 概念描述

闪电贷望文生义,便是在极短的时间内(一个区块时间或许一笔买卖内)完结告贷与还款的操作。

在DeFi领域,闪电贷为金融业务供给了免典当告贷服务,是DeFi世界的一款利器。

闪电贷的概念最早是由Marble协议提出来的,并由Aave、dYdX、Uniswap等协议进行了普及,第一笔闪电贷操作来自于Aave协议。

1.2 规划原理

闪电贷是经过智能合约的原子性,来完结零危险告贷的业务,因此闪电贷业务只能由智能合约来完成。

简单来讲,便是在一个区块买卖中,一起完结告贷和还款操作这两个操作,无需典当任何财物,只需支付手续费即可。

用户在借到款之后,能够利用借到的财物进行其他操作,比如套利、归还典当告贷、自清算等操作。

然后在买卖完毕的时候,用户只要把借到的金钱及手续费及时归还就能够,否则该笔买卖就会回滚,就像什么也没有产生过相同。

什么是原子性?

这儿的原子性是指具有原子性的业务。该原子业务是不可分割的,在业务履行完毕之前,不会被任何其他操作所中止。而该业务中的一切操作,要么悉数被成功履行,要么悉数履行失利,不会呈现一部分成功而另一部分失利的状况。

以太坊的每个买卖都是具有原子性的,每笔以太坊买卖中,能够包括多个操作,例如:

l 向dYdX进行告贷、还款;

l 在Compound上供给ETH并借出DAI;

l 在Curve大将借出的DAI的一半换成USDC;

l 在Uniswap上为DAI/USDC池供给流动性等等。

一切这些操作都能够一起在一个买卖中完结,而其中只要有一个操作失利,则整笔买卖都会失利回滚,就像什么都没有产生相同。

单笔买卖只受Gas费用限制,以及以太坊区块容量的限制,所以理论上能够有成千上万个操作过程。

1.3 成功案例

首先,履行闪电贷最重要的是找到一个闪电贷供给商。

Aave或dYdX等项目开发了智能合约,答应DeFi用户从指定的池子中借到不同的币,前提条件是在同一个以太坊买卖内归还。

运用闪贷通常有固定的本钱。例如,Aave合约要求告贷人归还初始金额+0.09%的告贷金额。0.09%这笔费用将会分给存款人和集成商,前者给出了可供假贷的资金,后者为运用Aave的闪电贷API供给便利。这笔费用的一部分也会被换成AAVE代币。

闪电贷技术详解:Part 1

一旦从假贷池中借到金额,它就能够用于其他套利操作,只要在不同过程所处的区块链末端快速归还告贷。

因为告贷必须在一次买卖内归还,所以不存在告贷人不归还告贷的危险。唯一的危险便是一向存在的智能合约平和台危险。

1.4 闪电贷与闪电兑

闪电贷(Flash Loan)和闪电兑(Flash Swap)是区块链独有的概念。下表显现了两者之间的一些要害差异。

闪电贷技术详解:Part 1

闪电贷(Flash Loan)必须以你借入的同一财物归还:假如借入Dai,就需要归还Dai。生息协议Aave对闪电贷收取0.09%的费用。它至少需要进行三个操作:

1. 在Aave上告贷

2. 在一个DEX上进行兑换

3. 在另一个DEX上进行套利买卖以完成赢利,最后归还告贷以及闪电贷费用。

闪电兑(Flash Swap)答应买卖者在买卖后期支付(或返还)财物之前,先接收财物并在其他地方利用该财物。就像在Uniswap上所做的那样,闪电交换没有固定费用,而是收取交换费。与闪电贷比较,闪电兑换能够看作是“免费”告贷,因为兑换手续费是从买卖订单中扣除的,咱们不必单独付款。最后一点差异:咱们能够归还兑换的任何财物。假如咱们运用闪电兑换拿ETH买入Dai,那么用Dai或ETH归还都能够,这使咱们能够履行更杂乱的操作。

闪电兑换和闪电贷均选用达观转帐(Optimistic Tranfer),这是咱们稍后将介绍的一种迷人的技能。

1.5 达观转帐

闪电贷和闪电兑换均选用称为”达观转账“的技能。这个了不得的DeFi创新技能运用户能够进行无典当告贷或兑换买卖,只要用户在买卖完毕时还清告贷,就能够履行买卖。为了更好地了解这个想法,让咱们看一些代码。

1.5.1 闪电贷中的达观转账

这是Aave(V1)的LendingPool.sol合约的代码。让咱们注意flashLoan函数的完成,尤其是以下办法:

闪电贷技术详解:Part 1

在878行中,咱们能够看到智能合约“达观地”将资金搬运到用户的合约中 - 它并没有查看用户合约的余额以确保用户有足够的财物归还告贷,就直接转账了。

这怎么或许?莫非用户不会拿着这些代币逃跑?好吧,假如这是买卖的完毕,那么那将是一个严重的问题。可是正如你所看到的,代码还没有完毕。用户的合约是否保留这些代币取决于成功履行的接下来的几行。

达观转账后,在第881行,咱们看到Aave合约然后运用代币的达观余额(Optimistic Balance)和用户已传入的任何参数调用用户的合约。这些参数将是用户需要将其传递给其合约的任何东西。买卖成功履行。现在,买卖作业流程在Aave合约上暂时中止,并移至用户的合约持续履行,该合约将履行其逻辑并有望成功买卖。

在第884行,用户的合约代码已履行完结,作业流程现在回来到Aave合约,该合约运用require语句查看用户合约回来的值。达观精力到这儿就完毕了,现在咱们必须看看用户合约是否已经履行了有利可图的买卖!假如是这样,Aave合约将能够扣除其费用。假如买卖没有获利,则该require声明将失利,这意味着整个买卖都将失利,也意味着咱们之前的达观转账实际上并不会产生。

1.5.2 闪电兑中的达观转账

让咱们看一下 Uniswap 怎么完成其达观转账。这是从他们的 UniswapV2Pair.sol 合约中获得的,特别注意swap函数:

闪电贷技术详解:Part 1

达观转账产生在170-171行,便是这个_safeTransfer办法。Uniswap乃至给出了这种达观转账的注释,以便更好地辨认它(趁便说一下,Uniswap供给有关其协议合约的很多文档和教程)。下一行是Uniswap合约以达观余额调用用户的合约。

再次,假设业务作业流在Uniswap合约上暂停履行,并携带达观搬运的代币到用户合约持续履行。一旦履行完用户合约,买卖作业流就会回到Uniswap合约。然后,Uniswap合约分配用户合约的新余额,并测验收取兑换手续费(第180-181行)。

假如用户合约未能经过代币获利,则第182中的require声明将失利,而且整个买卖将回滚。这是达观转账的要害,即100%取决于买卖是否成功。假如不成功,则买卖无效,而且将康复为代币转让之前的状况。可是,假如成功,则能够保持达观转账,而且用户能够获利。

2 闪电贷运用场景

闪电贷最常见的运用案例有3种,即套利(Arbitrage)、替换典当品(Swapping Collateral)、自我清算(Self-Liquidation)。

闪电贷技术详解:Part 1

2.1 套利(Arbitrage)

套利,即闪电贷能够扩大成功套利的赢利。

让咱们幻想一下,Uniswap 和 Curve 之间的 DAI/USDC 池存在价格差异。你能够在 Curve 上用 1 个DAI 换取 1 个 USDC,但在 Uniswap 上您只需要 0.99 个 DAI 就能够买到 1 个 USDC。现在你能够测验履行以下套利:

1. 经过闪电贷向 Aave 借 100,000 DAI。

2. 在 Uniswap 大将 100,000 DAI 换成 USDC,收到 101,010 USDC。

3. 在 Curve 大将 101,010 USDC 换成 101,010 DAI

4. 归还初始 100,000 DAI + 0.09% Fees = 100,090 DAI

5. 赢利 101,010 DAI - 100,090 DAI = 920 DAI

在整个套利过程中,咱们必须考虑到以下几个因素:

闪电贷技术详解:Part 1

1. 网络费用(Network Fees):这儿的网络费用指的是区块链一致后将买卖写入区块链时所要支付的手续费(如以太坊中的Gas费)。多过程的套利买卖或许本钱不菲,在核算赢利时,一定要将手续费用考虑在内。

2. 价格滑点(Price Slippage): 一定要核算你在履行订单时将会遇到多少价格滑点(提示:这取决于买卖额的大小和流动性池的流动性)。

3. 抢先买卖(Frontrunning):很有或许他人会发现同样的时机,而且会设法抢先你一步行动。最重要的是,监控 mempool 的机器人能够发现你的盈利套利时机,并以更高的gas费发送相同的买卖把你的盈利时机“偷走”。

2.2 替换典当品(Swapping Collateral)

假设你用 ETH 作为典当品从 Compound 借了 DAI 。你能够经过以下方式将典当品从 ETH 换成例如 BAT :

1. 建议一笔闪电贷借出 DAI

2. 用借来的 DAI 归还 Compound 中的告贷

3. 提取你的 ETH

4. 在 Uniswap 大将你的 ETH 换成 BAT

5. 供给 BAT 作为 Compound 的典当品

6. 以你的 BAT 典当品借出 DAI

7. 用借来的 DAI + Fees 归还过程1的闪电贷

经过这样一轮操作,额定支付告贷金额的 0.09% 就能成功把你的典当品从 ETH 换成了 BAT

2.3 自我清算(Self-Liquidation)

幻想如下场景:

你在 Compound 上有一笔以 ETH 作为典当借出 DAI 的告贷。ETH 价格不断下跌,已经接近清算水平。你也没有或不想存入更多的 ETH 来下降你的清算水平,你也没有归还告贷所需的 DAI。现在,与其让 MakerDAO 合约清算你的典当品并向你收取清算费,不如采取以下过程:

1. 建议闪电贷,借出一笔 DAI,金额是你在 Compound 上的欠债

2. 归还 Compound 上的 DAI 告贷,提取 ETH

3. 将足够的 ETH 换成 DAI,以归还过程1的 闪电贷+费用

4. 拿住你剩下的 ETH

经过以上过程,就能够完成自我清算,避免了合约清算以及清算费用。

发表回复

您的电子邮箱地址不会被公开。