본문 바로가기

:D/block chain

UNISWAP 2 : 유니스왑의 컨트랙트 자세히 알아보기

 

 


두 개의 자산, 코인, 토큰을 가지고 AMM을 만드는 것

: 그래서 유니스왑은 항상 두 코인을 가지고 pair를 만들어서 관리를 하게 됨
유니스왑은 크게 Factory 컨트랙트Token Exchainge 컨트랙트로 나뉘어져 있음

Factory 컨트랙트는 우리가 *토큰 pair를 정할 때 이 pair 가 있으면 그 두 코인을 대상으로 컨트랙트를 만든 다음

그 안에 풀(pool)을 만듦. 당연히 그 풀에 있는 수량은 서로 곱이 일정함

 

* token pair : 거래되는 토큰 쌍을 의미. 이 토큰 페어로 구성된 유동성을 * pool 이라고 함.


그래서 1편에서 봤었던 ETH와 OMG라고 하면 ETH와 OMG의 pair에 대한 컨트랙트가 만들어지고

사람들이 만약에 ETH와 OMG를 교환하고 싶으면 그 컨트랙트로 가서 교환을 하는 것

교환을 하게 되면 교환비가 달라지고 교환비가 달라지면 arbitrager들이 들어와서 다시 맞춰 주고 하는 원리


그런데 만약에 그 pool이 충분히 크다면?  교환비가 잘 안바뀌게 되고 안정적으로 토큰을 교환할 수 있게 됨 


그래서 그 풀이(=사람들이 들어오는게) 사실 좀 중요함
지금 유니스왑은 사람들이 많이 들어와있음 -> AMM이 잘 동작하고 있음을 의미 (충분한 pool)


그런데 이 pair로 만드니까 좀 불편한 점이 있음 모든 토큰 쌍마다 새로운 컨트랙트를 만들어서 배포해줘야 함. 

그리고 그 안에 풀을 만들기 때문에 유니스왑에는 그 풀의 양(갯수)이 굉장히 많을 것임 

모든 풀을 다 만드는 것은 너무 비효율적임. 유니스왑에서는 pair가 만약에 존재하지 않는다 라고 하면 직접적인 pair가 없다고 하더라도 그 pair를 만들어낼 수 있는 루트(route)를 찾음 이걸 라우팅(routing)이라고 함 

 

예를 들면, SUSHI 코인과 YFI 코인을 swap 하고 싶을 경우, SUSHI-YFI pair에 대한 컨트랙트가 없다면 다른 걸 쓰는 것.

SUSHI-WETH pair에 해당하는 컨트랙트와 WETH-YFI에 해당하는 pair 컨트랙트를 사용해서 atomic 하게 SUSHI에서 WETH로 바꾸고 WETH를 YFI로 바꾸는 과정을 거치는 것. 그러면 수수료는 조금 더 내겠지만 빠르게 교환이 가능함 

이런식으로 토큰 pair가 없다고 하더라도 routing을 통해서 토큰을 교환할 수 있음

 


그래서 내가 새로운 토큰을 만들었다 라고 한다면 그 토큰과 어떤 새로운 토큰 사이에 그 교환에 대한 컨트랙트를 새로 만들어서 배포하고 거기서 거래를 해야함

 


그런데 이더리움에는 기축통화가 명확하게 있지 않음

WBTC, WETH, DAI, USDC, USDT, TUSD (등) 여러가지 사람들이 교환을 많이 하는 코인들이 있긴 하지만

딱 얘로만 뭔가 교환을 한다라고 하는 기축 통화가 명확하게 있진 않음

그렇기 때문에 보통은 여러개 5~6가지 정도의 많이 교환을 하는 토큰들과는

항상 토큰 pair를 형성 해야하고 컨트랙트가 만들어져 있어야 되고 그리고 그 안에 풀이 형성 되어 있어야 함

그런 상태에서 보통 교환을 하게됨

AMM을 하기 때문에 효율적이지만 컨트랙트 주소는 그다지 효율적이지 않음

 

예를 들어서 10개의 토큰이 있으면 10개의 토큰의 조합(combination)만큼 10C2 만큼의 컨트랙트가 필요
10c2 = 45 그정도의 컨트랙트가 필요

 

10c2 계산법...........

 

근데 컨트랙트의 수가 늘어나면 늘어날수록 그 조합의 수는 더 커지니까 좀 힘들어짐
그리고 이 factory 컨트랙트에는 이 모든 토큰 pair들에 대한 컨트랙트들의 address 가 들어있음

 

 

예를 들면 DAI를 들고있는 어떤 사람이 이 DAI를 ETH와 교환하고 싶을 경우

Factory 컨트랙트에 createExchange라고 하는 function을 호출 그러면 createExchange에서 DAI (컨트랙트) address를 봄

이 사람이 DAI를 교환하고 싶구나~~ 그러면 그 DAI에 해당하는 ETH-DAI pair에 대한(Token Exchange) 컨트랙트 주소를 찾음 이때 permutation(순열) 이 두 개 나올 수 있음 (ETH-DAI와 DAI-ETH)

근데 이 Factory에서는 실제 주소(0x1234....)를 보고 오름차순 정렬을 함

그래서 더 낮은게 앞에 오고 더 큰게 뒤에 옴

그런식으로 pair 쌍을 만든 다음에 이 컨트랙트 주소를 그렇게 두는(저장하는)거임

그래서 이 사람이 ETH와 DAI를 교환하고 싶다면 ETH-DAI 컨트랙트 주소를 찾아가지고

거기로 가서 그 Exchange 컨트랙트에서 교환을 하는 것.

어떤식으로? AMM 으로 교환을 하는데 거기서 또 트랜잭션이 발생

ETH는 ETH니까 그냥 교환 DAI (ERC20) 컨트랙트로 다시 가야됨 왜냐면 DAI의 수량이 바뀌니까

이 DAI Exchange 컨트랙트에 들어있는 DAI의 양과 이 사람이 지금 교환하고 싶어하는 DAI의 자기 주소의 DAI의 양이 변하니까 그걸 교환하기 위해서 DAI 컨트랙트로 또 가는 것 이런식으로 좀 복잡하게 이루어져 있음

 


LP tokens (Liquidity Shares)
LP Tokens
- LP (Liquidity Provider)는 reserve를 제공하고 LP token(liquidity share)를 받는다.
- LP token은 reserve를 withdraw 할 때 받을 수 있는 token 양과 매핑된다.
- 또한, LP token은 유니스왑에서 token을 swap한 trader들이 낸 수수료(0.3%)를 전체 token pool에서 자신의 LP token의 지분만큼 요청할 수 있다.

그런데 유니스왑에서는 유동성 공급자들 (Liquidity Provider) = LP 들이 처음에 돈을 맡김
ETH-DAI, ETH-OMG 이런것들을 맡겼을 때 맡기고 나서 어떤 시점이 됐을 때 되찾고 싶을 때 그 증거.

다시 말해서 그 사람이 얼마를 (돌려) 받아야 되는지에 대해서 알려주기 위한 증거를 LP 토큰이라고 하는 형태로 발행.

그림을 보면 (좌) 토큰 A와 토큰 B를 각각 10개와 1개 (교환비가 10:1정도) 있는 이 토큰을 보관을 한 것

(유니스왑에 유동성을 공급하기 위해서)
그러면 이게 이 유니스왑 풀, 다시말해서 A-B pair에 해당하는 Exchange 컨트랙트에 보관이 되고

그 컨트랙트에서 이 풀에 해당하는 토큰이 발행 그림을 보면 (중앙) 총 열두개가 발행이 되어있고

(좌 Deposit) 이 사람이 10개, 1개 넣어가지고 (LP Token) 4개를 받음

그러면 이 사람이 나중에 토큰을 찾으려면 이 4개(의 LP Token)을 다시 주면

이 4개에 고정된 10개와 1개의 토큰이 이 사람에게 다시 가게됨

 

이런식으로 이 사람이 자기가 맡긴 돈에 대한 증거로서 일종의 채권 같은 거라고 생각하면 됨

그 채권을 가지고 있다가 나중에 필요할 때 다시 반납하면 자기가 맡겨놨던 그 유동성을 다시 공급받을 수 있는 것

그것을 위해서 LP Token을 발행

 

이 LP Token이 왜 중요하냐면 유니스왑에서는 유동성 공급자들에게 수수료를 share 해줌

얼마만큼? 전체 LP Toekn 풀 중에서 자기 LP Token의 지분 만큼 수수료를 받아올 수 있음 (유니스왑의 수수료는 0.3%)

한번 교환이 일어날 때마다 수수료가 쌓이고 자기한테는 그 0.3% 곱하기 지분 만큼
이 사람 같은 경우는 자기한테 4개 있고, 전체 토큰이 12개 있으니까 0.3% 에 1/3만큼 가져올 수 있음.

즉, 0.1%가 이 사람이 받을 수 있는 수수료임

그래서 이 유동성을 공급하는 유동성 공급자들 (LP)은 자기가 공급한 유동성만큼 수익(수수료의 일부)을 받게 됨

그러니까 사람들이 토큰 교환이 많이 일어날 것 같은 컨트랙트에 돈을 많이 집어넣음
돈을 많이 집어넣게 되면 유동성이 공급되니까 교환 비율이 쉽게 바뀌지 않을 것
그러면 사람들이 토큰을 안정적으로 교환할 수 있게 됨 이런식으로 구성 되어 있음


그래서 사람들이 유동성을 공급할 유인이 충분하게 있는 것. 그래서 LP 토큰이 중요함!

그런데 요즘에는 조금 달라짐 왜냐하면 사람들이 이 LP 토큰 역시 자산으로 보기 시작 했기 때문
이 LP 토큰을 이용해서 LP 토큰을 예치하면 LP 토큰에 대한 수수료를 또 주겠다는 사람들이 나타난 것
채권을 받아와서 그것을 담보로 새로운 것을 만들어내고 그걸 또 담보로 새로운 걸 만들어내고
이런 일들이 요즘에 DeFi 서비스에서 많이 나오고 있음

 

 

 

 


Uniswap의 성장
Funding rounds
- 유니스왑은 2018년 11월 EF(ethereum Foundation)로 부터 $100,000의 grant를 받았다.
- 2019년 4월에 Paradigm으로 부터 seed 투자로 $1.82 million을 받아 $5 million valuation을 달성하였다.
- 2020년 6월에는 A8Z(Andreessen Horowitz), Union Square Ventures등으로부터 $11million Series A 투자를 받았다.
그래서 유니스왑은 현재 굉장히 valuation이 높아졌음

유니스왑의 장점 유니스왑은 타 거래소들에 비해서 수수료가 굉장히 저렴함

타 거래소들은 기본적으로 ERC20 이면

그 토큰 컨트랙트에서 일어나는 거래 수수료 + 이 서비스 컨트랙트에서 일어나는 일들에 대한 수수료

가 더해져서 들어가는데
유니스왑은 AMM으로 자동적으로 거래 비율을 정하기 때문에 그 수수료가 좀 싼 편

ETH to ERC20, ERC20 to ETH, ERC20 to ERC20 이 세가지 경우에 대해서 모든 경우에서 유니스왑이 수수료가(gas)가 가장 적게 듬
EtherDelta, IDEX 이런 애들은 호가창이 있는 거래소들 <- 얘네들은 거래 수수료가 좀 많이 듬
Bancor는 AMM을 쓰긴 하는데 수수료 많이 드는 편 뭐 암튼 다른 애들 다 많이 듬



https://uniswap.org
https://app.uniswap.org
유니스왑 Dapp

 

Uniswap Interface

app.uniswap.org

 

 

UNISWAP 3 : 유니스왑 V2 백서보기

 

' :D > block chain' 카테고리의 다른 글

UNISWAP 4 : 유니스왑 V2 코드 분석(1)  (0) 2022.03.17
UNISWAP 3 : 유니스왑 V2 백서  (0) 2022.03.15
UNISWAP 1 : 유니스왑이란?  (0) 2022.03.14
[Solidity] 가스(Gas)  (0) 2022.02.16
[Solidity] 컨트랙트의 불변성  (0) 2022.02.16