일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 솔리디티
- 투표
- 재진입
- 멀티시그
- 배팅
- 일시정지
- RBAC
- 프록시패턴
- 디자인 패턴
- 스테이트머신패턴
- git commit
- 업그레이더블 컨트랙트
- 웹툰
- 팩토리패턴
- 블록체인
- 옵저버패턴
- 코드스테이츠
- 인센티브 기반 커뮤니티
- 코드리뷰
- 토큰노믹스
- 싱글톤패턴
- 회로차단
- github
- git add
- 부트캠프
- 팀 프로젝트
- 트러블슈팅
- solidity
- github 에러
- Today
- Total
보다 더 생생한 기록
[Solidity] UniSwap v2 - 이론 정리 본문
현재 Defi 애플리케이션에서 큰 축을 맡고 있는 UniSwap v2와 v3를 분석한 뒤,
가이드에 따라 컨트랙트를 구현해보려한다.
What Is UniSwap?
기존 DEX(Decentralized Exchange, 암호화폐 탈중앙 거래소)의 문제점들(높은 가스비, 부족한 유동성, 낮은 확장성)을 해결하고자 등장한 탈중앙 거래소.
가스비의 주요 원인인 오더북(거래를 걸어 놓거나, 취소할 때마다 가스비 지출)을 제거하고, AMM(Automated Market Maker) 알고리즘을 도입하여 사용자들의 거래를 자동으로 체결하도록 만들었다. 또한 거래 시마다 발생되는 수수료의 대부분을 유동성 공급자들에게 제공해 줌으로써, 상당한 규모의 유동성을 획득할 수 있었다.
How To Work?
AMM의 작동원리
자동으로 거래를 체결하기 위해 적용된 AMM을 구성하는 주요 요소는 가격 결정 알고리즘, 유동성 공급자, 토큰 페어, 그리고 트레이더(토큰을 스왑 하는 사용자)가 있다. 가격 결정 알고리즘으로 CPMM(Constant Product Market Maker)이라고 하는 모델을 사용하고 있다. 이는 X*Y = K 로 표현되고 상수인 K 값이 곱의 형태로 불변하게 X와 Y값이 결정되어야 한다.
CPMM 예시
이더리움(X) 10개와 ERC-20(Y) 토큰 200개가 교환 풀에 있다고 가정합니다. 이 둘의 곱은 2000(K)입니다. 이에 모든 교환에 있어 두 디지털자산의 곱은 2000을 유지해야 합니다. 이러한 상황에서 ERC-20 토큰을 구매하기 위해 1 ETH를 보내면 컨트랙트의 이더리움 수량이 10개에서 1개가 더 추가되어 11개로 변합니다. K는 2000으로 일정하므로 ERC-20 토큰의 수량은 181.82(2000/11)로 변합니다. 다시 말해 1 ETH를 주고받는 ERC-20 토큰의 양은 18.18(200-181.82)인 것입니다.
나머지 구성요소
- 토큰 페어: 거래되는 토큰 쌍을 의미한다. 예를 들어, 거래소에서 KRW로 ETH를 구매하거나 ETH를 KRW로 판매하는 것은 모두 ETH/KRW 페어에서 거래를 하는 것이다. 이 토큰 페어로 구성된 유동성을 풀(Pool)이라고 한다.
- 유동성 공급자: 토큰 페어를 이루는 두 가지 토큰에 대한 유동성을 풀에 공급하는 주체를 의미한다. 이렇게 공급된 유동성은 AMM의 가격 결정 알고리즘에 따른 가격으로 거래된다.
- 트레이더: 토큰 페어를 이루는 두가지 토큰을 거래하는 주체를 의미한다. 트레이더는 유동성 공급자가 조성한 유동성을 바탕으로 거래를 할 수 있다.
Slippage 발생
위의 CPMM 예시를 이어서 사용해 보자.
- 이더리움(X) 10개와 ERC-20(Y) 토큰 200개가 교환 풀에 있다고 가정합니다. 이 둘의 곱은 2000(K)입니다. 이에 모든 교환에 있어 두 디지털자산의 곱은 2000을 유지해야 합니다. 이러한 상황에서 ERC-20 토큰을 구매하기 위해 1 ETH를 보내면 컨트랙트의 이더리움 수량이 10개에서 1개가 더 추가되어 11개로 변합니다. K는 2000으로 일정하므로 ERC-20 토큰의 수량은 181.82(2000/11)로 변합니다. 다시 말해 1 ETH를 주고받는 ERC-20 토큰의 양은 18.18(200-181.82)인 것입니다.
예시를 보면, 거래 이전의 1ETH 가격은 20 토큰이었지만, 막상 거래를 하고 나니 1ETH당 18.18의 가격으로 거래가 되었다. 이처럼 거래하려 했던 가격과 실제 거래 가격사이에 차이가 발생하는 것을 Slippage(슬리피지)라 하고 CPMM의 특성상 슬리피지가 존재할 수밖에 없다.
Slippage 줄이는 방법?
풀에 공급된 유동성의 양이 클수록 슬리피지는 0으로 수렴해 간다 (유니스왑 v3에서 이를 좀 더 보완한다). 이를 확인하기 위해 서로 다른 조건으로 실험을 진행한다.
100 ETH와 100 DAI가 공급되어있는 풀에서, 1000 DAI를 주고 ETH를 구매하고자 한다.
결론 : 1000DAI 당 100ETH를 기대했지만 Slippage 발생으로 50ETH 밖에 안됨.
첫 번째예시로부터 유동성 규모를 1000배 늘려 10,000 ETH와 100,000 DAI가 공급되어있는 풀에서, 첫번째 예시의 결과인 50ETH를 구매하고자 한다.
결론 : 50ETH를 503DAI에 구매할 수 있었음. 즉 기존 가격 1ETH 당 10DAI라는 수치와 거의 유사한 수준에서 거래가 체결됨.
추가 내용 (23.06.07)
Uniswap v1 vs Uniswap V2
이더(ETH)는 이더리움의 기축통화이며, ERC20 토큰은 EIP20 표준에 맞게 스마트 컨트랙트를 통해 발행됩니다. ERC20은 표준 스펙대로 만들어진 경우 동일한 구조를 가지고 있으나, 이더는 ERC20 표준이 생기기 전에 만들어졌기 때문에 ERC20 표준 토큰과 다른 구조를 가지고 있습니다.
따라서 ETH-ERC20 스왑은 일반적인 ERC20-ERC20 스왑과는 전혀 다른 메커니즘을 사용할 수밖에 없습니다.
그래서 유니스왑 V1을 만들 당시에는 ETH-ERC20 유동성 풀을 만들 것인지, ERC20-ERC20 유동성 풀을 만들 것인지 선택해야 했습니다.
유니스왑은 기축통화인 이더를 포기할 수 없었기 때문에, 결국 ETH-ERC20 유동성 풀을 선택하게 됩니다.
참고
https://medium.com/@aiden.p/uniswap-series-1-유니스왑-이해하기-e321446623c7
[UNISWAP SERIES] 1. 유니스왑 이해하기
유니스왑과 AMM을 쉽게 이해해보자. Reviewed by 정현, 오영택
medium.com
https://m.upbitcare.com/academy/education/blockchain/50
유니스왑은 어떻게 작동할까? - 업비트 투자자보호센터
유니스왑 작동원리 이더리움과 ERC-20 토큰 간의 자동 교환 거래를 용이하게 하도록 설계된 탈중화 거래소(DEX)인 유니스왑에서는 디지털자산 간의 교환(swap) 기능을 구현하기 위하여 중앙화권 거
m.upbitcare.com
https://m.upbitcare.com/academy/education/blockchain/49
유니스왑이란 무엇인가? - 업비트 투자자보호센터
유니스왑이란? 유니스왑은 이더리움과 ERC-20 토큰 간의 자동 교환 거래를 용이하게 하도록 설계된 탈중앙화 거래소(DEX)입니다. 온-체인에서 탈중심화 지갑만 설치하면 유니스왑을 이용할 수 있
m.upbitcare.com
'블록체인' 카테고리의 다른 글
[Solidity][코드리뷰] Lazy Minting in OpenSea (오픈씨내에서의 레이지민팅) (0) | 2023.01.13 |
---|---|
[Solidity] 크립토좀비 Ch1,2 정리 (0) | 2022.12.26 |
[Solidity] Lazy Minting 코드 분석 (0) | 2022.11.16 |
CORS / OPTIONS / preflight (0) | 2022.11.10 |
[코드리뷰] Project 2 - 인센티브 기반 커뮤니티 (1) | 2022.11.10 |