본문으로 건너뛰기
0%

Aave를 사용해 플래시 론 생성하기

Alchemy team headshot

작성자 Alchemy

2022년 4월 7일에 게시됨4분 읽기

소개

이 튜토리얼에서는 다음을 진행합니다:

  • Flash loan 스마트 컨트랙트 작성 및 배포
  • Aave라는 유동성 프로토콜을 통해 자금 조달받기
  • 배포한 컨트랙트와 트랜잭션을 주고받으며 Flash loan 실행

시작하기 전에, 이 프로젝트를 구성하는 각 요소를 살펴보겠습니다:

Flash loan이란?

전통적인 금융에서 차입자는 대출을 받기 위해 담보를 제공해야 하는 경우가 많습니다. 이 담보는 보통 자동차나 집 같은 자산의 형태를 띱니다. 은행은 차입자가 상환에 실패할 경우 손실을 메우기 위한 안전장치로 이 담보를 사용합니다.

탈중앙화 금융(DeFi)의 세계에서는 flash loan을 이용하면 차입자가 담보 제공 없이 대출을 받을 수 있습니다.

flash loan에서는 대여자가 차입자에게 대출을 제공하는 것과 그 대출을 상환받는 것이 단일 트랜잭션 안에서 모두 이루어질 수 있습니다. 이는 트랜잭션이 시작되는 시점과 블록체인의 블록에 최종적으로 커밋되는 시점 사이의 시간 차이 덕분에 가능합니다.

Flash loan의 단계는 다음과 같습니다:

  1. 차입자가 Flash loan 스마트 컨트랙트를 실행합니다

  2. flash loan 컨트랙트가 유동성 풀에 대출 금액을 요청합니다

  3. 컨트랙트는 대출받은 자금을 사용해 정의된 작업을 실행합니다 (예: 거래소에서의 트레이딩)

  4. 작업이 완료되면 빌린 자금을 유동성 풀에 반환합니다

  5. 트랜잭션이 블록체인에 커밋됩니다

스마트 컨트랙트를 통해 다음을 검증할 수 있습니다:

  • flash loan이 스마트 컨트랙트 내 작업을 수행하기에 충분한 자금을 확보하고 있는지
  • 트랜잭션이 새 블록에 추가되기 전에 작업이 완료되는지
  • 작업으로 인해 차입자에게 자금 손실이 발생하지 않는지
  • 대출 풀에 정확한 상환 금액과 프로토콜 사용 수수료가 지급되는지

차입자는 대여자에게 정확한 대출 금액이 상환되는 한 자금을 자유롭게 사용할 수 있습니다. Flash loan의 대표적인 활용 사례는 다음과 같습니다:

  • 트레이딩 차익거래 - 한 거래소의 토큰을 더 높은 가치로 거래되는 다른 거래소로 옮겨 이익을 얻는 방식

  • 담보 교체 - 담보 대출의 토큰을 기존 대출의 다른 담보 토큰으로 교체하는 방식

  • 자가 청산 - 토큰을 교체하고 flash loan을 상환함으로써 담보 대출을 상환하는 방식

flash loan 컨트랙트가 실행되기 전에는 컨트랙트에 자금이 공급되어야 합니다. flash loan 자금은 일반적으로 Aave라는 주요 대출 프로토콜을 통해 조달됩니다.

flash loan의 메커니즘은 담보가 필요 없기 때문에 대출을 손쉽게 만들어줍니다. 하지만 이 특성은 flash loan 공격을 시도하는 공격자에게도 기회를 열어줄 수 있습니다. flash loan 공격이란 차입자가 자금을 빌려 자산 가격을 조작한 뒤, 빌린 자산을 반환하면서 큰 이익을 챙기는 방식입니다. 이는 대개 가격 오라클을 조작하거나 시장에 인위적인 가격 변동을 일으키는 방식으로 이루어집니다. Chainlink와 같은 탈중앙화 오라클을 선택하고, OpenZepplin 같은 서비스를 통해 스마트 컨트랙트를 감사하는 것이 이러한 공격을 방지하는 방법입니다.

Aave란?

전통적인 대출에서는 은행이 자금을 제공합니다. DeFi에서는 Aave 프로토콜이 flash loan의 가장 큰 자금 조달원입니다. Aave는 사용자가 ERC20 토큰의 유동성 풀을 공급할 수 있게 합니다. 차입자는 이 풀을 이용해 대출을 받을 수 있습니다. 대출 유형에 따라 차입자는 이자율을 지불하며, 이 이자는 토큰을 공급한 공급자에게 돌아갑니다. 현재 Aave 프로토콜은 0.09%의 거래 수수료도 부과합니다.

이 모든 개념이 어떻게 결합되어 flash loan을 만들어내는지 살펴보겠습니다:

필요 사항

스마트 컨트랙트 코드 받기

  1. Remix IDE에서 새 워크스페이스를 엽니다.

  2. 별도의 탭에서 Github Gists를 여기에서 엽니다. 여기에는 flash loan을 만드는 데 사용할 스마트 컨트랙트 코드가 들어 있습니다.

  3. Remix IDE에서 아래 이름과 정확히 동일하게 새 컨트랙트 파일을 생성하고, 해당 파일에 연결된 코드를 복사해 붙여넣습니다 (총 6개):

  • Flashloan.sol

  • FlashloanRecieverBase.sol

  • IFlashLoanReciever.sol

  • ILendingPool.sol

  • ILendingPoolAnddressesProvider.sol

  • Withdrawable.sol

Remix IDE에 새로 생성된 컨트랙트 파일

컨트랙트 소개

Flashloan.sol - flash loan 스마트 컨트랙트입니다. 대출받은 자금을 사용해 작업을 완료하기 위해 컨트랙트가 호출하는 ExecuteOperation 함수를 포함합니다.

FlashLoanRecieverBase.sol / IFlashLoanReciever.sol - 컨트랙트가 flash loan 자금을 받을 수 있도록 해줍니다

ILendingPool.sol / ILendingPoolAddressProvider.sol - flash loan에 자금을 공급할 Aave 대출 풀을 가리킵니다

Withdrawable.sol - 잘못되거나 묶인 자금이 있을 경우 다른 컨트랙트가 이 컨트랙트에서 자금을 인출할 수 있게 합니다

지갑에 자금 추가하기

flash loan 컨트랙트를 배포하고 실행하기 위해 Kovan Test Network를 사용합니다. 이를 성공적으로 진행하려면 지갑에 자금이 있어야 합니다:

  1. https://faucets.chain.link/kovan로 이동합니다

  2. 지갑 주소를 입력합니다:

Metamask Wallet의 Kovan Network
  1. .1 Test Eth를 선택해야 합니다
Chainlink Kovan faucet 폼: 테스트용 ETH 0.1개 요청
  1. 토큰이 전송될 때까지 확인을 기다립니다

  2. Metamask 지갑에 자금이 추가되었을 것입니다

컨트랙트 배포하기

지갑에 자금이 준비되었으니, 이제 Kovan Testnet에 스마트 컨트랙트를 배포하여 실행하고 상호작용할 수 있도록 하겠습니다.

  1. Remix 사이드 패널에서 Solidity Compiler로 이동합니다
Remix 사이드 패널의 Solidity Compiler
  1. 아래 설정을 사용합니다:

Compiler: 0.6.6+comitt.6c…

Language: Solidity

EVM Version: Default

Compile Flashloan.sol

Flashloan.sol 컴파일을 위한 Remix Solidity 컴파일러 설정
  1. 'Compile'을 클릭합니다 - 성공적으로 진행되면 경고는 나올 수 있지만 오류는 없어야 합니다

flash loan 스마트 컨트랙트를 컴파일한 후, 배포를 진행합니다:

  1. 'Deploy and Run Transactions' 탭으로 이동합니다
Deploy and Run Transactions 탭의 Remix 사이드바 아이콘
  1. 다음 설정을 사용합니다:

Environment: Injected Web3

Account: Kovan 지갑 주소를 복사해 붙여넣습니다

Contract: Flashloan - contracts/Flashloan

Injected Web3 환경이 선택된 Remix Deploy and Run Transactions 패널
  1. address_addressProvider 항목에 Lending Pool 컨트랙트인 0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5를 추가합니다. 이는 Aave의 대출 제공자 주소입니다. 다른 컨트랙트 주소는 여기에서 확인할 수 있습니다. ‍
Remix 배포 패널: address_addressProvider에 Aave lending pool 주소 입력
  1. 'Deploy'를 클릭합니다

  2. Metamask 팝업이 뜨면 트랜잭션을 'Confirm'합니다. 터미널 안에서 etherscan에서 트랜잭션을 확인할 수 있는 링크가 표시됩니다.

컨트랙트 배포 트랜잭션의 Etherscan 링크가 표시된 Remix 터미널

Flash loan에 자금 추가하기

이제 스마트 컨트랙트가 Kovan Test Network에 배포되었습니다. Aave의 testnet 대출 풀에서 컨트랙트로 자금을 추가해야 합니다.

  1. 이 페이지로 이동합니다: https://staging.aave.com/?marketName=proto_kovan

  2. Metamask 지갑을 연결합니다

  3. 'Kovan Ethereum Market'을 사용하고 있는지 확인합니다. 작은 'K' 표시가 있을 것입니다

Kovan Ethereum Market이 표시된 Aave 마켓 선택 화면

참고: 설정에서 'Testnet mode'를 활성화해야 할 수도 있습니다.

Testnet mode 토글이 켜진 Aave 설정 메뉴
  1. 'Assets to supply' 아래의 'Supply' 버튼을 클릭해 테스트용 Eth를 Aave에 공급합니다. .001부터 시작할 수 있습니다
Aave Assets to supply 패널: Supply 버튼으로 테스트용 ETH 공급
  1. 그다음 DAI 옆의 'Borrow' 버튼을 클릭해 DAI를 빌립니다. 10 DAI를 빌립니다.
Aave 대출 패널: DAI 옆의 Borrow 버튼 클릭
  1. Metamask가 열려 트랜잭션 확인을 요청하며, 트랜잭션이 완료되면 지갑에 DAI가 표시됩니다:
ETH와 함께 대출한 DAI가 표시된 MetaMask 지갑 잔액
  1. DAI를 처음 받는 경우, 지갑에서 DAI를 볼 수 있도록 설정해야 합니다.
  • Metamask에서 'Import Tokens'로 이동합니다
DAI 추가를 위한 Import Tokens 옵션이 있는 MetaMask 메뉴
  • Kovan용 DAI 컨트랙트 주소를 입력합니다: 0xFf795577d9AC8bD7D90Ee22b6C170349
  1. 지갑에 DAI가 들어오면, 배포한 컨트랙트로 10 DAI를 전송합니다. 배포한 컨트랙트 주소는 Remix에서 복사할 수 있습니다:
Remix 배포된 컨트랙트 패널: flash loan 컨트랙트 주소 복사

그런 다음 Metamask를 사용해 해당 주소로 전송합니다:

MetaMask 전송 화면: 배포된 flash loan 컨트랙트로 DAI 전송

Flash loan 컨트랙트 실행하기

이제 스마트 컨트랙트를 실행할 때 사용할 자산을 지정하기 위해 Aave의 KovanTestnet DAI 컨트랙트를 호출해야 합니다.

  1. Remix IDE로 돌아가 'Deploy & Run Transactions' 탭으로 이동합니다

  2. 'Deployed Contracts' 아래에서 flash loan과 컨트랙트 주소를 확인할 수 있습니다

Deployed Contracts의 flash loan 및 컨트랙트 주소
  1. 'flashloan' 라벨 옆에 있는 'address asset' 텍스트 필드로 이동합니다
flashloan 버튼 옆의 Remix 주소 자산 입력 필드
  1. address_asset 필드에 다음 컨트랙트 주소를 입력합니다: 0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD. 그런 다음 flashloan 라벨 버튼을 클릭해 트랜잭션을 시작합니다.

  2. 이렇게 하면 flash loan 프로세스가 시작되고 etherscan에 3건의 트랜잭션이 생성됩니다.

flash loan 과정의 etherscan 트랜잭션 3건

첫 번째 트랜잭션은 대출 풀에서 flash loan 컨트랙트로 이루어집니다. 스마트 컨트랙트에 별도의 작업을 포함하지 않았기 때문에, 해당 금액은 추가 수수료와 함께 대출 풀로 반환됩니다. 마지막 트랜잭션은 빌린 금액에 대한 이자로, 유동성 풀의 공급자에게 지급됩니다.

Background gradient

블록체인 매직을 만드세요

Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.