[코인 거래로 알아보는 매칭엔진] #1. 매칭엔진의 역사와 진화
거래소에서 주문을 짝지어 주는 Matching Engine이 무엇인지, 전통 금융 거래소에서 시작해 코인 거래소를 거쳐 DEX까지 어떻게 이어지고 갈라졌는지 정리합니다. Nasdaq과 Island ECN, Coinbase Exchange, Uniswap과 dYdX의 실제 설계를 따라가며 큰 그림을 잡습니다. 이 글은 코인 거래로 알아보는 매칭엔진 시리즈의 1번째 글입니다. 거래소에서 코인을 사고팔 때 우리가 하는 일은 주문을 내는 것뿐입니다. "1 BTC를 1억 원에 사겠다"는 주문을 넣으면 잠시 뒤 체결됐다는 알림이 옵니다. 이 짧은 순간에 누군가의 매도 주문과 내 매수 주문을 찾아 짝지어 주고, 어느 가격에 얼마가 거래됐는지 확정하는 소프트웨어가 있습니다. 이것이 Matching Engine입니다. 매칭엔진은 거래소에서 가장 눈에 안 띄는 동시에 가장 중요한 부품입니다. 화면에 보이는 차트나 지갑은 매칭엔진이 만들어 낸 결과를 보여주는 껍데기에 가깝고, 거래소가 거래소인 이유는 결국 매칭엔진이 있기 때문입니다. 이 시리즈는 코인 거래를 소재로 매칭엔진을 하나씩 뜯어봅니다. 첫 편인 이 글의 목표는 큰 그림입니다. 오더북의 자료구조와 매칭 알고리즘 비교는 다음 편들의 주제입니다. 이 글에서는 이후 편을 읽는 데 필요한 최소한의 어휘까지만 다루고, 대신 시간축을 따라 매칭엔진이 어디서 와서 어디로 갔는지를 따라가 보겠습니다. Nasdaq은 자사 매칭 기술을 소개하는 문서에서 매칭엔진의 위치를 이렇게 설명합니다. The matching engine sits at the core of the exchange, maintaining order books for the assets traded on the exchange. Buy and sell orders submitted by the market participants are matched into trades based on parameters such as price and quantity of the bids and offers in the orderbook. (매칭엔진은 거래소의 핵심에 위치하며, 거래소에서 거래되는 자산들의 오더북을 유지합니다. 시장 참여자가 제출한 매수·매도 주문은 오더북에 있는 bid와 offer의 가격, 수량 같은 파라미터를 근거로 거래로 매칭됩니다.) 정리하면 매칭엔진의 책임은 네 가지입니다. 주문을 받아들이고, 자산별 오더북을 최신 상태로 유지하고, 조건이 맞는 주문끼리 체결시키고, 그 결과를 시장에 알립니다. 같은 문서는 거래소의 역할을 "fair and orderly market"을 제공하는 것으로 규정하는데, 매칭엔진은 그 공정함과 질서를 코드로 구현한 부품이라고 볼 수 있습니다. 이 부품이 없으면 어떻게 되는지도 같은 문서에 나옵니다. 전자화되지 않은 시장의 주문 처리는 "manual processes for price discovery and negotiation, involving tools such as phone, chat and spreadsheets"에 의존하며, 실시간 처리와 자동 매칭이 불가능합니다. 전화와 스프레드시트로 매수자와 매도자를 연결하던 일을 소프트웨어가 마이크로초 단위로 대신하게 된 것이 매칭엔진의 역사입니다. 매칭엔진을 이야기하려면 몇 개의 용어가 필요합니다. 다음 편에서 자세히 다룰 내용이므로 여기서는 정의만 짚고 넘어가겠습니다. Order Book(오더북)은 아직 체결되지 않은 주문들의 목록입니다. Nasdaq의 설명에 따르면 오더북은 "the available quantity of bids and offers at each price level"을 모아서 보여줍니다. 즉 가격대별로 얼마만큼의 매수 의사와 매도 의사가 쌓여 있는지를 나타내는 장부입니다. 주문은 오더북과 어떻게 상호작용하느냐에 따라 두 가지로 나뉩니다. 이 구분은 체결 가격에도 영향을 줍니다. Coinbase Exchange의 공식 문서는 체결 가격 규칙을 이렇게 명시합니다. Orders are matched against existing order book orders at the price of the order on the book, not at the price of the taker order. (주문은 오더북에 있던 주문의 가격으로 매칭되며, taker 주문의 가격으로 매칭되지 않습니다.) 내가 "1억 100만 원까지 낼 수 있다"고 매수 주문을 냈고 오더북에 1억 원 매도 주문이 있었다면, 체결은 1억 원에 일어납니다. 먼저 가격을 제시하고 기다린 쪽의 가격이 기준이 되는 것입니다. 오더북에 같은 가격의 주문이 여러 개 쌓여 있으면 누구부터 체결시켜야 할까요. 이 질문에 답하는 규칙이 매칭 알고리즘이고, 가장 널리 쓰이는 것이 Price-Time Priority입니다. 가격이 유리한 주문이 먼저이고, 가격이 같으면 먼저 도착한 주문이 먼저라는 규칙입니다. Coinbase Exchange 문서는 자사 매칭엔진을 "continuous first-come, first-serve order book"으로 소개하면서, 체결 순서를 다음과 같이 규정합니다. Orders are executed in price-time priority as received by the matching engine. (주문은 매칭엔진이 받은 순서를 기준으로 price-time priority에 따라 체결됩니다.) 여기서 "as received by the matching engine"이라는 표현이 중요합니다. 기준 시각은 주문을 낸 시각이 아니라 매칭엔진에 도착한 시각입니다. 이 한 줄이 거래소 인프라 경쟁의 상당 부분을 설명합니다. 같은 가격이라면 1밀리초라도 먼저 도착하는 쪽이 이기기 때문입니다. 매칭 규칙이 Price-Time Priority만 있는 것은 아닙니다. Nasdaq은 매칭 모델로 "continuous matching and different types of auctions"를 함께 언급합니다. 상시 매칭 외에 정해진 시점에 주문을 모아 한 번에 처리하는 auction 방식도 존재하고, 파생상품 시장에서는 물량에 비례해 배분하는 방식도 쓰입니다. 이 알고리즘들의 비교는 시리즈 3편에서 다루겠습니다. 매칭엔진의 역사는 매칭엔진이 없던 시절에서 시작합니다. NYSE 같은 전통 거래소는 오랫동안 객장(floor)에서 사람이 직접 주문을 맞췄습니다. 종목별로 지정된 Specialist가 자기 앞에 모인 매수·매도 주문을 보면서 거래를 성립시켰습니다. 이 구조의 특징은 정보와 속도가 물리적 위치에 묶여 있다는 점입니다. Nasdaq이 창립 50주년에 정리한 회고 문서는 당시를 이렇게 설명합니다. With most floor-based markets, all investors would see was a ticker tape of historic trades, well after the fact. (대부분의 객장 기반 시장에서 투자자가 볼 수 있는 것은 이미 지나간 거래의 ticker tape였고, 그것도 한참 뒤였습니다.) 같은 문서는 "there is a distinct advantage to having a physical presence on the floor, a presence that creates informational and speed advantages"라고 덧붙입니다. 객장에 서 있는 사람만 지금 시장이 어떤지 알 수 있었다는 뜻입니다. 매칭 규칙이 코드로 적혀 있지 않고 사람의 판단 안에 있었기 때문에, 공정함은 제도와 감독으로 보장할 문제였습니다. 전산화의 첫 단추는 1971년에 끼워졌습니다. SEC는 어느 거래소에도 상장되지 않은 OTC 증권 시장을 자동화하도록 NASD에 요구했고, NASD는 Bunker-Ramo Corporation에 시스템 구축을 맡겼습니다. Nasdaq의 회고 문서는 그 시스템의 성격을 분명히 적어 두었습니다. The NASD contracted with the Bunker-Ramo Corporation of Trumbull, Connecticut, to build a system in which market makers in OTC stocks could electronically update their bid/ask quotes. That system launched on Feb. 8, 1971, as the National Association of Securities Dealers Automated Quotations (hence the acronym NASDAQ). (NASD는 코네티컷주 트럼불의 Bunker-Ramo Corporation과 계약해, OTC 종목의 market maker가 자신의 bid/ask 호가를 전자적으로 갱신할 수 있는 시스템을 만들었습니다. 그 시스템은 1971년 2월 8일 National Association of Securities Dealers Automated Quotations로 출범했습니다. NASDAQ이라는 약자가 여기서 나왔습니다.) 이름 그대로 Automated Quotations, 즉 자동화된 것은 호가였습니다. 여기서 매칭엔진의 역사를 이해하는 데 가장 중요한 사실이 나옵니다. 같은 문서의 다음 문장입니다. While quotations were automated, the traditional process of matching trades was initially still done via telephone. (호가는 자동화됐지만, 거래를 매칭하는 전통적인 절차는 초기에 여전히 전화로 이루어졌습니다.) 세계 최초의 전자 증권시장이라 불리는 Nasdaq조차 출범 시점에는 매칭엔진이 없었습니다. 화면에 호가가 표시되는 것과, 그 호가끼리 자동으로 체결되는 것은 완전히 다른 문제였고 10년 넘는 시차를 두고 해결됐습니다. 호가 전산화와 매칭 자동화를 구분해서 보는 것이 이 역사를 읽는 핵심입니다. 1980년대에는 호가 정보 자체가 더 풍부해집니다. 최우선 호가만 보여주던 데서 나아가, 모든 market maker의 호가를 한눈에 보여주는 실시간 Level 2 피드가 등장했습니다. 매칭 자동화는 한 번에 오지 않았습니다. 주문을 사람에게 전달하는 일과, 사람 없이 체결하는 일이 따로 자동화됐습니다. NYSE가 먼저 손댄 것은 전달이었습니다. SEC에 제출된 NYSE 관련 규정 변경 문서에 그 시점이 기록되어 있습니다. On March 1, 1976, the NYSE commenced the operation of its Designated Order Turnaround ("DOT") system. It was re-designated "SuperDot" (or sometimes cited as "SuperDOT") in 1984. (1976년 3월 1일, NYSE는 Designated Order Turnaround("DOT") 시스템의 운영을 시작했습니다. 이 시스템은 1984년 "SuperDot"으로 이름이 바뀌었습니다.) 같은 문서는 SuperDot을 "an electronic order-routing system used by NYSE and NYSE Alternext member organizations to send market and limit orders directly to the trading post where the security is traded"로 정의합니다. 핵심 단어는 order-routing입니다. DOT은 주문을 객장의 거래 창구까지 전자적으로 보내 주는 시스템이었고, 체결은 여전히 그 자리에 있는 사람이 했습니다. 체결이 끝나면 같은 전자 회선으로 결과 보고서가 회원사에 돌아갔습니다. NYSE에도 자동 매칭의 초기 형태는 있었습니다. 1980년 도입된 OARS는 개장 전에 들어온 시장가 주문을 다루는 시스템이었습니다. OARS automatically pairs buy and sell orders and presents the imbalance to the DMM up to the time of the opening to assist the DMM in determining the opening price. (OARS는 매수·매도 주문을 자동으로 짝지어 주고, 개장 시점까지 그 불균형을 DMM에게 제시해 DMM이 개장가를 결정하도록 돕습니다.) 주문을 짝지어 주는 일은 기계가 하지만, 가격을 정하는 최종 판단은 사람에게 남아 있는 구조입니다. 자동화가 어디까지 왔고 어디서 멈춰 있었는지를 잘 보여주는 사례입니다. Nasdaq 쪽에서 실행 자체를 자동화한 것은 SOES였습니다. 1984년 12월 25개 종목으로 시작한 이 시스템은 개인 투자자의 소액 주문을 market maker의 호가에 자동으로 체결시켰습니다. SOES가 시장의 기본 설비가 된 계기는 1987년의 시장 붕괴였습니다. Nasdaq의 회고는 이렇게 적습니다. The market crash of 1987 revealed drawbacks of the telephone-based system, as many market makers were unable or unwilling to interact verbally. (1987년의 시장 붕괴는 전화 기반 시스템의 결함을 드러냈습니다. 많은 market maker가 말로 응대할 수 없거나 응대하려 하지 않았기 때문입니다.) 시장이 무너지는 날 전화를 받지 않는 상대에게 주문을 낼 방법은 없었습니다. 붕괴 이후 SOES는 모든 market maker에게 의무 사용으로 바뀌었습니다. SOES는 도입 시점부터 1,000주 이하 주문을 대상으로 삼았는데, 이 상한은 의무화 이후에도 유지되어 market maker가 과도한 역선택에 노출되지 않도록 하는 안전장치 역할을 했습니다. Nasdaq은 1988년에 전화 대신 컴퓨터로 협상하며 확정 거래를 만들 수 있고 SOES보다 큰 주문을 다룰 수 있는 SelectNet도 함께 내놓았습니다. 여기서 유명한 부작용이 나옵니다. 자동 실행이라는 이점을 노려 낡은 호가를 긁어가는 데이트레이더들이 몰렸고, 이들은 SOES Bandits라고 불렸습니다. 사람의 반응 속도에 의존하던 시장에 기계 속도의 참여자가 들어오면 무슨 일이 벌어지는지를 처음 보여준 사건이었습니다. 오늘날 우리가 매칭엔진이라고 부르는 것, 즉 오더북을 메모리에 들고 주문을 받는 즉시 체결까지 끝내는 소프트웨어는 거래소가 아니라 신생 업체들이 만들었습니다. 계기는 규정이었습니다. 1997년의 Order Handling Rules로 Nasdaq 네트워크에 새로운 유형의 시장이 편입됩니다. Nasdaq은 이들을 이렇게 설명합니다. the Nasdaq network began to include a new type of market center, Electronic Communications Networks (ECNs), which were electronic order books. (Nasdaq 네트워크는 Electronic Communications Networks(ECN)라는 새로운 유형의 시장을 포함하기 시작했고, 이들은 전자 오더북이었습니다.) 이 ECN들이 실제로 무엇이었는지는 Wikipedia의 Inet 항목이 잘 정리해 두었습니다. Inet은 다른 ECN들과 마찬가지로 "order-pairing system that give brokerage firms the power to electronically track and match reciprocal buy and sell orders at the same limit price and lot size"였습니다. 같은 limit price와 물량의 반대편 주문을 전자적으로 추적해 매칭하는 시스템, 즉 매칭엔진 그 자체입니다. 그 계보는 두 갈래에서 옵니다. Inet은 Instinet이 1970년대에 개발한 시스템을 바탕으로 하고, 여기에 Island ECN이 2002년 합쳐지면서 만들어졌습니다. Island를 통해 오가던 거래량은 1999년에 하루 50억 달러를 넘었습니다. 이후의 전개는 인수 합병의 연속입니다. 주목할 것은 Nasdaq이 왜 INET을 샀는가입니다. Nasdaq 자신의 설명은 이렇습니다. By the early 2000s, Nasdaq determined that the trading technology of INET, one of the new ECNs, would provide a needed replacement for Nasdaq's own technology. INET was itself the product of the merger of the Instinet ECN, known for its institutional reach, and the Island ECN, known for its extremely low level of processing latency. (2000년대 초, Nasdaq은 새로운 ECN 중 하나인 INET의 거래 기술이 Nasdaq 자신의 기술을 대체할 필요가 있다고 판단했습니다. INET은 기관 도달범위로 알려진 Instinet ECN과, 극히 낮은 처리 latency로 알려진 Island ECN이 합병해 만들어진 결과물이었습니다.) 세계 최초의 전자 증권시장이 자기 거래 기술을 신생 업체의 것으로 교체한 것입니다. Nasdaq은 인수 후 몇 년에 걸쳐 INET의 오더북 거래 기술과 데이터 플랫폼을 채택했고, 회고 문서는 "It is this technology and its enhancements that powers Nasdaq trading applications to this day"라고 적습니다. 그 이름은 지금도 시스템 내부에 남아 있는데, Wikipedia의 Inet 항목은 현재의 Nasdaq 시스템이 "a very fast middleware bus that is called Inet"을 사용한다고 서술합니다. 여기까지가 전통 금융의 이야기입니다. 사람이 객장에서 맞추던 매칭은 대략 30년에 걸쳐 호가 전산화 → 주문 라우팅 자동화 → 소액 주문 자동 실행 → 완전 전자 오더북 순으로 소프트웨어에 넘어갔고, 그 마지막 단계의 결과물이 오늘날 매칭엔진의 원형입니다. 코인 거래소를 처음 써 본 사람도 주식 거래 경험이 있으면 화면이 낯설지 않습니다. 호가창이 있고, 지정가와 시장가 주문이 있고, 체결 내역이 흐릅니다. 우연이 아니라 같은 구조를 가져온 결과입니다. CEX(Centralized Exchange)는 오더북, 중앙 매칭엔진, Price-Time Priority라는 세 가지를 거의 그대로 물려받았습니다. 물려받은 이유는 풀어야 할 문제가 같기 때문입니다. 서로 다른 가격을 원하는 다수의 참여자를 공정한 규칙으로 짝지어 주는 문제에 대해, 전통 금융은 30년에 걸쳐 오더북과 Price-Time Priority라는 답을 이미 다듬어 두었습니다. 다만 물려받지 않은 것도 있습니다. Nasdaq의 매칭 기술 문서는 주문 제출 경로의 차이를 이렇게 짚습니다. On financial exchanges, orders are typically placed through a broker that is a member on the exchange... There are also exchanges where investors can place their orders directly on the exchange without a broker acting as an intermediary, similar with many cryptocurrency exchanges. (금융 거래소에서 주문은 보통 거래소 회원인 broker를 통해 제출됩니다. 반면 많은 암호화폐 거래소처럼, 투자자가 중개자 없이 거래소에 직접 주문을 낼 수 있는 거래소도 있습니다.) 전통 거래소에서 개인은 증권사를 거쳐야 거래소에 닿습니다. 코인 거래소는 이 중개 계층이 없고 개인이 매칭엔진에 직접 주문을 넣습니다. 회원사 제도가 사라진 자리에서, 예전에는 증권사가 처리하던 몫까지 매칭엔진과 거래소 API가 직접 감당하게 됐습니다. 흥미로운 것은 이 흐름이 한 방향이 아니라는 점입니다. Nasdaq은 자사 매칭 기술을 암호화폐 마켓플레이스에 공급하는 상품으로도 팔고 있으며, FIX와 ITCH, OUCH 같은 전통 금융의 표준 프로토콜을 그 접점으로 제시합니다. 전통 거래소의 매칭 기술이 코인 시장으로 흘러 들어가는 경로가 실제로 존재하는 것입니다. 추상적인 설명보다 실제 거래소 문서를 보는 편이 빠릅니다. Coinbase Exchange의 공식 문서에 적힌 매칭엔진의 동작은 다음과 같습니다. 먼저 주문의 생애주기가 세 단계로 정의되어 있습니다. 매칭 규칙은 앞에서 본 대로 "continuous first-come, first-serve order book"에서 Price-Time Priority를 따르고, 체결 가격은 오더북에 있던 주문의 가격입니다. 여기에 코인 거래소에서 특히 눈에 띄는 기능이 하나 더 있습니다. Self-Trade Prevention, 줄여서 STP입니다. 같은 사용자의 매수 주문과 매도 주문이 서로 체결되는 것을 막는 장치인데, 문서는 네 가지 모드를 제시합니다. 충돌이 생겼을 때 어느 쪽 지시를 따르는지도 명시되어 있습니다. The STP instruction on the taker order (latest order) takes precedence over the older/resting order. (taker 주문(가장 최근 주문)의 STP 지시가 더 오래된 주문의 지시보다 우선합니다.) STP 자체는 전통 금융에도 있는 개념이지만, 개인이 중개자 없이 봇을 붙여 양방향으로 주문을 내는 환경에서 훨씬 자주 마주치게 되는 규칙입니다. 앞 절에서 본 "중개 계층 없는 직접 접근"이 매칭엔진의 기능 명세에 어떻게 반영되는지를 보여주는 예이기도 합니다. 전통 거래소에는 개장과 폐장이 있습니다. 그래서 개장가를 정하는 별도 절차가 필요하고, 앞에서 본 NYSE의 OARS가 바로 그 일을 하는 시스템이었습니다. 장이 열리기 전 모인 주문을 짝지어 불균형을 계산하고, 그것을 근거로 개장가를 정하는 과정입니다. 코인 시장에는 이 절차가 없습니다. 장이 닫히지 않으므로 다시 열 일도 없고, 개장가를 새로 세울 필요도 없습니다. 대신 매칭엔진은 무중단 운영이라는 다른 요구를 받습니다. 정기 점검을 위해 시장을 멈출 수 있는 창이 제도적으로 보장되어 있지 않기 때문입니다. 이 요구는 코인 거래소만의 것으로 남지 않았습니다. Nasdaq은 자사 매칭 기술을 소개하면서 "B2B, B2C, and C2C trading models are supported by Nasdaq's cloud-based matching technology in a 24x7 environment with dynamic scaling for order size and trading volumes"라고 적습니다. 24시간 상시 운영이 매칭엔진 상품의 요구사항 목록에 정식으로 들어간 것입니다. DEX 이야기를 하기 전에, 왜 DEX가 CEX의 구조를 그대로 베끼지 못했는지를 짚어야 합니다. 매칭엔진은 주문이 들어오고 취소될 때마다 오더북 상태를 갱신합니다. 활발한 시장에서 이 갱신은 초당 수천 번 이상 일어나고, 대부분의 주문은 체결되지 않은 채 취소됩니다. 이 동작을 블록체인 상태 갱신으로 옮기면 문제가 생깁니다. 상태를 쓰는 데 비용이 들고, 그 비용이 즉시 확정되지도 않기 때문입니다. 비용 감각을 보여주는 숫자가 Uniswap v2 백서에 있습니다. v2는 가격 오라클을 위해 블록마다 가격을 누적하는데, 백서는 그 대가를 이렇게 적습니다. This design means that the price oracle only adds an additional three SSTORE operations (a current cost of about 15,000 gas) to the first trade in each block. (이 설계로 인해 price oracle은 각 블록의 첫 거래에 SSTORE 연산 3회, 현재 비용으로 약 15,000 gas만 추가합니다.) "가격 하나를 기록하는 데 SSTORE 3회, 약 15,000 gas"가 백서가 자랑스럽게 제시하는 최적화 결과라는 점이 중요합니다. 상태 저장이 이만큼 비싼 환경에서, 체결되지도 않을 주문 수천 개를 매초 상태에 쓰고 지우는 오더북은 성립하기 어렵습니다. 그래서 DEX는 두 가지 방향으로 갈라졌습니다. 하나는 오더북과 매칭을 아예 없애는 길, 다른 하나는 오더북을 유지하되 체인 밖으로 옮기는 길입니다. Uniswap이 택한 것은 첫 번째 길입니다. Uniswap v2 백서는 v1을 이렇게 소개합니다. Uniswap v1 is an on-chain system of smart contracts on the Ethereum blockchain, implementing an automated liquidity protocol based on a "constant product formula". Each Uniswap v1 pair stores pooled reserves of two assets, and provides liquidity for those two assets, maintaining the invariant that the product of the reserves cannot decrease. (Uniswap v1은 Ethereum 위의 온체인 스마트 컨트랙트 시스템으로, "constant product formula"에 기반한 automated liquidity protocol을 구현합니다. 각 Uniswap v1 pair는 두 자산의 reserve를 pool로 보관하고 그 두 자산에 유동성을 제공하며, reserve의 곱이 감소할 수 없다는 invariant를 유지합니다.) 여기에는 오더북이 없습니다. 매칭 상대도 없습니다. 거래자는 다른 거래자를 기다리는 대신 pool을 상대로 자산을 바꿉니다. 가격은 주문끼리 만나서 결정되는 것이 아니라 pool에 남아 있는 두 자산의 비율에서 계산됩니다. 백서의 표현으로는 수수료를 제외한 marginal price가 "dividing the reserves of asset a by the reserves of asset b"로 구해집니다. 그러면 이 가격이 실제 시장 가격에서 벗어나면 어떻게 될까요. 백서는 arbitrageur에게 맡깁니다. Since arbitrageurs will trade with Uniswap if this price is incorrect (by a sufficient amount to make up for the fee), the price offered by Uniswap tends to track the relative market price of the assets. (이 가격이 틀렸다면 arbitrageur가 Uniswap과 거래하게 되므로(수수료를 메울 만큼 차이가 날 때), Uniswap이 제시하는 가격은 자산의 상대적 시장 가격을 따라가는 경향이 있습니다.) 전통 거래소가 매칭 규칙으로 풀던 문제를 Uniswap은 수식과 인센티브로 풉니다. 참여자를 짝지어 줄 필요가 없으니 체결 우선순위도 필요 없고, 결과적으로 매칭엔진이라는 부품 자체가 사라집니다. 수수료 구조도 오더북 거래소와 다릅니다. 백서에 따르면 거래자는 30 basis point, 즉 0.30%의 수수료를 내고 이는 유동성 공급자에게 갑니다. v2에는 5 basis point의 protocol fee를 켤 수 있는 장치가 들어갔는데, 백서 작성 시점에는 꺼져 있었고 켜지면 30 bp 수수료의 6분의 1을 가져가는 구조입니다. Maker와 Taker를 나눠 다른 수수료를 매기는 CEX와 달리, 상대편 주문이라는 개념이 없으니 수수료도 단일합니다. v2에서 추가된 기능들도 짚어둘 만합니다. ETH를 반드시 거쳐야 했던 v1의 제약을 풀어 임의의 ERC-20 쌍을 만들 수 있게 했고, 각 블록의 첫 거래 직전 가격을 누적해 TWAP을 계산할 수 있는 오라클과, 자산을 먼저 받고 같은 트랜잭션 안에서 나중에 지불하는 flash swaps를 도입했습니다. 구현 언어도 v1의 Vyper에서 v2의 Solidity로 바뀌었습니다. 백서는 2020년 3월에 공개됐습니다. dYdX는 두 번째 길을 택했습니다. 오더북과 Price-Time Priority를 포기하지 않는 대신, 오더북이 있는 장소를 옮겼습니다. dYdX 공식 문서의 설명입니다. Each full node in the network maintains an in-memory order book, which undergoes state changes in real time as traders submit order instructions. (네트워크의 각 full node는 in-memory order book을 유지하며, 이 오더북은 트레이더가 주문 지시를 제출할 때마다 실시간으로 상태가 바뀝니다.) 같은 문서는 이 오더북에 올라가는 short-term order를 두고 체결될 때까지 체인 밖 노드 메모리에 머문다("live off-chain, in node memory, until matched")고 설명합니다. 오더북 자체는 합의로 확정되는 상태가 아니고, 합의에 올라가는 것은 블록에 담긴 매칭 결과입니다. 매칭은 블록을 제안할 차례가 된 validator가 자기 로컬 오더북에서 만들어 내고, 그 매칭 결과를 담은 블록이 네트워크에서 확정되면서 거래가 성립합니다. 체결 순서 규칙은 CEX와 같은 Price-Time Priority입니다. 이 구조에는 CEX에 없던 문제가 하나 따라옵니다. 노드마다 주문 메시지가 도착하는 순서가 다르므로 로컬 오더북이 서로 어긋날 수 있습니다. dYdX는 합의된 블록을 기준으로 이를 맞춥니다. upon seeing a new consensus-commited block, nodes sync their local books with the block contents (새로 합의된 블록을 보면, 노드들은 자신의 로컬 오더북을 블록 내용과 동기화합니다.) 주문의 종류도 온체인 비용을 고려해 나뉩니다. 문서에 따르면 short-term order는 최대 20개 블록 동안 validator 메모리에 머물고, 체결되지 않으면 온체인에 저장되지 않습니다. 상태에 남는 것은 체결된 수량과 만료 블록 높이뿐입니다. 문서는 이 주문 유형이 "mainly intended for use by market makers with high throughput or for market orders"라고 밝히는데, 초당 수천 번 주문을 넣고 취소하는 참여자를 온체인 비용 없이 받아내기 위한 설계인 셈입니다. 반면 stateful order는 블록체인에 기록됩니다. 이쪽은 기술적 제약 때문에 상태에 기록된 다음 블록에서야 매칭이 시작됩니다. 오더북에 오래 남아 있어야 하는 주문은 온체인에 두고, 순식간에 사라질 주문은 메모리에만 두는 분리입니다. 정리하면 dYdX의 매칭엔진은 사라지지 않았습니다. 한 회사의 서버에 있던 것이 validator 집합의 메모리로 옮겨갔고, 체결 결과만 블록체인에 남습니다. 지금까지 본 세 가지 구조를 같은 기준으로 비교하면 차이가 분명해집니다. 세 번째 행의 AMM 항목은 조금 더 설명이 필요합니다. AMM에는 체결 우선순위 규칙이 없으므로, 같은 블록 안에서 누가 먼저 거래되는지는 트랜잭션 순서가 정합니다. Uniswap 백서도 오라클 조작 시나리오를 설명하면서 "a miner who controls the ordering of transactions within a block"의 가능성을 언급합니다. 매칭 규칙을 없앤 대가로 순서 결정권이 블록 생산자 쪽으로 넘어간 셈입니다. CEX와 DEX의 본격적인 비교는 시리즈 4편의 주제입니다. 여기서는 매칭이라는 한 가지 기능을 놓고 세 구조가 어디서 갈라지는지만 확인해 두겠습니다. 매칭엔진의 역사를 한 줄로 요약하면 매칭의 주체가 계속 이동해 온 역사입니다. 30년에 걸친 이동에도 살아남은 것이 있습니다. 오더북과 Price-Time Priority입니다. 1997년에 ECN이 "electronic order books"로 불렸을 때의 그 구조가, 2020년대의 Coinbase Exchange 문서와 dYdX 문서에 같은 이름으로 남아 있습니다. 매칭이 사람에서 서버로, 서버에서 validator로 옮겨가는 동안에도 "가격이 유리한 주문이 먼저, 같으면 먼저 온 주문이 먼저"라는 규칙은 바뀌지 않았습니다. 이 역사에서 하나 더 얻어갈 것은 호가와 매칭을 구분해서 보는 시각입니다. Nasdaq은 세계 최초의 전자 증권시장이라는 이름을 얻었지만, 정작 매칭은 10년 넘게 전화로 이루어졌습니다. 어떤 거래 시스템을 볼 때 "무엇이 전자화되어 있는가"와 "무엇이 자동으로 체결되는가"는 따로 확인해야 하는 질문입니다. 이번 편에서는 오더북을 "아직 체결되지 않은 주문의 목록"이라는 한 문장으로만 다뤘습니다. 하지만 매칭엔진이 주문을 받을 때마다 들여다보는 것이 바로 이 장부입니다. 매칭 방식을 자세히 보기 전에 그 모양부터 알아 둘 필요가 있습니다. 다음 편에서는 오더북의 구조를 다룹니다. 매수 호가와 매도 호가가 가격 레벨별로 어떻게 쌓이는지, 지정가 주문과 시장가 주문이 오더북과 어떻게 만나는지, 오더북의 깊이가 시장가 주문의 체결 가격을 어떻게 바꾸는지를 거래소 공식 API 문서로 살펴보겠습니다. 전체 목차:개요
매칭엔진이란 무엇인가
주문을 짝지어 주는 거래소의 심장
Order Book, Maker, Taker — 최소한의 어휘
체결 순서를 정하는 규칙, Price-Time Priority
전통 금융 거래소의 매칭엔진
객장과 Specialist — 사람이 매칭하던 시절
1971년 Nasdaq — 호가 전산화가 먼저였다
DOT과 SOES — 주문 라우팅과 자동 실행
Island ECN에서 INET으로 — 완전 전자 매칭엔진
시점 사건 2002년 Instinet이 Island ECN을 인수 2003년 11월 17일 Island가 공식적으로 Inet ATS, Inc.로 사명 변경 2005년 Nasdaq이 INET을 인수 2007년 Nasdaq이 스웨덴 OMX 그룹을 인수, Genium 플랫폼 확보 코인 거래소로의 확장
CEX가 전통 거래소를 닮은 이유
Coinbase Exchange의 매칭엔진 들여다보기
상태 의미 received 매칭엔진이 주문을 받아 즉시 확인한 상태 open 아직 체결되지 않았거나 일부만 체결되어 오더북에 올라간 상태 done 전부 체결되었거나 취소되어 끝난 상태 플래그 동작 dc 기본값. 작은 쪽 주문을 취소하고 큰 쪽 주문의 수량을 줄인다 co 오더북에 있던 기존 주문을 취소하고 신규 주문은 계속 체결한다 cn 신규 주문을 취소하고 기존 주문을 남긴다 cb 양쪽 주문을 모두 즉시 취소한다 24/7 시장이 만든 차이
DEX로의 진화
오더북을 그대로 온체인에 올릴 수 없는 이유
Uniswap — 매칭엔진을 없앤 AMM
dYdX — 오더북은 오프체인, 결제는 온체인
세 가지 방식을 나란히 놓고 보기
기준 CEX (Coinbase Exchange) AMM DEX (Uniswap) 오프체인 오더북 DEX (dYdX) 오더북 거래소 서버 없음 각 full node의 메모리 매칭 주체 거래소의 중앙 매칭엔진 없음. pool의 수식이 가격을 결정 블록을 제안하는 validator 체결 순서 규칙 Price-Time Priority 트랜잭션이 블록에 담기는 순서 Price-Time Priority 거래 상대 다른 참여자의 주문 유동성 pool 다른 참여자의 주문 신뢰 대상 거래소 운영 주체 스마트 컨트랙트 코드 validator 집합 마무리
다음 편 예고
References