유니스왑 이모저모 살펴보기

Luke Park
CURG
Published in
9 min readSep 19, 2020

P2P 거래에서는 구매자와 판매자가 반드시 한 쌍 존재해야 하며, 이들의 희망 매매가격이 일치하는 경우에만 거래가 성사된다. 이는 물물교환에서부터 이어져 온 자연스러운 거래 형태로 보이지만, 실은 큰 가정을 기저에 두고 있다. 바로 시장이 충분한 유동성을 가지고 있다는 가정이다. 구매자나 판매자 어느 측이든 유동성이 충분하지 못한 상황에서는 거래가 쉽사리 성사되지 않는다.

반면 유니스왑은 유동성이 없는 환경에서도 ETH와 ERC20 토큰 간 거래를 가능하게 하는 프로토콜이다. 유니스왑에는 유동성 공급자와 구매자만이 존재하며, 구매자는 ETH를 토큰으로 혹은 토큰을 ETH로 교환하는 행위를 판매자 없이도 행할 수 있다. 이를 반복적으로 적용하면 ERC20 토큰을 다른 ERC20 토큰으로 교환할 수도 있다.

현시점에는 이미 유니스왑 v2가 릴리즈 되어 있지만, 본 글은 유니스왑 v1을 기준으로 하여 설명 및 실험을 진행하였다.

판매자 없이도 거래가 가능한 이유

유니스왑에는 판매자를 대신하여 풀(Pool)이라는 개념이 있다. ETH 풀은 ETH를 확보한 스마트 컨트랙트이며, 토큰 풀은 토큰을 확보하고 있는 스마트 컨트랙트로 간주할 수 있다.

ETH를 토큰으로 교환하고자 하는 구매자는 ETH 풀에 ETH를 전송한다. 그 후, 프로토콜에 의해 계산된 양의 토큰을 받는다. 반대의 경우도 마찬가지이다. 토큰을 토큰 풀에 전송하면, 프로토콜에 의해 계산된 양의 ETH를 받는다.

이렇듯 이미 돈이 예치되어 있는 풀을 사용한 덕분에 판매자의 존재 없이도 거래가 가능하다.

ETH를 토큰으로

유니스왑 프로토콜을 통해 ETH를 토큰(TKN)으로 교환해보자. 다음 그림 및 설명에서는 이해를 돕기 위해 거래 수수료를 제외했다. 수수료를 고려한 상황은 차차 살펴보도록 하자.

  • 현재 구매자가 바라보고 있는 풀의 상태는 State 1이다. ETH 풀에는 10 ETH가, 토큰 풀에는 500TKN이 들어있다.
  • 이 두 수량의 곱을 invariant 또는 constant product라 한다. 그림에서는 k로 표기했다. 이 수치는 일정하게 유지되어야 한다.
  • 구매자는 교환하고자 하는 1 ETH를 ETH 풀에 전송한다.
  • 다음 상태인 State 2에서는 ETH 풀의 값이 11이 된다.
  • k를 일정하게 유지하기 위한 TKN의 값은 5000/11=454.5이다. State 1의 500 TKN에서 State 2의 454.5 TKN이 되기 위한 차액은 45.5 TKN이다. 이 차액만큼을 구매자가 수령하게 된다.

토큰을 ETH로 교환하는 경우에도 동일하다.

핵심은 constant product인 k를 ‘곱’으로써 유지함에 있다. 그 때문에 만일 구매자가 더 많은 양의 ETH를 토큰으로 교환하고자 할 경우, 1 ETH 당 토큰 교환 수량은 낮아지게 된다. 이는 단기간 대량 교환을 어렵게 한다.

위 그림의 좌측은 ETH를 토큰으로 교환할 때, 1 ETH 당 토큰 교환 수량을 그래프로 나타낸 것이다(파란색 그래프). 쉽게 말해 더 많은 양의 ETH를 투입할수록 가성비가 떨어진다.

위 그림의 우측은 반대로 토큰을 ETH로 교환할 때, 1 토큰당 교환 수량을 나타낸 것이다. 마찬가지로 더 많은 토큰을 투입할수록 가성비가 떨어짐을 알 수 있다.

수수료를 고려하면

실제 유니스왑에서는 거래당 0.3%의 수수료가 부과된다. 이 수수료는 풀의 균형을 유지하고 유동성을 공급해주는 대가로 유동성 공급자에게 제공된다.

재미있는 것은 이러한 수수료가 직접적으로 유동성 공급자에게 전달되는 것이 아닌, constant product k를 증가시킴으로써 간접적으로 전달된다는 것이다. 자세한 내용은 유동성 공급자 챕터에서 다루도록 하고, 지금으로써는 k가 아주 살짝 증가한다는 정도로만 알아두자.

실제로 유니스왑 프로토콜을 구동해보며 k를 살펴보도록 하자. 유니스왑 v1과 이를 시뮬레이션 할 수 있는 코드를 파이썬으로 구현해 사용했다.

위 그래프는 1000번의 무작위 거래에 따른 ETH와 토큰(ERC20)의 풀 수량을 나타낸 것이다. 거래의 종류와는 무관하게(ETH->ERC20 또는 ERC20->ETH) 고정 수수료 0.3%가 부과되어 있다.

위 그래프는 동일한 거래들에 대해 k를 나타낸 것이다. 거래가 발생함에 따라 조금씩 증가하고 있음을 알 수 있다. 그러나 그 폭이 그렇게 크지는 않다(곧 다른 스케일에서 살펴볼 것이다).

유동성 공급자

유니스왑은 판매자가 없는 대신, 풀에 자원을 공급해줄 유동성 공급자라는 주체가 존재한다. 이들은 풀에 자금을 묶어둠으로써 0.3% 수수료에 대한 권리를 얻는다. 보다 정확하게, 유동성에 기여한 지분만큼 수수료를 가져갈 수 있다.

유동성 공급자는 ETH를 ETH 풀에, 그리고 동일한 가치의 토큰을 토큰 풀에 동시에 공급해야 한다. 그 대가로 유동성 토큰(Liquidity Tokens, LTs)을 발행받게 된다. 이 LT는 유동성에 대한 지분을 나타낸다. LT 발행 시 k의 값이 증가한다.

유동성 공급자가 묶어둔 돈을 다시 회수하고자 한다면 LT를 소각해야 한다. 이때, 거래로부터 조금씩 k의 값이 증가한 덕분에 유동성 공급자에게 이득이 발생한다. 이것이 바로 유동성에 기여한 지분만큼의 수수료 이득이다. LT 소각 시에는 k의 값이 감소한다.

다음은 실험을 통해 풀의 수량과 k의 값을 살펴본 것이다.

1000개의 거래가 발생한 이후, 유동성을 공급하였다. ETH와 토큰 양측 모두 수량이 증가했음을 알 수 있다. 다시 1000개의 거래 이후, 이번에는 유동성을 제거하였다. 풀 수량이 다시 조정되었음을 알 수 있다.

위 그래프는 동일한 과정을 k의 관점에서 바라본 것이다. 이전 챕터에서 살펴보았듯, x축의 0~1000 구간, 1000~2000 구간, 2000~3000 구간은 각각 거래에 의해 우상향하고 있다. 그러나 그 스케일이 작은 관계로 크게 눈에 띄지는 않는다.

유동성의 공급과 소각 과정에서의 k 값 변화는 두드러지게 나타난다. 이는 유동성을 공급함으로써 풀의 수량이 달라지기 때문에, 이들의 곱인 k 역시 크게 바뀌기 때문이다.

위 그래프는 묶어두는 ETH 양에 따른 LT의 발행 양을 나타낸 것이다. 선형적으로 증가하고 있음을 알 수 있으며, 이는 LT가 지분의 역할을 수행할 수 있음을 보이고 있다.

마지막으로 위 그래프는 수수료에 따른 유동성 공급자의 이익을 나타낸 것이다. 더 많은 수수료를 부과할수록 유동성 공급자의 이익이 선형적으로 증가함을 알 수 있다. 회색으로 표시한 지점은 실험에서 주로 사용한 0.3%(0.003)의 수수료를 나타낸다.

차익거래자

구매자나 유동성 공급자처럼 프로토콜에 직접적으로 나타나는 참여자는 아니지만, 유니스왑 프로토콜이 잘 유지되는 이유 중 하나로는 차익거래자를 들 수 있다.

이들은 유니스왑 풀과 외부 거래소 등의 미세한 가격 변동을 잘 살펴보다가, 유니스왑 상에서 토큰으로 ETH를 구매해 차익을 남길 수 있다고 판단될 경우 빠르게 거래를 진행한다. 반대로, ETH를 토큰으로 구매하는 게 이득일 경우에도 빠르게 거래를 진행한다.

가령 누군가가 토큰을 대량으로 구매해 풀에서 토큰의 공급이 현저히 낮아지고 ETH의 공급이 과잉될 경우, 차익거래자는 토큰으로 ETH를 구매해 외부 거래소 대비 저렴한 가격에 ETH를 구할 수 있다.

차익거래자는 개인의 이득을 위해서 행동하지만, 결과적으로는 풀의 균형을 맞춰주는 역할을 수행하는 셈이다. 이를 실험으로 살펴보자.

위 그래프는 풀의 상태와 차익거래가 이뤄진 시점을 나타낸 것이다. 회색 점선으로 표시된 시점이 바로 차익거래가 발생한 시점이다. ETH와 토큰 풀의 균형이 깨졌을 경우 차익거래를 진행함을 알 수 있으며, 그 효과로 풀의 균형이 맞춰짐을 알 수 있다.

이러한 차익거래는 충분히 빠르게 진행된다는 가정하에서는 절대로 손실을 보지 않기에, 항상 차익거래자의 잔고가 비감소함을 알 수 있다.

본 글에서는 시뮬레이션을 위주로 간단하게 유니스왑 v1 프로토콜에 대해 살펴보았다. 기존의 P2P 대출과는 달리 판매자가 필요 없으며, 충분한 유동성(풀의 수량)만 공급되어 있다면 어떤 시점에서든 알고리즘적으로 결정되는 가격에 교환을 수행할 수 있다.

또한 충분한 잔액을 갖춘 차익거래자의 존재를 가정하면, 풀의 균형이 안정적으로 유지됨을 보장할 수 있다.

본 게시글에서 사용한 유니스왑 프로토콜 파이썬 구현체나 시뮬레이션 코드는 다음 깃허브 링크에서 확인할 수 있다: https://github.com/lukepark327/uniswap-python

저자

박상현 (Luke Park)

🏠 서울대학교 가상머신 및 최적화 연구실
🖥 https://github.com/lukepark327
✉️ lukepark327@gmail.com

참고문헌

Zhang, Yi, Xiaohong Chen, and Daejun Park. “Formal Specification of Constant Product (x× y= k) Market Maker Model and Implementation.” URL: ht tp s://gi th ub. c om/r un ti me ve ri fi ca ti on/v er if ie ds ma rt-c on tr ac ts/b lo b/un is wa p/un is wa p/xy-k. p df, Accessed: December 30 (2018): 2019.

--

--