闪电贷套利机器人开发教程(一)

套利(Arbitrage)、智能合约开发(Contract Coding)和乐观转账(Optimistic Transfer)共同 创造了一个令人印象深刻的新工具组合。这是在公共区块链创新之上构建的创新。两项创新相互融合, 创造了一个真正强大而独特的获利机制。 本教程分为两个部分,在第一部分中,我们将解释闪电贷(Flash Loan)和闪电兑换(Flash Swap)背后的 一些基本概念。在第二部分中,我们将展示如何构建自己的以太坊套利机器人(Arbitrage Bot), 该机器人在Infura上运行,利用闪电贷捕捉并执行套利机会。

用自己熟悉的语言学习 以太坊DApp开发Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart

1、套利/Arbitrage

套利交易(Arbitrage Trading)并非区块链或闪电贷(Flash Loan)独有的概念,当你在不同的交易所 拥有相同资产且其价格不同的时候,就有机会利用套利交易获利。

让我们以Uniswap和Sushiswap这两个DEX为例看一下套利的具体工作原理。Sushiswap是Uniswap的一个 分支,这意味着它们在相同的智能合约代码上运行。虽然它们是两个不同的去中心化交易所,但我们 可以使用相同的代码执行相同的交易。另外,由于Sushiswap是较新的交易所,因此支持它的机器人(Bot) 可能更少。

套利的工作原理大致如下:1 ETH在Uniswap中价值80 DAI,而在Sushiswap中则价值100 DAI。那么我们 在Uniswap上购买1 ETH,然后立即在Sushiswap上出售,就可以赚取20 Dai(扣除汽油和费用之前)。 这就是典型的套利交易。

2、闪电贷 vs. 闪电兑换

闪电贷套利机器人

闪电贷(Flash Loan)和闪电兑换(Flash Swap)是区块链独有的概念。上图显示了两者之间的一些 关键区别。让我们进一步说明其中的要点。

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

  1. 在Aave上借款
  2. 在一个DEX上进行兑换
  3. 在另一个DEX上进行套利交易以实现利润

闪电兑换(Flash Swap)允许交易者在交易后期支付(或返还)资产之前,先接收资产 并在其他地方利用该资产。就像在Uniswap上所做的那样,闪电交换没有固定费用,而是收取交换费。 与闪电贷相比,闪电兑换可以看作是“免费”贷款,因为兑换手续费是从交易订单中扣除的,我们不必 单独付款。最后一点区别:我们可以偿还兑换的任何资产。如果我们使用闪电兑换拿ETH买入Dai, 那么用Dai或ETH偿还都可以,这使我们可以执行更复杂的操作。

闪电兑换和闪电贷均采用乐观转移(Optimistic Tranfer),这是我们稍后将介绍的一种迷人的技术。

3、闪电贷与智能合约

需要了解的闪电贷的另一个概念是以太坊交易的性质。所有以太坊交易均源自外部持有帐户(EOA), 这是一个由人操作的以太坊地址。以太坊交易可以从一个EOA转到另一个EOA,就像你付钱给朋友一样。 以太坊交易也可以从EOA转到智能合约中执行代码。该合约可以调用另一个合约,依此类推,直到 你的交易用完GAS为止。

*注意:如果你还不熟悉以太坊的交易,可以点击这里 查看有关账户、合约和以太坊交易类型的进一步介绍。

稍后我们将看到,闪电贷在其执行过程中需要进行多次函数调用,这对于EOA来说是不可能的。因此, 我们将部署一个包含多步骤流程的智能合约来实现闪电贷。我们发起的套利交易将从EOA执行到AAVE合约, 只需要提供地址给已部署合约即可。此外,由于闪电贷交易的复杂性,可能导致交易成本很高,因此 我们还需要为EOA账号提供足以支付交易的GAS成本的ETH。请记住,交易的价格取决于它需要多少计算能力。

闪电贷套利机器人

4、乐观转账 / Optimistic Transfer

闪电贷和闪电兑换均采用称为”乐观转账“的技术。这个了不起的DeFi创新技术使用户可以进行 无抵押贷款或兑换交易,只要用户在交易结束时还清借款,就可以执行交易。为了更好地理解 这个想法,让我们看一些代码。

这是Aave(V1)的LendingPool.sol 合约的代码。让我们注意flashLoan函数的实现,尤其是以下方法:

闪电贷套利机器人

在877行中,我们可以看到智能合约“乐观地”将资金转移到用户的合约中 - 它并没有检查用户合约 的余额以确保用户有足够的资产偿还借款,就直接转账了。

这怎么可能?难道用户不会拿着这些代币逃跑?好吧,如果这是交易的结束,那么那将是一个严重 的问题。但是正如你所看到的,代码还没有结束。用户的合约是否保留这些代币取决于成功执行的 接下来的几行。

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

在第884行,用户的合约代码已执行完成,工作流程现在返回到Aave合约,该合约使用require语句检查 用户合约返回的值。乐观精神到这里就结束了,现在我们必须看看用户合约是否已经执行了有利可图 的交易!如果是这样,Aave合约将能够扣除其费用。如果交易没有获利,则该require声明将失败, 这意味着整个交易都将失败,也意味着我们之前的乐观转账实际上并不会发生。

让我们看一下Uniswap如何实现其乐观转账。这是从他们的UniswapV2Pair.sol合约中获得的,特别 注意swap函数:

闪电贷套利机器人

乐观转账发生在170-171行,就是这个_safeTransfer方法。Uniswap甚至给出了这种乐观转账的注释, 以便更好地识别它(顺便说一下,Uniswap提供有关其协议合约的大量文档和教程)。 下一行是Uniswap合约以乐观余额调用用户的合约。

再次,假设事务工作流在Uniswap合约上暂停执行,并携带乐观转移的代币到用户合约继续执行。 一旦执行完用户合约,交易工作流就会回到Uniswap合约。然后,Uniswap合约分配用户合约的新余额, 并尝试收取兑换手续费(第180-181行)。

如果用户合约未能通过代币获利,则require关于182的声明将失败,并且整个交易将回滚。这是 乐观转账的关键-100%取决于交易是否成功。如果不成功,则交易无效,并且将恢复为代币转让之前 的状态。但是,如果成功,则可以保持乐观转账,并且用户可以获利。

在本系列的第二部分中,我们将逐步构建一个套利机器人。可以在此处预览代码


原文链接:Build a Flash Loan Arbitrage Bot on Infura, Part I

汇智网翻译整理,转载请标明出处