항해 기록
스스로에게 던진 질문에서 이번 항로가 시작됐다: "이 서비스는 거래소 시세를 쓰기만 하는가, 아니면 거래소 코어를 만들 수 있는가?" 답을 코드로 내놓기로 했다.
- 매칭 엔진(CLOB) — 가격-시간 우선순위 호가창을 직접 구현했다. 좋은 가격 우선, 같은 가격은 FIFO(레벨별 큐). 지정가·시장가, 부분 체결, IOC/GTC, 취소까지. 돈 계산은 float 금지 — 전부 Decimal(부동소수 오차가 곧 자산 증발)
- 복식부기 원장 — 주문 시 필요한 자산을 잠그고(reserve), 체결 시 상대에게 넘긴다(settle). 모든 계좌의 자산 총합은 체결 전후로 불변이어야 한다
- 불변식을 테스트로 — 8시드 × 수천 주문의 무작위 퍼즈로 매 주문마다 ① 가치 보존 ② 호가 비교차 ③ 잔고 음수 없음을 강제했다. 빠르기 전에 틀리지 않아야 한다
- Rust 고빈도 엔진 — Python이 정확성을 다뤘다면, Rust는 지연을 다뤘다. 정수 고정소수 + 단일스레드 핫패스(경합이 없으면 락도 없다) + 락프리 링버퍼. 실측 매칭 지연 p50 42ns·p99 167ns·13.45M주문/s
- 프라이빗·정산·커스터디(샌드박스) — API 키/시크릿 + HMAC 서명 + nonce 재사용 방지, append-only 감사 원장 + 대사, 입출금 상태머신(요청→승인→전송→확정, 불법 전이 차단) + 핫/콜드 분리
판단
왜 시세 소비를 넘어 코어까지 갔나 — 스스로 평가해 보니, COCOMSS는 "거래소 생태계의 서비스를 만든 사람"이라는 증거는 충분했지만 "거래소 코어를 만들 수 있다"는 증거는 없었다. 매칭·정산은 실거래·실자금 없이도 정확성만으로 증명할 수 있는 영역이라, 여기에 키를 돌렸다.
가장 신경 쓴 건 "빠름"이 아니라 "틀리지 않음" 이었다. 매칭 엔진이 1나노초여도 자산이 새면 무의미하다. 그래서 Rust 벤치의 화려한 숫자보다, Python·Rust 양쪽에 같은 불변식을 심고 퍼즈로 두들긴 시간이 더 길었다. LMAX가 단일스레드로 도는 이유("경합이 없으면 락도 필요 없다")를 코드로 이해한 것도 이번 항해의 소득이다.
그리고 정직한 경계를 분명히 했다. 이건 거래소가 하는 일의 코어 로직 증명이다. 실키·HSM·멀티시그 커스터디, 실제 체인 브로드캐스트, 트래블룰·KYC는 실자금과 법무가 필요한 영역 — "더 만들면 되는" 게 아니라 조직·라이선스·감사가 선행돼야 하는 곳이라 경계로 남겼다.
남은 항로
- 매칭 엔진의 마켓별 샤딩 + 복제 상태머신(replicated state machine) — 실인프라 필요
- Rust 엔진 꼬리 지연(할당·OS 지터) 제거: 슬랩 사전할당·스레드 피닝
- 외부 로드밸런서(ALB)로 nginx·호스트 장애까지 흡수 — IaC(Terraform)는 이미 그려뒀고, 계정·비용이 준비되면 apply