연재 COCOMSS 운항 일지

약 2분

시세를 쓰던 배가 거래소 코어로 키를 돌려 엔진을 만들다

거래소 시세를 소비만 하던 COCOMSS가 거래소 백엔드의 가장 어려운 정확성 문제로 키를 돌렸다. 가격-시간 우선순위 호가창과 복식부기 원장을 직접 구현했고 Rust로 매칭 지연을 나노초까지 낮췄다. HMAC 서명·정산·커스터디 상태머신은 샌드박스로 세웠으며 실자금·규제는 코드 밖이라고 정직하게 적었다.

UnderwayExchangeRustMatching EngineBackend

항해 기록

스스로에게 던진 질문에서 이번 항로가 시작됐다: "이 서비스는 거래소 시세를 쓰기만 하는가, 아니면 거래소 코어를 만들 수 있는가?" 답을 코드로 내놓기로 했다.

  • 매칭 엔진(CLOB) — 가격-시간 우선순위 호가창을 직접 구현했다. 좋은 가격 우선, 같은 가격은 FIFO(레벨별 큐). 지정가·시장가, 부분 체결, IOC/GTC, 취소까지. 돈 계산은 float 금지 — 전부 Decimal(부동소수 오차가 곧 자산 증발)
  • 복식부기 원장 — 주문 시 필요한 자산을 잠그고(reserve) 체결 시 상대에게 넘긴다(settle). 모든 계좌의 자산 총합은 체결 전후로 불변이어야 한다
  • 불변식을 테스트로 — 8시드 × 수천 주문의 무작위 퍼즈로 매 주문마다 ① 가치 보존 ② 호가 비교차 ③ 잔고 음수 없음을 강제했다. 빠르기 전에 틀리지 않아야 한다
  • Rust 고빈도 엔진 — Python이 정확성을 다뤘다면 Rust는 지연을 다뤘다. 정수 고정소수 + 단일스레드 핫패스(경합이 없으면 락도 없다) + 락프리 링버퍼. 실측 매칭 지연 p50 42ns·p99 167ns·13.45M주문/s
  • 프라이빗·정산·커스터디(샌드박스) — API 키/시크릿 + HMAC 서명 + nonce 재사용 방지, append-only 감사 원장 + 대사, 입출금 상태머신(요청→승인→전송→확정, 불법 전이 차단) + 핫/콜드 분리

판단

"틀리지 않음"에 가장 신경을 썼다. "빠름"은 그다음이었다. 매칭 엔진이 1나노초여도 자산이 새면 무의미하다. 그래서 Rust 벤치의 화려한 숫자보다 Python·Rust 양쪽에 같은 불변식을 심고 퍼즈로 두들긴 시간이 더 길었다. LMAX가 단일스레드로 도는 이유("경합이 없으면 락도 필요 없다")를 코드로 이해한 것도 이번 항해의 소득이다.

그리고 정직한 경계를 분명히 했다. 이건 거래소가 하는 일의 코어 로직 증명이다. 실키·HSM·멀티시그 커스터디, 실제 체인 브로드캐스트, 트래블룰·KYC는 실자금과 법무가 필요한 영역이다. 더 만들면 되는 게 아니라 조직·라이선스·감사가 선행돼야 하는 곳이라 경계로 남겼다.

남은 항로

  • 매칭 엔진의 마켓별 샤딩 + 복제 상태머신(replicated state machine) — 실인프라 필요
  • Rust 엔진 꼬리 지연(할당·OS 지터) 제거: 슬랩 사전할당·스레드 피닝
  • 외부 로드밸런서(ALB)로 nginx·호스트 장애까지 흡수 — IaC(Terraform)는 이미 그려뒀고 계정·비용이 준비되면 apply

관련 글

포트폴리오가상자산 AI 포트폴리오 어드바이저 'COCOMSS'운영 서비스COCOMSS — 가상자산 AI 포트폴리오 어드바이저 · 배우고 이해하고 검증한 뒤 판단·연습하는 흐름 · 직접 구현한 거래소 코어저널스스로를 반증한 배, 추천 엔진의 패배와 2027년 과세라는 새 항로저널네 개의 프로젝트를 COCOMSS 하나로 합치기까지