首页 手机兼职平台区块链正文

三步学会完成自己的第一笔闪电贷合约

admin 区块链 2020-11-25 12:30:19 2847 0

Ownbit

FlashloanDeFi

概念

闪电贷是一种无典当、假贷金额无上限(能够借光池中一切的钱)的告贷。它要求假贷人快借快还,快到还款和告贷在同一个买卖内(同一个以太坊 transaction)。

闪电贷要求每笔告贷在归还时,除了归还本金,还要付出必定利息。该利息(或称手续费)由体系动态核算。

完结

很多人对了解闪电贷有必定的难度。由于这需求了解智能合约履行原理和以太坊状况改变的机制。咱们经过自己编写一个闪电贷合约,来了解其背面的运转原理。

以运用 Aave 供给的闪电贷为例,编写一个你自己的合约十分简略,你只需求完结一个叫 executeOperation 的方 法。

1. executeOperation

executeOperation 办法参数中 _reserve 是所借代币的合约地址,假如是 ETH 则是一个特别的地址(在 Aave 顶用 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE 来表明 ETH),_amount 是告贷的金额,_fee 是本次告贷要归还的利息。_params 暂时可疏忽。

function executeOperation(

    address_reserve,

    uint256_amount,

    uint256_fee,

    bytes calldata_params

    )

    external

{

    require(_amount <= getBalanceInternal(address(this),_reserve), " 告贷失利 ");



    //

    // 用借来的 ETH 去赚取更多的 ETH

    //



    // 还款

    uint totalDebt =_amount.add(_fee);

    transferFundsBackToPoolInternal(_reserve, totalDebt);

}

当代码履行到 executeOperation 时,你现已拿到了借来的钱,你首要是写怎么运用这些钱赚取更多钱的逻辑。例如你发现同一个买卖对 A/ETH 在 DEX1 (价格低) 和 DEX2 (价格高) 的价格差较大,那么你的挣钱逻辑为:

  1. 已借得 100 ETH;
  2. 在价格低的 DEX1 中买入 A;
  3. 在价格高的 DEX2 中卖出 A;
  4. 卖得 110 ETH。

2. 开端告贷

executeOperation 是告贷成功后要履行的逻辑。而开端告贷的逻辑需求用户自己触发(经过发送买卖调用合约),或许直接写在合约的结构函数里。例如:

function flashloan() public onlyOwner {

    bytes memory data = "";

    uint amount = 100 ether;

    address asset = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); // 借 ETH



    ILendingPool lendingPool = ILendingPool(addressesProvider.getLendingPool());

    lendingPool.flashLoan(address(this), asset, amount, data);

}

flashLoan() 是真实的告贷函数,比如中是借入 100 ETH。闪电贷由此办法触发(开端),也由此办法完毕。要彻底了解它,咱们需求看看 flashLoan() 的内部逻辑。咱们摘取最重要的部分。

3. flashLoan() 内部逻辑

flashLoan() 中首要进行各项数据验证,然后便告贷给你,紧接着调用你的 executeOperation 的挣钱逻辑,最终验证你是否归还了本金加利息。首要逻辑如下所示:

// 各种数据验证,池中是否还有满足的钱能够贷出?核算手续费等等



        // 将告贷转给你

        core.transferToUser(_reserve, userPayable,_amount);



        // 履行你的合约的挣钱逻辑(过程 1 中所写的函数)

        receiver.executeOperation(_reserve,_amount, amountFee,_params);



        // 查看现在池中余额

        uint256 availableLiquidityAfter =_reserve == EthAddressLib.ethAddress()

            ? address(core).balance

            : IERC20(_reserve).balanceOf(address(core));



        // 经过池中余额改变来承认你是否现已归还了告贷+利息

        require(

            availableLiquidityAfter == availableLiquidityBefore.add(amountFee),

            "The actual balance of the protocol is inconsistent"

        );

假如 require() 验证失利,它将 revert 整个买卖,让告贷无效,然后确保借出方总是安全的。

结语

以上解说了完结第一笔闪电贷最基本的办法和原理。编译源码,以及布置到线上,我们能够参阅 Aave 相关官方文档,这儿就不逐个介绍了。

1ETH

mp.weixin.qq.com

版权声明

本文仅代表作者观点,不代表网赚之家本站立场。
本文系作者授权发表,未经许可,不得转载。

评论