유니스왑
유니스왑(Uniswap)은 이더리움(ETH)과 ERC-20 토큰 간의 자동 교환 거래를 용이하게 하도록 설계된 프로토콜이다. 이더리움 위에서 작동하는 오픈소스 프로젝트이다.
목차
개요
유니스왑은 ETH와 ERC-20 토큰 간의 자동 교환 거래를 용이하게 하도록 설계된 이더리움 기반인 프로토콜이다. 유니스왑은 온체인(on-chain)에서 설치되어 탈중심화 지갑만 설치하면 누구도 이 프로토콜을 사용할 수 있다. 지원한 지갑으로는 메타마스크(MetaMask), 월렛커넥트(WalletConnect), 코인베이스 지갑(Coinbase Wallet), 포트매틱(Fortmatic), 포티스(Portis) 등이 있다. 유니스왑은 또한 탈중심화 프로토콜을 활용하여 암호화폐 자산 거래 과정을 철저히 탈중개화 시켜 일종의 디파이(DeFi) 프로젝트로 많이 알려져 있다. 유니스왑은 거래 계약과 팩토리 계약, 두 가지 유형의 스마트 계약으로 구성된다. 이러한 계약은 바이퍼(Vyper) 스마트계약 프로그래밍 언어로 작성되었으며 유니스왑 프로토콜 기능의 핵심이기도 하다. 거래 계약은 정확히 하나의 ERC-20 토큰을 지원하며 각 거래 계약에는 ETH 및 지원되는 ERC-20 토큰이 있다.[1] 이는 주어진 거래 계약에서 실행되는 거래가 ETH 및 ERC-20 토큰의 상대적 공급을 기반으로 함을 의미한다. 거래 계약에서 실행되는 거래는 또한 ETH를 중개자로 사용하여 ERC-20 토큰 간의 직접 거래도 가능하다. 팩토리 계약을 사용하여 새 거래 계약을 배포할 수 있으므로 아직 유니스왑에 거래 계약이 없는 ERC-20 토큰은 팩토리 계약을 사용하여 만들 수 있다. createExchange() 함수를 이용하면 이더리움의 모든 사용자가 팩토리 계약을 사용하여 거래 계약을 배포할 수 있다. 팩토리 계약은 유니스왑 거래 계약의 레지스트리 역할을 담당하고 있다. 즉, 팩토리 계약을 사용하여 유니스왑 시스템에 추가된 ERC-20 토큰 및 거래 주소를 조회할 수 있다. 거래 계약이 릴리스 된 후, 팩토리 계약은 거래 계약의 ERC-20 토큰에 대해 유사한 배경 점검 및 기타 작업을 수행하지 않으며 ‘거래 계약에 하나의 ERC-20 토큰 만 포함이라는 제한 사항만 있다. 따라서 사용자는 자신이 신뢰하는 ERC-20 토큰 프로젝트의 거래에만 참여해야 한다.[2]
거래
ETH ↔ ERC-20
유니스왑에서 실행할 수 있는 거래 유형 중 하나는 ETH와 ERC-20 간의 거래이다. ETH와 ERC-20 토큰 간의 환율은 거래 계약 내 각 자산의 유동성 풀의 상대적 규모를 기반으로 한다. 환율은 유니스왑의 불변 공식에 의해 뒷받침된다.
ETH pool * token pool = invariant
이 불변 공식은 유니스왑 프로토콜에 거래 실행 중에 일정하게 유지된다. 다만, 불변 공식은 거래 계약에서 유동성이 변화될 때만 변경될 수 있다.[3]
- 예시
A는 자신의 1ETH를 ERC-20 토큰인 BAT(Basic Attention Token)로 교환하기 위해 거래를 시작하려고 한다. A는 유니스왑 프로토콜에서 기존 거래 계약을 사용하여 거래를 실행한다. 예를 들어, 유동성 공급자는 10 ETH와 500 BAT를 거래 계약에 예치했다. 이때 기본 불변 공식은 ETH pool * BAT pool = invariant로 설정된다.
ETH pool = 10 BAT pool = 500 Invariant = 10 * 500 = 5,000
A는 거래 계약의 ETH 풀에 ETH 1개를 보내 거래를 시작하려고 한다. 이때 거래 금액의 0.3% 즉 0.003ETH는 유동성 공급자에게 거래 수수료 보상으로 제공한다. 나머지 0.997ETH가 ETH 풀에 추가된다. 불변량을 ETH 풀의 새로운 수량을 제법으로 하여, BAT 풀에서 새로운 수량을 구한다. 나머지 BAT 토큰은 구매자에게 즉 A에게 누락된다.
A sends: 1 ETH Fee = 0.003 ETH ETH pool = 10 + (1–0.003) = 10.997 BAT pool = 5000/10.997 = 454.67 A receives: 500–454.67 = 45.33 BAT
A가 거래를 시작할 때 이전에 획득한 유동성 공급자 수수료는 이제 유동성 풀에 다시 추가하게 된다. 이것은 유동성 공급자에게 거래 수수료를 보상으로 하여, 유동성 공급자가 유동풀에 자신의 ETH와 ERC-20 토큰을 회수하면 보상을 받을 수 있다. 하지만, 유동성 공급자의 보상은 거래 계산 후에 다시 ETH 유동풀에 추가되어 거래 계약에서 거래를 진행할 때마다 불변량이 점진적으로 증가함으로 유동성 공급자는 또한 수익을 목적으로 거래를 진행하는 경우가 있다.
ETH pool = 10.997 + 0.003 = 11 BAT pool = 454.67 new invariant = 5,001.37
거래가 완료되면 해당 거래에서 A의 적용 환율은 45.33 BAT / ETH이다.
1 ETH in 45.33 BAT out Rate = 45.33 BAT/ETH[2]
ERC-20 ↔ ERC-20
유니스왑에서 실행할 수 있는 다른 거래 유형 중 하나는 ERC-20과 ERC-20 간의 거래이다. ETH는 모든 ERC-20 토큰의 거래쌍으로 사용되므로 유니스왑은 ERC-20 간의 거래로 ETH를 중개 자산으로 사용한다. 예를 들어, 유니스왑을 사용하면 하나의 거래 계약에서 BAT를 ETH로 변환한 다음 다른 거래 계약에서 ETH를 ERC-20 중 하나인 OMG(예시)로 변환할 수 있다. 이것은 모두 같은 거래에서 진행된다. 이 공식은 일반 시장과 매우 흡사하다. 토큰을 많이 구매할수록 거래 환율이 높아진다.[2]
수수료
유니스왑 프로토콜에서 실행되는 거래 수수료 구조는 다음과 같다.
- ETH/ERC-20토큰 거래 : ETH로 지불 된 0.3% 수수료
- ERC-20토큰/ETH토큰 거래 : ERC-20 토큰으로 지불 된 0.3% 수수료
- ERC-20/ERC-20 거래 : ERC-20 토큰으로 지불 된 0.3% 수수료 및 ETH로 지불 된 0.3% 수수료[2]
환율
유니스왑의 토큰 거래 환율 공식으로 ERC-20 토큰의 거래 환율을 계산하면,
- 는 변하지 않는 상수
- 와 는 특정 거래쌍에서 사용 가능한 ETH 및 ERC-20 토큰의 수량
유니스왑의 경우 ERC-20과 ETH의 거래 계약 중 ETH 및 ERC-20 토큰의 유동풀의 보유량으로 나타난다. 이 공식을 사용하면 주어진 토큰의 환율은 항상 위 공식의 결과 곡선 특정 지점에 있다. 공식은 유니스왑 프로토콜의 구성 부분이며, 이더리움의 창시자인 비탈릭 부테린(Vitalik Buterin)은 우측 그래프를 사용하여 다음과 같은 방식으로 설명하였다.[1]
이 공식을 사용하여 유니스왑의 거래 계약을 예로 들면, 거래 계약에 개의 A 토큰과 개의 B 토큰이 있다. 이 계약에 로 얻은 의 값은 변하지 않는다. 모든 개인은 곡선에서 마켓 메이커의 위치를 효과적으로 토큰을 매수 및 매도할 수 있다. 가로축은 판매된 A 토큰 수를 나타내고, 세로축은 구매한 B 토큰 수를 나타낸다. B 토큰이 ETH이고 A 토큰이 ERC-20 토큰이라고 가정하면 의 공식을 통해 해당 기능을 이해할 수 있다. B가 대량의 A 토큰을 구매하기로 하면 A 토큰이 부족해지고 ETH 수량이 증가된다. B의 구매 행동으로 인해 환율이 곡선을 다른 점으로 이동할 수 있다. 빨간색 점이 왼쪽으로 이동하면 A 토큰 구매 가격이 높아진다. 유니스왑 거래 계약에서 ETH 및 A 토큰의 상대적 공급은 A 토큰과 ETH 간의 환율을 결정하는 A 토큰의 공급 및 수요 관계로 이해할 수 있다. 거래 계약에 유동성의 첫 예금은 환율에 의해 의존하지 않는다. 대신 유동성 공급자가 ETH와 ERC-20 토큰 간의 환율을 반영하는 ETH 및 ERC-20 토큰을 예치하면 그 뒤에 환율이 달라질 수 있다. ETH와 ERC-20 토큰의 가치가 너무 높거나 낮으면 차익 거래자는 시장이 정상이 될 때까지 격차를 빠르게 좁힐 것이다.[2]
특징
AMM
유니스왑은 기존의 분산거래소(DEX)와 여러 면에서 다르다. 기존 거래소에서 흔히 볼 수 있는 오더북(order book)이 없다. 소위 말하는 AMM(automated market maker)으로 거래를 완결시킨다. 그 핵심 엔진은 CPMM(constant product market maker)이다. 암호자산들 사이의 스왑이 이루어지더라도 유니스왑이 거래 수수료를 챙기지 않는다. AMM은 스마트 계약이며 유동성 풀에서 거래를 성사시킨다. 유동성 풀에 유동성 공급자 LP(liquidity provider)들이 자금을 공급한다. 누구든지 풀에 등가의 자산 쌍을 예치하면 LP가 될 수 있다. 거래가 성사되면 거래자는 0.3%의 수수료를 내고 그 수수료는 LP들에 지분 비율대로 분배된다. 유니스왑이 거래수수료를 챙기지 않는다는 게 모두가 LP에게 돌아가기 때문이다. LP는 자산 쌍을 예치하여 시장을 만든다. 예를 들어, ETH와 DAI의 쌍을 제공할 수 있다. ETH의 가격이 100달러라면 ETH 하나와 100 DAI가 한 쌍이 되며 그 비율을 유지해야 한다. 만일 ETH 2개를 맡기려면 DAI도 비율에 맞게 200개를 함께 예탁해야 한다. 이게 CPMM의 기본이다. 자산의 쌍은 ETH와 ERC-20 토큰 또는 두 종류의 ERC-20 토큰으로 구성할 수 있다. 이러한 풀은 일반적으로 DAI, USDC 또는 USDT와 같은 스테이블코인으로 구성한다. 그 대가로 LP는 전체 유동성 풀에서 자신의 몫을 나타내는 유동성 토큰을 받는다. 이 유동성 토큰은 언제든지 원할 때 즉시 상환된다.
자산유동성
유니스왑 프로토콜의 설계 아키텍처는 전통적인 암호화폐 자산 거래소의 거래 모델과 전혀 다르다. 대부분의 거래소는 주문서를 관리하고, 이를 사용하여 특정 자신의 구매자 및 판매자와 일치시킨다. 반면 유니스왑은 예비금 유동성을 사용하여 계약에서 디지털 자산 거래의 교환을 실현한다. 유동성 공급자는 ETH와 거래 계약의 ERC-20 토큰 사이에 동등한 가치라고 생각하면 입금하여 이를 수행할 수 있다. 유동성 공급자가 설정한 가치가 시장과 일치하지 않으면 차익 거래자는 ETH와 ERC-20 토큰 사이의 가치를 맞추도록 할 것이다. 거래 계약의 예비금은 유동성 공급자 네트워크에 의해 공급된다. 거래 계약에 첫 번째 유동성을 제공하는 자에게 ETH와 ERC-20 토큰 간의 환율을 설정할 권리가 있다. 첫 번째 유동성 공급자는 ETH와 거래 계약의 ERC-20 토큰 사이에 동등한 가치라고 생각하면 입금하여 환율을 설정할 수 있다. 반대로, 유동성 공급자가 설정한 가치는 시장과 일치하지 않으면 차익 거래자는 이를 매매하여 차익을 얻어 동일한 환율을 맞추도록 한다.[4] 모든 유동성 공급자는 충전 시 적용 환율을 등가 계산의 기초로 사용한다. 유니스왑은 또한 자체적으로 ERC-20을 준수하는 유동성 토큰을 발행하였다. 이 토큰은 유동성 공급자의 거래 계약에 대한 기여로 볼 수 있다. 유니스왑에서 거래 계약에 하나의 ERC-20 토큰 만 포함에 대한 설정의 근거는 유동성 공급자가 유동성을 하나의 거래 계약에 단일 예비금을 모으도록 인센티브화 시키는 것이다. 유니스왑은 각 유동성 공급자가 제공한 총 예비금의 상대적 비율을 추적하기 위해 유동성 토큰을 발행하였다. 유동성 공급자는 유동성 토큰을 소각시킬 수 있으며 거래 계약에서 ETH 및 ERC-20 토큰의 비례 지분을 인출 할 수 있다. 유동성 공급자는 거래 계약에서 유동성을 제거하지 않고도 계정 간에 유동성 토큰을 판매하거나 이전 할 수 있다. 그러나 유니스왑의 유동성 토큰은 거래 계약에만 적용되고, 유니스왑 프로토콜과 연관된 단일 기본 고유 디지털 자산이 없다. 유동성 공급자는 addLiquidity () 함수를 호출하여 거래 계약에 입금 할 수 있다. 또한, 유니스왑에 유동성을 제공하는 사람은 수수료의 일정 부분을 받을 수 있다.[2]
차익거래
유니스왑은 분산형 온체인 암호화폐 자산 거래소이지만 중앙화 거래소를 대체할 수는 없다. 유니스왑의 거래 메커니즘이 왜곡되는 경우 이를 수정할 수 있는 메커니즘이 있어야 한다. 이 메커니즘은 차익 거래의 형태로 존재한다. 차익 거래는 부동한 거래 시장에 존재하는 가격 차이를 이용하는 거래 전략이다. 암호화폐의 경우 이 가격 차이는 암호화폐 거래소 간의 가격 차이에서 찾을 수 있다. 거래자가 차익 거래를 할 수 있는 기회를 찾은 경우 한 거래소에서 암호화폐를 구입한 다음 다른 암호화폐 거래소에서 판매한다. 거래자는 유니스왑에서 나타날 수 있는 가격 차이를 다른 암호화폐 거래소에 존재하는 환율을 이용할 수 있기 때문에 차익 거래는 유니스왑의 기능에서는 필수적이라고 볼 수 있다.[2]
가스비용
유니스왑 프로토콜을 사용하여 디지털 자산을 거래할 때 얻을 수 있는 장점 중 하나는 가스 효율이 매우 높다는 것이다. 유니스왑에서 거래를 진행할 때 발생하는 가스 비용은 대체 분산 형 거래소보다 상대적으로 저렴하다. 아래 표를 참고하면 ETH/ERC-20, ERC-20/ETH, ERC-20/ERC-20은 방코르(Bancor), 이더델타(EtherDelta)보다 훨씬 저렴하다는 것을 알 수 있다.[1]
거래 유니스왑 이더델타 방코르 레이더릴레이 아이덱스 에어스왑 EHT to ERC-20 46,000 108,000 440,000 113,000 143,000 90,000 ERC-20 to ETH 60,000 93,000 403,000 113,000 143,000 120,000 ERC-20 to ERC-20 88,000 - 538,000 113,000 - -
가스 효율은 유니스왑 프로토콜의 장점 중 하나이며 그 외에 장점은 1) 탈중앙화되어 있으므로 제3자에게 의뢰하지 않는다. 또한 유니스왑은 프로토콜에 사용하려는 모든 사람이 자유롭게 액세스 할 수 있다. 2) 유니스왑의 거래 비용은 다른 암호화폐 거래소보다 상대적으로 저렴하다. 3) 유니스왑을 사용하면 모든 사용자가 주어진 ERC-20 토큰에 대한 거래 계약을 작성할 수 있다는 것 등이다. 하지만, 유니스왑에 같이 몇 가지 단점이 존재하고 있다. 유니스왑은 차익 거래를 의존하여 거래 환율과 시장의 유지를 실현한다. 이것은 유니스왑이 환율 균형을 유지하기 위해 다른 암호화폐 거래소에 의존하고 있음을 의미한다. 유니스왑은 여전히 실험 단계이며 암호화폐 자산거래 효율을 촉진하는 데 더 많은 개발이 필요하다.[2]
한계
유동성 풀에 10 ETH와 1,000 DAI가 있다고 가정하자. 이때 풀의 상수는 10,000이 된다. 그 가운데 1 ETH와 100 DAI가 홍길동의 것이라면 홍길동의 지분은 10%이다. 홍길동은 1 ETH와 100 DAI를 보유하고 있기에 홍길동의 실질 지분 가치는 1 ETH가 100달러이고 100 DAI가 역시 100달러이므로 200달러가 된다. 그런데 ETH의 가격이 갑자기 100달러에서 400달러로 폭등했다고 치자. 이때 상수를 동일하게 10,000으로 유지하려면 유동성 풀에 5 ETH와 2,000 DAI가 남아 있어야 한다. 이 상태에서 홍길동이 10%의 지분을 빼게 되면 0.5 ETH와 200 DAI를 돌려받는다. 이것의 실질 가치를 환산하면 0.5 ETH가 200달러이고 200 DAI가 200달러이므로 400달러가 된다. 풀에 넣었을 때 가치가 200달러, 뺐을 때 가치가 400달러이므로 외견상 이익인 것처럼 보이지만 그렇지 않다. 풀에 넣지 않고 그냥 1 ETH와 100 DAI를 보유하고 있었다면 1 ETH가 400달러이고 100 DAI가 100달러에 해당하므로 500달러 가치를 지니게 된다. 그렇다면 100달러의 손실이 발생한 셈이다. 풀에서 지분을 빼지 않으면 손실이 발생하지 않지만 빼는 순간 손실이 발생한다. 그렇지만 만일 원래의 가격인 100 DAI로 회귀하면 손실이 발생하지 않는다. 이런 손실을 비영구적 손실(impermanent loss)이라고 부른다. 그런데 원래의 가격에서 ETH의 가치가 상승하거나 하락하면 비영구적 손실이 발생한다. 그렇지만 200달러 자산을 무작정 쥐고 있다가 500달러 가치가 실현되어 300달러의 이익을 얻을 수도 있지만 유니스왑에 예치했다가 400달러 가치가 실현되어 200달러의 이익을 얻는 것도 나쁘지 않다. 비영구적 손실을 줄이기 위해 여러 가지 방법들이 제안되었다. 커브(Curve)는 스테이블코인끼리의 거래를 주선함으로써 가격 변동 폭을 줄여 비영구적 손실이 상대적으로 줄어들게 했다. 유니스왑에서 예를 들어 ETH와 DAI로 쌍을 만들었다가 ETH의 가격변동 폭이 커서 비영구적 손실이 커졌다. 그런데 커브에서는 예를 들어 USDT와 DAI로 쌍을 만들게 해 둘 다 가격 변동성이 작아 비영구적 손실이 거의 발생하지 않게 했다. 밸런서(Balancer)는 유동성 제공 비율을 50:50이 아닌 80:20 또는 90:10 등으로 정한다. 가격 변동 폭이 작은 자산을 80 또는 90과 같이 큰 비율 쪽에 예치하고 변동 폭이 큰 자산은 20 또는 10과 같이 작은 비율 쪽에 예치하게 한다.
각주
- ↑ 1.0 1.1 1.2 YEONG, 〈유니스왑(Uniswap)에 대해 알아보자〉, 《미디엄》, 2019-03-24
- ↑ 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Richard, 〈What is Uniswap? A Detailed Beginner’s Guide〉, 《Mycryptopedia》, 2019-03-28
- ↑ 핑크부, 〈UNI SWAP(유니스왑)이란 무엇일까?(간단정리편)〉, 《네이버 블로그》, 2020-08-05
- ↑ Seagull, 〈유니스왑(Uniswap)에 대해 알아봅시다〉, 《톡큰》, 2020-08-29
참고자료
- YEONG, 〈유니스왑(Uniswap)에 대해 알아보자〉, 《미디엄》, 2019-03-24
- Richard, 〈What is Uniswap? A Detailed Beginner’s Guide〉, 《Mycryptopedia》, 2019-03-28
- 핑크부, 〈UNI SWAP(유니스왑)이란 무엇일까?(간단정리편)〉, 《네이버 블로그》, 2020-08-05
- 지평(地平), 〈코인투자 필수앱 유니스왑 ( UniSwap ) 사용법 안내〉, 《마인드와칭》, 2020-08-16
- Seagull, 〈유니스왑(Uniswap)에 대해 알아봅시다〉, 《톡큰》, 2020-08-29
같이 보기