같지만 다른 AMM — 대체 다들 뭐가 다르길래 계속 생겨나는 건가요

scalalang2
CURG
Published in
14 min readJun 12, 2021

--

요즘 길어지는 하락장 때문에 정신없는 시기이다. 이 글을 쓰는 필자 또한 석사 학위 심사가 몇 일 안남았기 때문에 바쁜 하루 하루를 보내고 있었다. 상황이 이러한데 클레이튼, BSC, 솔라나, 매틱 등에 여러 유니스왑과 유사한 탈중앙 거래소가 생기고 사라지기를 반복하고 있고 많은 정보를 접하면서 든 생각이 하나 있었다.

아니 유니스왑이 있는데 왜 계속 뭐가 만들어질까? 
= 언뜻 보기에 다 카피해서 만든 거 같은데 왜 사람들이 투자할까?

위 질문이 머릿속에 떠올라서 이런 저런 정보를 접하고 공부를 시작했는데 생각보다 재밌는 이야기가 될 것 같아서 이번 포스팅의 주제로 정했다. 오늘 글의 대부분은 볼린저 투자 그룹의 미디엄 글[1]을 참고했으며 필자가 나름대로 정리한 내용을 덧붙였다.

이번 포스팅에서는 아래 주제에 대해서 다룬다.

  • Automated Market Maker (AMM)
  • Constant Function Market Maker (CFMM)
  • 해결 방법이라고 나온 친구들 (?)

Automated Market Maker (AMM)

전통적인 거래소 시스템에서 운영하고 있는 오더북에서는 항상 구매자와 판매자 두 명의 당사자가 동일한 가격에 매칭이 되어야 거래가 이루어진다. 만약 비인기 종목이라면 유동성이 충분하지 않아서 오더북이 채워지지 않아 판매자와 구매자 모두 손해를 보는 상황이 발생할 수 있다.

AMM은 위 유동성 문제를 해결하기 위해 유동성을 제공하는 알고리즘화된 프로그램을 의미한다. AMM의 원조격이라고 평가되는 2012년에 발표된 Automated Market Making: Theory and Practice 논문[2]에서는 AMM을 다음과 같이 정의한다.

AMM : Automated market makers are algorithmic agents that provide liquidity in electronic markets.

이 논문에서는 AMM으로 날씨 보험 및 스포츠 베팅 사이트와 같은 예측 시장을 예로 든다. 해당 상품을 운영하는 시장 조성자는 여러 미래의 상태 (우승했거나, 날씨가 안좋거나)를 상품화 하여 판매하는데 이 때 가격이 자동으로 설정된다. 보험과 같은 경우에는 보험 가격을 결정하는 매커니즘이 있을 것이고 스포츠 시장과 같은 경우에는 여러 미래의 분기 중 하나로 결정되면 돈을 잃는 사람과 수익을 만드는 사람이 결정된다.

AMM이 학계에서 통용되는 방식과 어원이 이렇다보니 여러 유니스왑과 같은 CPMM 상품들을 기존에 사용하던 AMM과 용어를 분리할 필요가 생겼고 그렇게 탄생한 용어가 CFMM이다. CFMM은 Standford의 Guillermo Angeris 박사가 Improved Price Oracles: Constant Function Market Makers[3] 라는 논문에서 처음 정의한 것으로 보인다.

Constant Function Market Maker (CFMM)

CFMM에서 Constant란 어떤 변하지 않는 상수값을 의미한다. 즉, 이 상수값을 이용한 함수에 기반해서 자산의 수량을 변경시키는 알고리즘을 모두 CFMM이라고 정의한다. 오더북 기반 거래소에서는 항상 판매자와 구매자가 존재했지만 CFMM 모델을 사용하는 거래 플랫폼에서는 아래 세 명의 참가자가 존재한다.

  • 유동성 공급자 (Liquidity Provider) : 줄여서 LP라고도 부르며 풀 내에 두 개 이상의 자산을 공급해주는 사람이다. 일반적으로 LP들은 거래 수수료를 위해 자산을 공급한다.
  • 트레이더 (Trader) : 풀 내에 자산을 다른 자산으로 교환하는 사람들이다. 거래를 발생시킬 때 자산 규모에 따라 0.3%의 수수료를 LP들에게 지급한다.
  • 차익거래자 (Arbitrager) : AMM기반의 DEX의 가격이 맞춰지는데 지대한 공을 하는 사람들이다. AMM에서는 교환 자산이 법정 화폐인 원화나 달러가 아니라 변동성이 있는 두 자산이기 때문에 가격을 스스로 추종할 수 없다. 다만 자산의 교환비율만 달라지기 때문에 이를 중앙 거래소와 가격을 맞춰줘야 하는데 이 차익거래자들이 그 역할을 해주고 있다.

전통 거래소와는 매커니즘이 다른데다 이 쪽 분야가 연구되기 시작한지 얼마 되지 않았기 때문에 현재 우리가 바라보는 CFMM은 상당히 초기모델이다. 오늘은 대표적인 CFMM인 CPMM, CSMM, Curve, CMMM 모델을 간단하게만 소개한다.

Constant Product Market Makers (CPMM)

CPMM은 이더리움 내에서 가장 많은 트래픽 점유율을 자랑하는 유니스왑에서 처음으로 만든 함수이다. 유니스왑 내의 유동성 풀내에 토큰 교환 가격은 아래 함수에 의해 결정된다.

유니스왑 유동성 풀의 CPMM 함수

CPMM 함수는 흔히 x*y = k로 정의되며 위 함수는 거래가 발생하는 시점의 함수를 정의한 모습이다. 여기서 R은 리저브를 의미하며 R_aR_b는 교환 대상이 되는 두 토큰이다. γ는 트랜잭션 수수료이며 k를 유지하기 위한 변화량이 각 풀 내 리저브양에 더해지고 감소한다. 두 토큰 리저브 수량의 곱이 항상 일정한 k를 유지해야 하기 때문에 토큰의 가격은 토큰 수량의 반비례 그래프를 형성한다.

출처 : ethresearch, CPMM의 반비례 그래프

이런 CPMM의 특징으로는 두 가지가 있다.

  1. 먼저 교환하고자 하는 토큰 수량이 많을수록 더 큰 손해를 보게된다. 이를 전문용어로는 슬리피지(Slippage)라고도 표현한다. 오더북에서는 판매자만 있다면 내가 원하는 가격에 원하는 양만큼 구입할 수 있지만 CPMM에서는 원하는 가격에 구매할 수 없다. 다시 말해서 Limit Order를 할 수 없고 시장가로 다 긁어야 한다.
  2. 반비례 그래프 특성상 양쪽으로 무한히 발산하기 때문에 이론상 무한대의 유동성(Infinite Liquidity)을 제공한다. 풀 내에 유동성만 예치되어 있다면 구매자는 항상 상품을 구입할 수 있다. 반면, 오더북 기반 거래소에서는 팔고 싶어도 구매자가 없어 팔지 못하는 상황이 연출될 수 있다.

Constant Sum Market Makers (CSMM)

CPMM이 두 토큰의 수량의 곱이었다면, CSMM은 수량의 합인 x+y=k로 함수를 정의한다. 실제로 DEX에서 쓰이진 않은데 흔히 예시로 많이 등장한다. 아래 그래프는 CSMM의 가격 결정 함수의 그래프이다.

CSMM의 가격 결정 그래프

CSMM의 함수를 보면 CPMM의 그래프와는 정반대의 특징을 가진다. CSMM에서는 슬리피지가 존재하지 않는다. 내가 $100 만큼의 가치를 가진 토큰 A로 거래를 시도하면 항상 동일한 가치를 가진 토큰 B를 얻을 수 있다. 반면에 CPMM과는 달리 무한한 유동성을 제공하지는 못한다. 즉, 한 쪽 자산의 수량이 0이되서 거래가 정지될 수 있다. Curve는 이 CSMM과 CPMM의 특징을 적절히 조합한 새로운 방식을 제안한다.

Curve (Stableswap)

Curve(Stableswap)은 스테이블 코인들의 교환을 위해 만들어진 프로토콜로 CPMM의 슬리피지 문제와, CSMM의 유동성 문제를 어느 정도 해결하면서 두 모델의 장점을 이용한다. 여기서 정의하는 CFMM 함수는 꽤 복잡하니 그런가 보다 하고 넘어가보자.

Curve의 CFMM 함수 정의
Curve(Stableswap)의 가격 결정 함수 그래프

Curve의 곡선을 보면 특정 가격 구간에 있어서는 적은 슬리피지가 발생하다가 과도하게 한쪽 자산이 사라지면 슬리피지가 증가하는 것을 볼 수 있다. 스테이블 코인들을 보면 처음에는 $1를 유지하면서 나중에는 유지하지 못하는 애들이(Fei …) 종종 보이기 때문에 가격 하락을 반영할 필요가 있다.

Constant Mean Market Makers (CMMM)

CMMM은 Balancer에서 처음 소개된 모델이다. 이 모델은 아래 두 가지 문제를 해결한다.

  • 유니스왑에서는 유동성 공급자가 항상 동일한 비율로 두 자산을 예치해야 했는데 Balancer에서는 가중치에 따라 다른 비율로 예치가 가능하다.
  • 2개 이상의 자산을 예치할 수 있다.
CMMM 모델의 함수

CMMM의 함수는 아래와 같이 정의한다. Product를 사용하기 때문에 자산 R의 모든 곱으로 정의하기 때문에 CPMM과 수식이 동일하다. 여기서 weight의 값에 따라 기하 평균으로 나타낼 수 있다. 만약 모든 weight의 값이 1이라면 CPMM모델과 동일하고 weight 값이 <1 이라면 기하 평균이된다. 따라서 CPMM모델을 좀 더 일반화 했다고 볼 수 있다.

Balancer 모델의 CFMM 그래프

비영구적 손실 (IL:Impermanent Loss)

아마 큰 상승장 때 디파이 서비스들에서 LP활동을 하던 사람들은 자산 가격이 오른것에 비해 수익율이 크지 않은 경험을 했을 것이다. 그 이유는 풀 내에서 내가 보장받는 자산 수량은 항상 비율이기 때문에 한 쪽 자산의 가격이 상승해서 풀내에 비중이 낮아지면 유동성에서 출금할 때 상승한 자산의 수량이 낮아지기 때문이다. 이를 비영구적 손실(IL)이라고 부르고 이 글에 아주 자세히 설명되어있다.

Uniswap: A Good Deal for Liquidity Providers? — Impermanent Loss 그래프

위 그래프는 유동성 공급자로 참여했을 때 하나의 자산 가격이 상승했을 때 발생하는 IL의 그래프를 보여준다. 그래프를 보면 X축은 자산 가격의 상승량을 의미하고 Y축은 LP들이 출금했을 때 받게되는 자산의 감소량을 의미한다. 즉, 하나의 자산 가격이 5배 증가하면 LP는 원래 수량의 25%를 잃게 된다. 그리고 자산 가격이 15배 증가하면 원래 수량의 절반 이상을 잃게 된다.

그 반대의 경우에도 IL이 발생한다. 만약 자산 가격이 폭락할 경우 원래 가치를 잘 지키고 있던 자산의 수량이 감소하고 폭락한 자산의 비율이 증가한다. 그래서 CFMM 모델은 사실 LP들에게 그렇게 유리한 모델이 아니다. 일단 한 번 풀내에 예치해두면 LP들은 수동적인 태도로 가격의 변화를 지켜볼 수 밖에 없는 데다가 두 자산의 가격이 변하지 않을 때만 안정적인 수수료 수익을 얻을 수 있다.

해결 방법이라고 나온 친구들 (?)

그래서 요즘에 등장하는 CFMM모델들은 크게 부족한 유동성 문제, 비영구적 손실, 슬리피지 이 세 가지 문제를 해결하려 한다. 경우에 따라서는 레버리지 거래를 할 수 있는 기능을 추가하려는 시도가 있기도 하다. (주의: 아래 소개하는 프로토콜은 단순히 재미를 위해서 소개하는 것일 뿐 절대 투자를 권유하지 않는다)

BlackholeSwap

CSMM 모델에서는 슬리피지가 0이지만 유동성이 무한하지 않는다는 사실을 기억하고 있는가? 블랙홀스왑에서는 이 문제를 아주 단순하게 해결하는데 컴파운드 같은 대출서비스에서 부족한 유동성을 대출(?) 해온다.

출처 : 블랙홀스왑 웹 사이트

만약 상대방이 교환하고자 하는 자산이 풀 내에 부족하다면 부족한 자산을 컴파운드나 dydx같은 곳에서 대출해서 채운다. 어? 그럼 무엇으로 담보를 잡느냐 하면 유동성 풀에서 초과한 자산을 담보로 잡고 대출을 최대로 땡겨온다.만약 두 자산 모두 스테이블 코인이라면 가격이 폭락할 걱정이 줄어드니 청산당할 리스크도 적다. 물론 청산대란이 발생하면 둠스데이가 펼쳐질수도..? 아래 그래프는 블랙홀스왑에서 Curve, Uniswap과 그래프를 비교한 것이다. 일반적으로 CFMM 그래프를 그릴 때 자산이 음수로 가지 않으니 (0,0)을 원점으로 그리는데 여기서는 자산을 음수까지 표현해서 그린다.

출처 : BlackholeSwap Whitepaper

우선 해당 프로젝트는 익명의 프로젝트인데 일반적인 먹튀 코인들과는 다르게 유동성 채굴용 코인이 존재하지 않는다. 아마 개발자들도 단순한 아이디어를 구현해본다는 차원에서 프로젝트를 진행한 것 같다.

Perpetual Protocol

Perpetual Protocol은 알라메다 리서치로부터 투자받은 AMM 거래소이다. 이 친구들은 현재 AMM 모델에서는 숏을 칠 수 없기 때문에 숏을 칠 수 있는 AMM을 만들기로 한다. 이 프로토콜은 Virtual AMM(vAMM)이라고 해서 유동성 공급자들 없이 스테이블 코인 Vault를 이용해서 가상으로만 거래를 발생시킨다. 탄생배경 자체는 재밌긴 한데, 내 생각으로는 레버리지 거래하는 사람들끼리만 거래가 발생하기 때문에 이게 그렇게 좋은지는 잘 모르겠다.

출처 : Perpetual Protocol

Uniswap v3

유니스왑 v3에서는 크게 두 가지 업데이트가 있었다. 우선 Tick이란 개념을 이용해서 집중화된 유동성 (Concentrated liquidity)과 LP 토큰을 NFT로 변경시킨 것이다. 그 동안 유니스왑이 스시스왑 등으로 부터 LP 토큰을 뺏기는 등의 뱀파이어 공격에 당한 전력이 있어서 이런 업데이트가 추가 된 듯하다. 물론 그것과는 별개로 집중화된 유동성 때문에 유니스왑 v3에서는 더이상 LP토큰들 끼리 가치가 동일하지 않게 된 것도 있다.

집중화된 유동성 (Concentrated liquidity)

DEX에서 대부분의 거래가 가격 범위가 좁은 구간에서 자주 발생한다는 것에 착안해서 유니스왑 v3에서는 트레이더 들이 해당 구간을 거래할 때 슬리피지를 줄이고자 했다. 이를 위해서 LP들이 자신의 자산이 거래가 발생하는 구간을 설정할 수 있게 했다.

기존 CPMM 모델을 살펴보면 사실 자산 가격이 크게 변동하지 않는 경우에는 유동성 규모에 비해서 실제로 쓰이는 유동성은 그렇게 많지 않다. 그래서 LP들이 자신의 유동성이 쓰일 수 있는 가격 구간을 적극적으로 설정해서 수수료 수익을 최대화 할 수 있도록 했는데 이것을 Virtual Reserve라고 부른다.

Uniswap v3 Whitepaper

사실 유니스왑 내에서는 가격이라는게 상대적이기 때문에 ‘가격’ 자체를 계산하기 위해 Tick이라는 단위를 이용한다. 이 Tick은 사용자가 설정할 수 없고 프로토콜에 의해서 계산된 값만 사용할 수 있다고 한다. 아무튼 이렇게 가격 범위를 설정해서 유동성을 공급하면 각 가격 구간마다 제공하는 유동성 규모가 달라지게 된다.

Uniswap v3 Whitepaper : 가격 범위마다 제공되는 유동성 규모가 다르다.

이 모델에서는 트레이더들은 유동성 규모가 큰 가격 구간에 있어서는 슬리피지가 많이 줄어들게 되어서 이득이다. 그리고 LP들도 자신의 유동성을 최대로 사용할 수 있어서 이득(?) 이라고 한다. 사실 아직 서비스가 초기이기 때문에 LP들에게 이득일지 손실일지는 조금 더 지켜봐야 할 것 같다.

한 가지 재밌는 특징으로는 만약 자산이 LP들이 설정한 가격 범위를 초과하게 되면 바로 자산이 다른 쪽 자산으로 바뀌어 사라지게 된다. 따라서 내가 LP로 참여하고 싶다면 더 이상 자산의 상승가치를 이용한 투자를 하는게 아니라 LP로써 수수료를 최대화 하기 위한 전략을 취해야 한다.

그리고 LP 토큰 자체에 가격 범위 설정이 추가되다 보니 더 이상 LP토큰들끼리 가치가 동일하지 않게 되었기 때문에 v3에서는 이를 NFT로 만들었다. 그래서 아마 앞으로는 유니스왑의 LP토큰을 예치받아서 유동성 채굴을 하는 프로토콜들이 만들어지기 까다로울 것으로 보인다.

레퍼런스

[1] Constant Function Market Makers: DeFi’s “Zero to One” Innovation
[2] Automated Market Making: Theory and Practice
[3] Improved Price Oracles: Constant Function Market Makers

--

--

scalalang2
CURG

평범한 프로그래머입니다. 취미 논문 찾아보기, 코딩 컨테스트, 언리얼 엔진 등 / Twitter @scalalang2 / AtCoder @scalalang