티스토리 뷰
(1) Routing in AMM
라우터? 라우팅(Routing)이란 무엇일까요
라우팅(영어: routing)은 어떤 네트워크 안에서 통신 데이터를 보낼 때 최적의 경로를 선택하는 과정이다. 최적의 경로는 주어진 데이터를 가장 짧은 거리로 또는 가장 적은 시간 안에 전송할 수 있는 경로다. 라우팅은 전화 통신망, 전자 정보 통신망, 그리고 교통망 등 여러 종류의 네트워크에서 사용된다. 이 글은 패킷 스위칭 기술을 이용한 컴퓨터 네트워크에서의 라우팅에 대해 주로 기술한다. [출처- 위키백과]
AMM에서는 어떤 의미일까요?
Routing은 DApp의 유저들이 거래하고 싶은 자산쌍(pair of asset)의 LP가 없을 때,
라우터 컨트랙을 다수의 트레이드를 만들어서, 유저가 트레이드를 가능하게 해준다고 합니다. 예시와 함께 살펴봅시다.
1) 중개 토큰이 없는 경우
Buyer가 DAI토큰을 LINK토큰으로 바꾸고 싶어합니다.
하지만 DAI-LINK LP가 없습니다. 즉 DAI를 LINK로 바로 스왑할수 있는 풀이 없습니다.
이럴때 Router Contract이 이를 해결해줍니다. 속담에 '모로 가도 서울만 가면 된다' 라는 말이 있듯이, DAI를 LINK로 바꾸기 위해서 DAI -> BAT -> MKR -> LINK의 과정을 거쳐서 결국 DAI를 LINK로 바꾸는 거죠. 이러한 스왑 모든 과정에 관여하는 것이 결국 Uniswap V2의 Router Contract입니다.
2) 중개 토큰이 있는 경우
ETH이라는 중개 토큰을 가지고 있는 경우 DAI -> ETH -> LINK의 과정을 거쳐서 스왑합니다.
이정도로 마무리하고 이후 포스팅에서 코드를 보면서 자세히 다뤄보겠습니다.
(2) Pricing_CPMM(Constant Product Market Maker)
x*y=k
라는 식으로 설명할수 있는 Uniswap의 Pricing 시스템입니다. 예시를 들어서 설명을 해보겠습니다.
이 거래를 예시로 들어보겠습니다.
위의 그래프와 함꼐 보시면 됩니다. 위 그림은 수수료 제외 상황입니다.
사용자는 1 ETH를 OMG로 스왑하고 싶어하는 상황입니다.
1. Old Position
먼저 현재 LP에는 10 ETH와 500 OMG(ERC20)는 유동성 공급자에 의해 스마트 계약에 예치됩니다.
ETH(x) = 10, OMG(y) = 500, k = 5000인 상황입니다.
(쉽게 설명한 비유 형식입니다.)
2. Swap : A token Spent
사용자는 Swap을 요청했습니다. ETH 1개를 OMG로 스왑할려고 스왑 신청을 걸었습니다.
유동성 제공자에게 제공되야 하는 보상이 필요하므로, 수수료를 뜯어갑니다. 이때 수수료를 0.25%라고 가정합시다.
그러면 수수료를 제외한 99.75%의 ETH, 즉 1 *0.9975 = 0.9975ETH가 풀에 들어가므로
ETH풀 속 ETH의 양은 총 10 + 0.9975 = 10.9975ETH가 됩니다.
그러면 먼저 LP속 ETH은 10에서 11이 될겁니다. 이때 OMG를 얼마나 받아야 할까요?
3. Swap : B token gained
x*y=k(5000)이여야 하죠? 간단하게 k/x = 5000/10.9975 = 454.65, 즉 OMG 풀에는 454.65OMG가 들어간다.
k도 변경이 된다. (454.65 * 11 =5001.15)
그리고 구매자는 500 - 454.65 = 45.35OMG를 받습니다.
eth_pool: uint256
token_pool: uint256
token: address(ERC20)
@public
@payable
def ethToTokenSwap():
fee: uint256 = msg.value / 500
invariant: uint256 = self.eth_pool * self.token_pool
new_eth_pool: uint256 = self.eth_pool + msg.value
new_token_pool: uint256 = invariant / (new_eth_pool - fee)
tokens_out: uint256 = self.token_pool - new_token_pool
self.eth_pool = new_eth_pool
self.token_pool = new_token_pool
self.token.transfer(msg.sender, tokens_out)
위 코드와 같은 방식으로 진행된다고 보면 됩니다.
수식으로는 이렇게 설명이됩니다.
다음 포스팅에는 v2-core code를 다뤄보겠습니다. 앞선 전반적인 내용이 코드로 어떻게 구현되어 있는지 확인해 보겠습니다.
'블록체인 > DeFi' 카테고리의 다른 글
[Uniswap v2] 정리_(4) V2-core code_UniswapV2Pair[1부] (0) | 2022.07.18 |
---|---|
[Uniswap v2] 정리_(3) V2-core code_UniswapV2ERC20(pair) (0) | 2022.07.14 |
[Uniswap v2] 정리_(1) Tradintional, AMM 기초 (0) | 2022.07.13 |
[2022학년도 여름방학 우수학부연구생 활동] DeFi 기본 용어 정리 (0) | 2022.07.13 |
[2022학년도 여름방학 우수학부연구생 활동] DeFi에 관하여 (0) | 2022.07.13 |
- Total
- Today
- Yesterday
- 무료민팅 주의사항
- SET APPROVAL FOR ALL
- the merge
- rugpull
- rug
- 비탈릭
- ERC4907
- AMM
- 부테린
- EIP-55
- KBW
- merge
- uniswap
- 더 머지
- Definancial
- UraniumFinance
- DeFi
- geth
- Uranium
- KBW2022
- MasteringEthereum
- 부테릭
- ecc
- premint
- 탈중앙화
- Order Book
- 이더리움
- go
- 공개키 암호화
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |