안녕하세요. 스마트컨트렉트 개발자 개발이 체질의 최원혁입니다.
이번 게시글에서 소개해드릴 DeFi Series는 Constant Product Market Maker(CPMM) 알고리즘입니다.
주로 탈중앙화 거래소(DEX)에서 디지털 자산(암호화폐, 주식 등)의 가격을 형성할 때 사용하는 알고리즘 공식입니다. 암호화폐 시장의 1위 DEX인 유니스왑에서 사용하여 대중에게 알려진 공식으로, 기존의 거래소에 적용됐던 오더북 알고리즘을 벗아나 새로운 알고리즘을 통해 사용자들의 거래를 자동으로 채결하는 프로세스를 만들었습니다. 지금부터 탈중앙화 거래소에 사용되는 Constant Product Market Maker(CPMM) 공식을 수학적으로 알아보겠습니다.
기존의 거래소는 암호화폐를 사는 사람(매수자)과 파는 사람(매도자)을 매칭시켜주는오더북(Order Book) 알고리즘을 고집했습니다. 오더북은 사용자들의 공급과 수요에 의해 자연스럽게 가격이 형성하여 거래소는 거래 매칭 수수료를 받아가는 구조입니다. 때문에 거래소가 가지는 위험부담이 적고 굳이 노력하지 않아도 거래의 장이 형성되기에, 기존의 거래소는 오더북 알고리즘을 선호했습니다. 하지만 오더북은 거래소의 매칭으로 거래가 성사되기에, 사람 와 사람이 직접 거래하는 구조는 아닙니다. 즉, 중앙화된 거래소를 뜻합니다.
Constant Product Market Maker(CPMM)은 Automated Market Maker(AMM)를 구현하기 위한 여러 가지 알고리즘 중 하나입니다. AMM은 말 그래로 자동화된 마켓을 만드는 역할입니다. 중개인 또는 제3자의 개입 없이, 사람과 사람이 서로 문제없이 거래할 수 있는 생태계 구축을 뜻합니다. 때문에 AMM은 탈중앙화 거래소 플랫폼을 구축하기 위해 거래소가 꼭 갖춰야 할 가치입니다.
지금까지 AMM을 구현하기 위해 수많은 탈중앙화 거래소 플랫폼은 다양한 알고리즘을 개발했고, 오늘날 CPMM 공식 알고리즘이 탄생하게 되었습니다.
거래소란 가치를 가진 두 가지 자산을 거래하는 거래의 장을 여는 곳입니다. 이때 두가지 자산을 묶어 형성된 거래의 장을 유동성 풀이라고 합니다. 유동성 풀을 제공하는 유동성 제공자(LP : Liquidity Procider)는 해당 유동성에서 거래가 이뤄질 때마다 설정된 수수료를 보상으로 받게 됩니다.
CPMM의 공식은 X * Y = K입니다. 여기서 X와 Y는 유동성 풀에 묶인 두 가지 자산의 총 공급량을 뜻합니다. K는 CPMM의 가장 중요한 역할을 하며, 두 자산의 공급량을 곱하여 결정된 상수 값으로, 특정 상황 외에 절때 변하지 않는 값입니다.
지금부터 CPMM이 적용된 탈중앙화 거래소를 이용할 때 발생하는 수학적 공식에 대해 알아보겠습니다.
거래를 통해 받게 될 자산의 금액 계산 방법
Alice라는 사람이 USDC/MTK 유동성 풀에서 MTK(My Token)로 USDC를 거래하려고 합니다.
- X : MTK/USDC 유동성 풀에서 MTK 토큰의 총 공급량
- Y : MTK/USDC 유동성 풀에서 USDC 토큰의 총 공급량
- dx : Alice가 거래를 하기 위해 지출한 MTK의 금액
- dy : Alice가 거래하여 받게 될 USDC의 금액
Alice의 거래 전 MTK/USDC 유동성 풀 :
Alice의 거래 후 MTK/USDC 유동성 풀 :
위 예시 Alice가 dx만큼의 MTK 토큰으로 dy 만큼의 USDC를 거래한 것처럼, 거래하려는 사람은 CPMM공식을 통해받게 되는 금액이 정해집니다. 그러면, 얼마만큼의 dx를 제공해야 얼마만큼의 dy를 받게 되는지 알아보겠습니다.
결과적으로 CPMM 공식을 통해 거래자가 받게 될 금액(dy)는 위 공식과 같습니다.
우리는 공식 (1)과 공식 (2)를 통해 (4)를 증명할 수 있습니다.
CPMM의 특징인 상수 K를 활용하여 공식(5)으로 풀어내면 (3) 공식을 증명하여, 거래자가 받게 되는 dy 금액을 계산할 수 있습니다.
유동성 제공자(LP)가 유동성을 추가할 때 공급량 계산 방법
유동성 풀에 제공된 두 자산의 가격(P)은 두 자산의 공급량에 따라 결정됩니다.
CPMM의 공식 X * Y = K에서, X와 Y를 통해 X의 자산가격이 결정됩니다.
Example
X : MTK/USDC 유동성 풀의 MTK 총 공급량 = 15,000,000 개
Y : MTK/USDC 유동성 풀의 USDC 총 공급량 = 3,000,000 개
P : MTK(기준)의 가격 = 3,000,000 / 15,000,000 = 0.2 USDC
이때 만약 유동성 제공자가 유동성 풀에 X토큰의 공급량만 추가하게 MTK의 가격은 떨어지게 됩니다. 이는 유동성 제공자에 의해 가격이 조작되거나 시장의 공급량을 조작할 수 있기에, 탈중앙화의 가치를 위배하는 기능입니다.
때문에 유동성 제공자가 유동성을 추가할 때, 가격 P가 유지될 수 있는 X와 Y 일정한 비율의 공급량을 추가해야 합니다.
- X : MTK/USDC 유동성 풀에서 MTK 토큰의 총 공급량
- Y : MTK/USDC 유동성 풀에서 USDC 토큰의 총 공급량
- dx : LP가 MTK/USDC 유동성 풀에 추가할 MTK 토큰의 총 공급량
- dy : LP가 MTK/USDC 유동성 풀에 추가할 USDC 토큰의 총 공급량
즉, 유동성 공급자 LP는 유동성을 공급하기 위해 위 (7) 공식의 규칙을 따라야 합니다.
유동성을 공급할 때, 유동성 풀의 두 가지 토큰 중 하나의 공급량은 LP에 의해 정해집니다. 정해진 공급량으로 다른 한쪽을 얼마나 공급해야는지 계산하게 됩니다.
만약 X 토큰의 유동성 공급량(dx)을 안다면 (8) 번 공식으로 계산이 됩니다.
만약 Y 토큰의 유동성 공급량(dy)을 안다면 (9) 번 공식으로 계산이 됩니다.
Example
Alice는 MTK/USDC 유동성 풀에 MTK 토큰을 10,000,000(dx) 개 추가하려고 합니다. 그럼 현재 유동성풀에 USDC는 얼마나(dy) 공급해야 할까요?
X : 현재 MTK/USDC 유동성 풀의 MTK 총 공급량 = 15,000,000 개
Y : 현재 MTK/USDC 유동성 풀의 USDC 총 공급량 = 3,000,000 개
Alice가 토큰 MTK 10,000,000개(dx)를 공급하기 위해선 USDC 2,000,000개(dy)를 같이 공급해야 합니다.
유동성 제공자(LP)가 유동성을 추가할 때 유동성 계산 방법
지금까지는 CPMM이 적용된 유동성풀에서 토큰의 개수가 변하는 계산법을 알아봤습니다. CPMM 공식으로 토큰의 개수에 대한 계산법은 실직적으로 트레이더와 유동성 제공자에게 실용적인 계산입니다. 내가 받게 될 토큰의 양을 알 수 있고, 내가 제공해야 하는 유동성 공급량을 계산할 수 있기 때문입니다. 유동성 계산은 AMM을 설계하기 위해 필요한 공식이라고 할 수 있습니다. 지금부터는 유동성을 계산해 보겠습니다.
유동성 이란? : 어떤 특정 상품 또는 서비스를 다른 가치로 전환할 수 있는 성질
AMM에서 유동성은 X자산을 Y자산으로 전환할 시, 기준이 되는 성질입니다. 암호화폐 탈중앙화 거래소에서 토큰유동성이라고도 불립니다.
Example
X : 현재 MTK/USDC 유동성 풀의 MTK 총 공급량 = 4,000 개
Y : 현재 MTK/USDC 유동성 풀의 USDC 총 공급량 = 1,000 개
L : 현재 MTK/USDC 유동성 풀의 토큰 유동성 = √4,000 * 1,000 = 2,000
만약 유동성 제공자(LP)가 유동성을 추가할 때, 유동성은 어떻게 변할까요?
우리는 위 내용에서 유동성 추가 규칙에 대해 배웠습니다. 유동성을 추가한다는 건 공급량을 추가한다는 뜻이며, 유동성 또한 공급량처럼 일정 비율에 맞춰 증가되야 합니다.
- X : MTK/USDC 유동성 풀에서 MTK 토큰의 총 공급량
- Y : MTK/USDC 유동성 풀에서 USDC 토큰의 총 공급량
- dx : LP가 MTK/USDC 유동성 풀에 추가할 MTK 토큰의 총 공급량
- dy : LP가 MTK/USDC 유동성 풀에 추가할 USDC 토큰의 총 공급량
- L0 : 공급량 추가 전 유동성
- L1 : 공급량 추가 후 유동성
- T : 전체 유동성(=L0)
- s : 추가될 유동성(T+s = L1)
우리가 확인해야 하는 부분은 공급량이 추가될 때, 유동성 수치의 변화입니다. 유동성이 변하게 된다면, 위와 같은 공식으로 설명할 수 있습니다. 공급량이 추가된 후, 유동성(L1)을 알기 위해선 추가되는 유동성(s)을 확인해볼 필요가 있습니다
(12)를 재정의하여 s의 공식(13)을 정리할 수 있습니다.
(11)에서 정희한 유동성 공식을 통해 우리는 공급량 추가 전 유동성과 공급량 추가 후 유동성을 (15) 공식으로 구할 수 있습니다.
우리는 공식 (15)를 활용하여 (14)를 재정의하여 (16) 공식을 정의할 수 있습니다.
(12) 공식 규칙을 통해 dy의 변수를 재정의하여 (17) 공식으로 정리할 수 있습니다.
공식(17)의 첫 번째 긴 로직을 보면 Y가 공통적으로 들어가기에 묶어 주어 (18)로 공식을 재정의 합니다.
(16) 공식의 결과는 (19)로 정의할 수 있었습니다.
결론적으로 우리가 알고 싶었던 추가되는 유동성(s)은 (20) 공식으로 정의할 수 있습니다.
유동성 제공자(LP)가 유동성을 제거할 때 유동성 계산 방법
유동성 제공자(LP)가 더 이상 유동성을 제공하지 않을 경우, 유동성 풀에 묶여있는 자산을 인출할 수 있습니다.
물론 전체제거를 할 경우에 따로 계산할 필요는 없지만, 유동성풀의 토큰 일부만 인출할 경우, 마찬가지로 두 자산의 비율을 유지하기 위해 다른 하나의 토큰 또한 일정 비율에 맞게 인출하게 됩니다. 이때 유동성 풀에서 제거되는 유동성을 계산하는 공식에 대해 알아보겠습니다.
- X : MTK/USDC 유동성 풀에서 MTK 토큰의 총 공급량
- Y : MTK/USDC 유동성 풀에서 USDC 토큰의 총 공급량
- dx : LP가 MTK/USDC 유동성 풀에 제거할 MTK 토큰 양
- dy : LP가 MTK/USDC 유동성 풀에 제거할 USDC 토큰 양
- L : 제거되기 전 유동성
- a : 제거되는 유동성
- T : 전체 유동성(=L)
- s : 제거되는 유동성(=a)
CPMM에서 정의한 유동성은 (21) 공식과 같습니다.
CPMM에서 정의한 유동성 공식으로 a와 L을 정의할 수 있습니다. 저희는 유동성제공자가 제거하는 유동성(a)에 대해 알아보기 위해
(22) 공식처럼 a에 대한 공식을 정의할 수 있습니다.
마찬가지로 유동성을 제거할 때도 일정 비율을 유지해야 하는 유동성의 규칙을 따라야 합니다.
유동성의 규칙에 따라 a에 대한 공식을 (23) 공식으로 재정의 할 수 있습니다.
최종적으로 공식을 정리하면 (24) 공식을 도출할 수 있습니다.
유동성에 제공된 두 토큰에서 제공자가 제거하고자 하는 토큰의 양은 대부분 한쪽이 정해져 있습니다. 즉, dx 또는 dy의 값은 제공자의 선택에 따라 정해집니다. dx 또는 dy를 (25) 공식에 대입하며 제거되는 유동성(s = a)을 구할 수 있습니다.
지금까지 CPMM 공식이 여러 상황에서 어떻게 계산되는지 수학적으로 알아봤습니다.
감사합니다.
댓글