티스토리 뷰


(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를 다뤄보겠습니다. 앞선 전반적인 내용이 코드로 어떻게 구현되어 있는지 확인해 보겠습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함