KiemTienOnline360

Chia sẻ hành trình kiếm tiền online bắt đầu từ con số 0

Kiến thức lập trình, Kỹ nghệ phần mềm

Hướng dẫn triển khai Flashloan trên Binance Smart Chain BSC Testnet

Hướng dẫn triển khai Flashloan trên Binance Smart Chain

Hướng dẫn triển khai Flashloan trên Binance Smart Chain

Chia sẻ bài viết
5
(9)

Về Flashloan thì chắc các bạn không xa lạ gì nữa. Nó là một khoản vay nhanh không cần thế chấp nhưng phải trả lại ở cuối xử lý trong cùng Block. Bài viết này tập trung vào hướng dẫn triển khai sử dụng Flashloan trên mạng lưới Binance Smart Chain BSC Testnet.

Hướng dẫn triển khai Flashloan trên Binance Smart Chain
Hướng dẫn triển khai Flashloan trên Binance Smart Chain BSC

Triển khai Flashloan sử dụng MCL Flashloan

Gần đây Multiplier Finance đã cho ra mắt hệ thống Lending/Borrowing trên BSC có hỗ trợ Flashloan. Do đó chúng ta có thể sử dụng hệ thống này cho việc triển khai thử nghiệm Flashloan, đặc biệt MCL có hỗ trợ Testnet nên chúng ta triển khai trên BSC Testnet cho tiết kiệm. Một số tài nguyên bạn có thể tham khảo tại:

MCL đã cung cấp sẵn source code demo cho phần Flashloan, bạn xem tại địa chỉ: MCL-FlashloanDemo. Trong bài viết này tôi không tập trung vào việc hướng dẫn bạn build smart contract thế nào, mà yêu cầu bạn phải có kiến thức này rùi.

Ở đây chúng ta quan tâm tới tệp demo.sol, là contract demo sử dụng flashloan. Chúng ta có 1 số chú ý:

  • Hàm khởi tạo chúng ta cần truyền 2 địa chỉ:
    • Tham số addressesProvider: Địa chỉ LendingPool để vay flashloan
    • Tham số defi: Là địa chỉ của ứng dụng chúng ta sử dụng để làm các nghiệp vụ sau khi vay. Ở đây có contract defi.sol là contract đơn giản để demo với nghiệp vụ nạp và rút tiền. Thực tế để kiếm được tiền, nghiệp vụ này phức tạp hơn nhiều.
  • Hàm flashloanBnb() là hàm người dùng gọi để bắt đầu thực hiện nghiệp vụ Flashloan => Sau khi thực hiện vay, hàm executeOperation sẽ được gọi để thực hiện nghiệp vụ.

Bạn có thể sử dụng Truffle hoặc Remix IDE để triển khai. Nói chung sử dụng Remix IDE là đơn giản và tiện nhất. Các bước thực hiện như sau:

Các bạn có thể không phải triển khai lại mà test trực tiếp trên contract Demo: 0xc0dfdce817c6d4919f4f9a198d312a14221733ee => Nhớ đẩy 1 ít BNB làm phí trả cho pool nếu contract không có BNB nhé.

Triển khai Flashloand sử dụng CREAM Finance Flashloan

CREAM Finance là nền tảng DEFI hỗ trợ trên nhiều network khác nhau trong đó có Binance Smart Chain (BSC). Cream Finance có hỗ trợ FlashLoan trên BSC, chi tiết xem tại: https://docs.cream.finance/v/binance-smart-chain/flash-loanshttps://docs.cream.finance/flash-loans

CREAM Finance cũng có ví dụ về sử dụng Flashloan, chi tiết xem tại địa chỉ: https://github.com/CreamFi/flashloan-playground

Danh sách pool hỗ trợ Flashloan bạn xem tại: https://docs.cream.finance/v/binance-smart-chain/lending/lending-contract-address

Do không hỗ trợ testnet nên khá khó để thử nghiệm Flashloan trên Testnet BSC.

Triển khai Flashloan sử dụng Pancake

PancakeSwap không hỗ tường minh Flashloan, nhưng trong code của PancakePair.sol của PancakeSwap lại tiềm ẩn khả năng giúp user có thể vay nhanh được:

Đoạn code giúp khai thác Flashloan trên Pancake
Đoạn code giúp khai thác Flashloan trên Pancake

Bạn để ý đoạn code trên sẽ thấy:

  • (1) PancakePair chuyển token0 token1 sang địa chỉ to.
  • (2) PancakePair gọi hàm pancakeCall(…) của địa chỉ to nếu điều kiện data.length>0 được thỏa mãn.

Như vậy nếu to là một contract có cài đặt hàm pancakeCall(…) thì trong hàm này bạn có thể thực hiện các nghiệp vụ gì đó trước khi trả lại cho token0 token1 cho PancakePair kèm theo phí 0.3% (Tùy phiên bản) để đảm bảo phần check phía sau không bị lỗi => Đây chính là kẽ hở giúp bạn thực hiện Flashloan (Chính xác hơn gọi là Flashswap). Đặc biệt bạn có thể vay nhanh đồng thời token0, token1 hoặc chỉ vay nhanh 1 trong 2 token.

Bây giờ ta cài đặt đoạn mã nhỏ thực hiện vay nhanh WBNB trên môi trường testnet. Một số tham số thiết lập cố định trong Smart Contract để cho code đơn giản.

Đầu tiên ta tạo tệp Defi.sol với nghiệp vụ đơn giản:

pragma solidity ^0.5.0;

interface IERC20 {
     function totalSupply() external view returns (uint256);
     function balanceOf(address account) external view returns (uint256);
     function transfer(address recipient, uint256 amount) external returns (bool);
     function allowance(address owner, address spender) external view returns (uint256);
     function approve(address spender, uint256 amount) external returns (bool);
     function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

     event Transfer(address indexed from, address indexed to, uint256 value);
     event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IDefi {
    function withdraw(uint256 _amount) external ;
}

contract Defi is IDefi {
     IERC20 public wbnb = IERC20(0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd);

     event WithdrawBnbEvent(address indexed _user, uint256 _amount);

     function withdraw(uint256 _amount) external {
          wbnb.transfer(msg.sender, _amount);
          emit WithdrawBnbEvent(msg.sender, _amount);
     }
}

Sau triển khai ta được địa chỉ của Defi: 0xa16cBa9874Eb8DA206CB588638da8A580e019754

Giờ tạo tệp Flashswap.sol được thực hiện vay và gọi tới contract Defi để thực hiện nghiệp vụ:

// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.6.12;

interface Ipancake {
   function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
}

interface IBEP20 {
    function mint(address account, uint256 amount) external;
    function burn(address account, uint256 amount) external;
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IDefi {
    function withdraw(uint256 _amount) external ;
}

contract FlashSwap {

    address public owner;
    Ipancake public ipancake = Ipancake(0xF855E52ecc8b3b795Ac289f85F6Fd7A99883492b);
    IBEP20 public wbnb = IBEP20(0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd);
    uint256 public fee = 3;
    IDefi public app = IDefi(0xa16cBa9874Eb8DA206CB588638da8A580e019754);
    
    modifier onlyOwner() {
        require(msg.sender == owner, '1');
        _;
    }
    
    constructor() public {
        owner = msg.sender;
    }
    
    function runApprove() public onlyOwner {
        wbnb.approve(address(ipancake), uint256(-1));
    }
    
    function adminOut() public onlyOwner {
        wbnb.transfer(owner, wbnb.balanceOf(address(this)));
    }
    
    function flashloan(uint amount) public onlyOwner {
       ipancake.swap(0, amount, address(this), abi.encodePacked(uint256(-1)));
    }
    
    function pancakeCall(address sender, uint amount0, uint amount1, bytes calldata data) public {
        // Do business actions here to use WBNB
        wbnb.transfer(address(app), amount1);
        app.withdraw(amount1);

        // Send back WBNB to PancakePair
        uint256 amount = amount1 + amount1*fee/1000;
        wbnb.transfer(address(ipancake), amount);
    }
}

Sau khi triển khai ta được địa chỉ của Flashswap là: 0x973c56E134631fe6eE04b5722AfA84E43a1C3D34

Bây giờ ta chạy thử, ta thực hiện các bước sau:

  • B1: Chạy hàm runApprove() lần đầu tiên. Chỉ cần gọi 1 lần duy nhất.
  • B2: Send ít nhất 0.03 WBNB vào contract để bù phần phí.
  • B3: Ta thực hiện vay 10 WBNB bằng cách gọi hàm flashloan(10000000000000000000)
  • B4: Kiểm tra giao dịch. Đây là giao dịch mà tôi thử: 0x35fdcf367e93077d8c8b42c2e47625fc5d291eae85a58e8526e7de2005d37c99

Các ứng dụng của Flashloan

Như vậy việc sử dụng Flashloan không còn là vấn đề nữa. Vấn đề bây giờ là làm sao sử dụng vốn từ Flashloan để kiếm lợi nhuận cho bạn.

Bạn có thể sử dụng Flashloan để:

  • Arbitrage (Kinh doanh chênh lệch giá): Đây chính là phần các bạn nên đầu tư trí tuệ và thời gian để kiếm được lợi nhuận.
    • Locational Arbitrage: Mua token từ 1 sàn DEX và bán nó ở một sàn khác để ăn chênh lệch giá.
    • Triangular Arbitrage: Giao dịch liên quan đến ba token để ăn chênh lệch giá.
  • Hoán đổi tài sản thế chấp: Tức là bạn đã thế chấp đồng A để vay đồng B rùi, và đồng B bạn đã sử dụng vào việc nào đó rồi. Nhưng giờ bạn muốn đổi đồng A rủi ro giá cao sang đồng tiền C khác an toàn hơn, trong khi bạn không còn đồng B => Flashloan sẽ rất hữu ích.
  • Thanh lý tài sản: Bạn đã thế chấp đồng A để vay đồng B, và bạn mang đồng B đi đầu tư và đã mất hết. Bạn muốn rút phần tiền còn lại ra khỏi hệ thống, nhưng bạn ko có tiền để mua đồng B nữa => Flashloan sẽ hữu ích trong trường hợp này.
  • Khai thác lỗ hổng nghiệp vụ: Từ khi ra đời Flashloan, các hacker đã khai thác tối đa để kiếm tiền bất hợp pháp từ các lỗ hổng nghiệp vụ hay chủ động thao túng tỉ giá. Vì thế có rất nhiều người trì trích về Flashloan và là nguyên nhân gây sụp đổ hệ thống DeFi. Mình đứng trên góc nhìn khác thì mình nhờ Flashloan mà lỗ hổng nghiệp vụ được phát hiện ra sớm, và các ứng dụng DeFi sẽ sớm sửa lỗi và hoàn thiện hơn. Bình thường có thể phải mất 10 năm để các ứng dụng DeFi đi vào hoạt động ổn đình, thì nhờ có Flashloan có thể chỉ cần 2-3 năm mà thôi.

Có thể bạn quan tâm: Hướng dẫn hack hợp đồng thông minh Smart Contract với Ethernaut CTF – Cách học bảo mật Smart Contract hiệu quả nhất

Nguồn: Tổng hợp

Bài viết này có hữu ích với bạn?

Kích vào một biểu tượng ngôi sao để đánh giá bài viết!

Xếp hạng trung bình 5 / 5. Số phiếu: 9

Bài viết chưa có đánh giá! Hãy là người đầu tiên đánh giá bài viết này.

4 Bình luận

  1. Luckyyyy

    defi: Là địa chỉ của ứng dụng chúng ta sử dụng để làm các nghiệp vụ sau khi vay. Ở đây có contract defi.sol là contract đơn giản để demo với nghiệp vụ nạp và rút tiền. Thực tế để kiếm được tiền, nghiệp vụ này phức tạp hơn nhiều. Cho mình hỏi rõ là địa chỉ này lúc mình tạo metamask hay là hợp đồng thông minh vây bạn ?
    Hợp đồng thông minh tạo token bình thường có đc không ? Mình không hiểu lắm

    • – B1. Đầu tiên bạn phải triển khai smart contract “defi.sol” trước nhé => Bạn sẽ được 1 địa chỉ contract.
      – B2. Sau đó triển khai “demo.sol” => Tham số _defi chính là địa chỉ trong B1

  2. Luckyyyy

    Ad ơi vậy là phải tìm cod smartcontract bsc ? Ad có thể chia sẽ link cho mình với ạ ? Mình tìm thì chỉ cod để tạo token ?

Trả lời

Giao diện bởi Anders Norén