UniswapV2 동작 이해하기 (1)

Natreeum's Blog·2024년 6월 4일

UniswapV2 파헤치기

목록 보기
1/1
post-thumbnail

Uniswap V2 란?

CPMM

uniswapV2 에서는 CPMM (Constant Product Market Maker)을 사용합니다.
다른건 몰라도 이것만 알면 됩니다.

x * y = k

뭔가 복잡해보이는 이름에 걸맞지 않는 간단한 수식입니다.
매우 간단해 보여도 uniswapV2의 핵심이 되는 수식이니 잘 이해해야합니다.
위의 수식이 어떻게 사용되는지 예시를 통해 알아봅시다.

유동성(Liquidity)

유동성이란 거래를 위해 사용될 수 있는 자산을 의미합니다.

Swap

swap은 "교환"과 같은 의미입니다.

사과를 구매하려는 사람의 이야기로 예시를 들어보겠습니다.

금화를 1개 가지고 있는 사람A가 사과를 구매하려고 한다.

길을 가다 한 무인과일가게에 들어가서 보니
상자에 금화 100 개와 사과 101개가 들어있었다.

옆에 종이에는 이렇게 적혀있었다.

"상자에 남아있는 금화와 사과의 개수의 곱은 항상 10100 이어야합니다."

사람A 는 상자에 금화를 한개 넣고 사과를 하나 뺐다.

상자에 남은건 금화 101개와 사과 100개로 두 수의 곱은 10100으로 변함이 없다.

여기서 가장 핵심적이 되는 부분은 금화의 개수사과의 개수의 곱이 10100로 일정했다는 것입니다.
그렇다면 금화(x)와 사과(y)의 현재 개수를 알면 지불하는 금화(혹은 사과)의 양에 대해 수령하게 되는 사과(혹은 금화)의 양을 계산할 수 있다는 것입니다.

간단하게 수식으로 정리하면

  • reserve0(금화 개수) = r0
  • reserve1(사과 개수) = r1
  • k = r0 * r1
  • amount0In(지불하는 금액) = amt0In
  • amount1Out(수령하는 금액) = amt1Out

(r0 + amt0In)(r1 - amt1Out) = k

위 식을 다시 위의 사과예시에 대입해보면 다음과 같습니다.

k = r0(금화의 유동성=100) * r1(사과의 유동성=101) = 10100
(r0(금화의 유동성=100) + amt0In(A가 지불한 금화=1)) * (r1(사과의 유동성=101) - amt1Out(A가 받게 될 사과의 개수)) = k

Price Impact

CPMM 특성 상 같은 금액을 지불해도 유동성 풀 규모에 따라 받게되는 금액이 차이가 납니다.

50개의 token0 을 token1로 swap 하는 상황에서 예를 들어보겠습니다.

  • 금화가 100개, 사과가 1000개 라고 했을 때
    • 금화 : 사과 = 1 : 10
    • 금화 50개에 대한 사과의 기대수량 = 500개
    • 실제 스왑량
      • (100 + 50) * (1000 - 사과) = 100000
      • 사과 개수 ≈ 333.333
    • PriceImpact = (1 - 실제수량 / 기대수량) * 100 ≈ 33.33%
  • 금화가 10,000,000개, 사과가 100,000,000개 라고 했을 때
    • 금화:사과 = 1: 10
      • 금화 50개에 대한 사과의 기대수량 : 500개
    • 실제 스왑량
      • (10,000,000+50) * (100,000,000 - 사과) = 1,000,000,000,000,000
      • 사과 개수 ≈ 499.998
    • PriceImpact = (1 - 실제수량 / 기대수량) * 100 ≈ 0.0004%

유동성이 클 수록 기대수량에 대한 오차가 작아집니다.


유동성 공급/제거와 수수료에 대한 내용은 다음편에서..

profile
BlockChain DEV

1개의 댓글

comment-user-thumbnail
2025년 4월 16일

좋은 포스팅이네요! 잘 공부하고 갑니다. 감사합니다.

답글 달기