유니스왑의 CPMM 모델 알아보기(1)

Kevin Lee
bsp-asset
Published in
11 min readMar 3, 2022

--

본 글은 단순 정보 제공을 목적으로 하고 있으며 투자 권유를 목적으로 한 것이 아닙니다. 본 글의 내용에 대해서는 보증을 하지 않습니다. 실제로 투자를 진행할 때에는 본 글에 전면적으로 의거하여 투자 판단을 내리는 것을 삼가하여 주시기 바랍니다. 투자에 관한 결정은 본인의 판단에 달려 있습니다.

유니스왑(Uniswap) 소개

<유니스왑 로고. 출처 : commons.wikimedia.org>

유니스왑은 이더리움 기반의 DEX로, 다양한 이더리움 기반 토큰에 대해 스왑 서비스를 제공합니다. 시가총액은 수많은 스왑 서비스 중 큰 차이로 1위, 거래량은 dYdX와 1,2위를 번갈아 하고 있습니다.

<Defi 관련 프로젝트 중 시가총액 1위인 유니스왑. 출처 : coinlmarketcap.com>
<거래량 또한 dYdX와 1,2위를 다투고 있다. 출처 : coinmarketcap.com>

유니스왑의 스왑 서비스

유니스왑이라는 DEX의 특징은 스왑 기능으로, 우리가 일반적으로 아는 거래소의 모습과 다릅니다.

일반적인 거래소들은 ‘Order Book’이라는 개념이 있습니다. Order Book이란 말 그대로 체결되지 않은 주문을 모아둔 곳으로, 매수자와 매도자가 현재 가격이 아닌, 자신이 원하는 가격에 매수/매도 주문을 넣게 되면 Order Book에 등록이 됩니다.

예시로 바이낸스의 Order Book을 보도록 하겠습니다.

<바이낸스 거래소의 Order Book / 출처 : binance.com>

이와 같이, 투자자들이 원하는 가격에 매수/매도주문을 넣어 Order Book을 채우는 것을 알 수 있습니다.

이 상황에서 내가 비트코인을 ‘즉시’ 구입하고 싶다면, 이 Order Book에 있는 주문을 통해서만 비트코인을 구매할 수 있습니다. 비트코인을 매수하고 싶으면 그에 상응하는 매도자가 존재해야만 한다는 것이죠. 아무도 비트코인을 팔려고 하지 않으면 매수를 할 수 없는 구조입니다.

2019년 이전에는 기존 거래소의 UI를 본따 만든 DEX 프로젝트가 굉장히 많았습니다. 하지만 이러한 서비스들은 결국 잘 되지 못했는데요, 그 이유는 다음과 같습니다.

1. 많은 가스비가 소모됩니다. 내가 만약 특정 암호화폐를 매수하고 싶다면, 오더북에 맞춰서 암호화폐를 매수해야 하는데, 이 거래는 1번의 트랜잭션으로 일어나는 것이 아닙니다. 오더북에 매수/매도 주문을 올리는 것 또한 가스를 소모해야 하는데, 내가 올린 주문을 취소할 때도 가스가 소모되어 비효율적인 측면이 존재합니다.

2. 유동성 공급이 원활하지 않습니다. 결국 거래소에서 가장 중요한 것은 유동성입니다. 내가 원하는 양의 암호화폐를 사려면 시장가보다 10% 비싼 가격에 사야만 한다면 사람들은 그 거래소를 이용하지 않을 것입니다. DEX는 결국 Layer1 네트워크를 이용해야만 하기 때문에 중앙화된 거래소보다 접근성이 떨어집니다. 이 때문에 DEX의 호가창은 텅 비게 되고, 이러한 호가창을 보고 더 많은 유저들이 중앙화된 거래소로 이동하는 악순환이 나타나게 됩니다.

<유니스왑의 swap 서비스. 중앙화된 거래소와 다르게 간결한 UI를 자랑한다. 출처 : uniswap.org>

유니스왑은 이러한 문제를 해결하기 위해 스왑 서비스를 도입합니다.

스왑 서비스의 특징은 Order Book이 없고 대신 유동성 공급자라는 역할을 가진 유저들이 따로 존재합니다.

사실 일반적인 거래소에는 대부분 유동성 공급자들이 존재합니다. 유동성 공급자들은 현재 암호화폐의 가격보다 조금 싸게 매수 주문을 넣거나 조금 비싸게 매도 주문을 넣고, 실제로 그 거래가 체결되면 차익만큼 이익을 보게 됩니다. 거래소 입장에서는 Order Book이 차서 많은 유저들이 거래를 원활히 할 수 있게 되니 좋고, 유동성 공급자들은 그 중간에서 차익을 벌 수 있으니 좋습니다.

하지만 이는 계속해서 변화하는 가격에 따라 주문을 바꿔 넣어야 한다는 불편한 점이 있습니다. 그렇지만 유니스왑에서 이러한 유동성 공급은 자동화됩니다. 내가 유니스왑에서 유동성 공급을 하고 싶다면, 그냥 거래 페어에 맞춰 암호화폐를 예치해 두면 유동성 공급이 자동으로 이뤄지고 그에 따른 수익이 지급됩니다. 이러한 유동성 공급 방식을 AMM(Automated Market Maker)라고 부릅니다. 유니스왑은 이 AMM방식을 통해 사용성을 크게 개선하였습니다.

이러한 장점에 더해, 유니스왑은 자체 토큰을 유동성 공급자에게 지급하겠다고 선언하면서 많은 유동성 공급자들과 거래소 이용자들이 유니스왑에 참여해 급성장을 이루게 됩니다.

유니스왑의 AMM 방식 — CPMM

그렇다면, 이 유니스왑에서 거래 시 암호화폐의 가격은 어떻게 책정되는 것일까요? 또한 유동성은 어떠한 방식으로 공급되는 것일까요? 이에 대해 알아봅시다.

유니스왑은 기본적으로 X * Y = k라는 식을 통해 거래를 일으킵니다. 여기서 X, Y는 각각 유동성 풀에 들어가 있는 X토큰, Y토큰의 양입니다. 이렇게 X토큰의 양과 Y토큰의 양을 곱해서 항상 일정한 k가 나오는 모델을 우리는 CPMM(Constant Product Market Maker)라고 부릅니다.

CPMM 모델은 거래를 원하는 유저가 적은 양을 거래할수록, 유동성 풀의 크기가 클수록 보다 유리하게 거래를 할 수 있습니다. 그 이유를 아래에서 알아보도록 하겠습니다.

어떤 유저가 거래 풀에 X토큰을 넣고 Y토큰을 가져간다면 풀에 있는 X는 ΔX만큼 증가하게 되고, Y는 ΔY만큼 감소하게 됩니다. 이것을 식으로 나타내면 아래와 같습니다.

즉, 거래 이전의 풀에 있는 X토큰의 양과, Y토큰의 양, 그리고 풀에 새로 들어간 X토큰의 양을 알 수 있 으면 그에 따라 지급되는 Y토큰의 양을 알 수 있습니다.

예시를 하나 들어서 설명하도록 하겠습니다. 풀에 X토큰이 50개, Y토큰이 100개가 들어있다고 합시다. 여 기서 어느 유저가 X토큰 1개를 풀에 넣고 Y토큰을 가져가려고 합니다. 여기서 이 유저는 몇 개의 Y토큰 을 가져갈 수 있을까요?

위의 식에 값들을 그대로 대입해 주면,

이 값을 계산해보면 ΔY는 1.9608이 나옵니다. 즉, X토큰 1개를 풀에 넣으면 1.9608개의 Y토큰을 가져갈 수 있다는 것입니다.

다른 예시를 하나 더 봅시다. 이번에는 더욱 많은 양의 X를 교환하려고 시도해 보겠습니다. 위와 동일하게, 풀에 X토큰이 50개, Y토큰이 100개가 들어있다고 합시다. 여기서 어느 유저가 X토큰 50 개를 풀에 넣고 Y토큰을 가져가려고 합니다. 여기서 이 유저는 몇 개의 Y토큰을 가져갈 수 있을까요?

위의 식에 값들을 그대로 대입해 주면,

이 값을 계산해보면 ΔY는 50이 나옵니다. 즉, X토큰 50개를 풀에 넣으면 50개의 Y토큰을 가져갈 수 있다는 것입니다.

여기서 평균 교환 가격은 ΔY/ΔX = 50/50 = 1이 됩니다. 앞서 같은 상황에서 X토큰 1개의 교환을 요청 했을 때는 교환비가 1.9608이었는데, 교환비가 크게 좋지 못합니다. 이처럼 풀에서 제공하는 유동성이 한정되어 있는 상황에서 유동성 풀 규모에 비해 큰 스왑 거래를 요구하게 되면 좋지 않은 교환비로 교환을 할 수밖에 없게 됩니다.

이것을 수학적으로 살펴보도록 하겠습니다.

위의 곡선은 x * y = k 그래프이고, 파란색 두 직선은 x * y = k 그래프의 특정 지점에서의 접선입니다. 유동성 풀의 X토큰 개수가 증가하면 유동성 풀의 Y토큰은 x * y = k에 따라서 개수가 감소하게 되는데, 특정 위치에서의 교환비(가격)은 𝑑𝑦/𝑑𝑥 입니다. 교환비라는 것은 x를 유동성 풀에 넣었을 때 y가 몇 개 나오는지를 의미하는 것이고 이 특정 점에서의 이 x과 y의 비율은 𝑑𝑦/𝑑𝑥 로 계산할 수 있기 때문입니다. 이것은 특정 위치의 x * y = k의 접선의 기울기입니다. 위 계산에서는 파란 선으로 표시해둔 선의 기울기를 의미합니다.

x * y = k 그래프의 기울기의 크기는 kx^-2로 x값이 커지면 커질수록 작아지게 됩니다. 기울기가 작아진다는 말은 같은 양의 X토큰을 내도, 더 적은 양의 Y토큰을 받는다는 얘기로 교환비가 좋지 않아진다는 얘기입니다.

맨 초기값인 x = 50을 대입하면 x = 50에서의 기울기의 크기는 2로 교환비가 2라는 것입니다. 하지만 x =100에서의 기울기는 0.5로 x = 100에서 y토큰으로 스왑을 하려면 0.5라는 교환비로 Y토큰을 받게 됩니다.

그렇다면 이제 유동성 풀에 들어 있는 X토큰의 개수와 Y토큰을 개수를 늘려 유동성 풀의 규모를 키운 뒤 거래를 해 보겠습니다. 이전 예시에서는 풀에 X토큰이 50개, Y토큰이 100개였으나 이제는 풀에 X토큰이 100개, Y토큰이 200개가 있다고 생각합시다.

여기서 유저가 X토큰 50개를 풀에 넣고 Y토큰을 가져간다면 몇 개의 Y토큰을 가져갈 수 있을까요?

ΔY는 66.67이 나옵니다. X토큰 50개를 넣으면 Y토큰 66.67개를 가져갈 수 있습니다.

여기서 평균 교환 가격은 ΔY/ΔX = 66.67/50 = 1.33으로 이전 예시의 1보다 좋아졌습니다. 이는 풀에 유동성이 증가했기 때문입니다.

아래의 빨간색 곡선은 X=50, Y=100인 유동성 풀이고, 위의 파란색 곡선은 X=100, Y=200인 유동성 풀입니다. 각각의 점선을 비교해 보면 파란색 점선의 기울기의 변화가 빨간색 점선보다 작은 것을 알 수 있습니다. 각 점에서의 기울기의 크기는 특정 지점에서의 교환비이고, 당연히 파란색 그래의 각 점에서의 기울기 변화가 빨간색보다 작으므로 같은 양을 교환했을 때 가격 변화도 적을 것을 그래프를 보고 알 수 있습니다.

수수료를 포함한 CPMM 계산

기본적인 CPMM의 방식은 위와 같지만, 유니스왑은 거래자들에게 수수료를 받고 있씁니다.

유니스왑의 수수료는 일반적으로 0.3%고, 스테이블 코인은 0.05%, 그리고 변동성이 심한 크립토는 1%의 수수료를 책정하고 있습니다.

이렇게 책정된 수수료를 CPMM과 함께 계산하게 되면 실제로 거래가 발생할 때의 교환비를 구하는 식은 아래와 같습니다.

이 수식을 해석하면 다음과 같습니다. 기존의 식에서는

이기 때문에

가 성립합니다.

가 되기 때문입니다.

하지만 수수료를 추가시킨 𝑦 − ∆𝑦는 다음과 같습니다.

여기서, 1-p가 1보다 작기 때문에 항상 아래 식이 성립합니다.

여기서, 아래와 같은 결론을 내릴 수 있습니다.

즉, 기존의 식에서는 𝑥 × 𝑦 = 𝑘 가 항상 일정했으나, 수수료가 포함된 식에서는 𝑥 × 𝑦 가 계속 커지게 됩니다.

𝑥 × 𝑦가 계속 커지게 되는 이유는 유니스왑에 계속해서 수수료가 쌓이고, 이 수수료가 𝑥 × 𝑦를 계속해서 키우기 때문입니다. 이렇게 얻게 된 수수료는 프로토콜 수수료로 UNI 토큰 보유자들에게 가는 일부 수수료를 제외한 후 기존의 유동성 공급자에게 균등하게 돌아가게 됩니다.

다음 글에서는 유니스왑 V3부터 적용된 ‘유동성 집중화’에 대해 알아보고, 어떻게 유동성 집중화에 사용되는 수식을 구하는지 알아보도록 하겠습니다.

함께 리서치를 진행한 Donggun LEE에게 감사의 말씀 전합니다 :)

--

--

Kevin Lee
bsp-asset

Prev. a41 Researcher | Korea Univ. | Blockchain Valley