rusty-kaspa(BlockDAG 구조)에서 갈라져 나와 모든 모듈을 cryptix-*로 재브랜딩한 뒤, 자체 매트릭스 PoW·온체인 토큰/DEX(Atomic)·서명 밴리스트(AntiFraud)·고속 릴레이(HFA)를 덧붙였다. 62개 크레이트, 935개 Rust 파일짜리 대형 모노레포라 "블록체인 노드가 실제로 어떻게 짜여 있나"를 통째로 들여다보기 좋다. (저장소: cryptix-network/rusty-cryptix · Rust 98% · ★3 · TrendShift 라이브 멘션 · ISC 라이선스 · v0.17.1)이 레포가 무엇을 하는 물건인가.
블록체인 네트워크에 완전한 자격으로 참여하려면, 거래를 검증하고·다른 노드와 대화하고·블록을 저장하고·필요하면 채굴까지 하는 프로그램이 하나 필요하다. 그게 풀노드다. rusty-cryptix는 Cryptix의 풀노드를 Rust로 다시 건조한 것이다.
"암호화폐 하나"는 사실 소프트웨어 한 덩어리다. 수천 대의 컴퓨터가 똑같은 프로그램을 돌리면서 "누가 얼마를 가졌나"라는 장부 하나에 합의하는 것 — 그 프로그램이 풀노드이고, rusty-cryptix는 Cryptix 네트워크용 풀노드의 레퍼런스 구현(reference implementation, 기준이 되는 공식 구현)이다. 기존 Cryptix는 Go로 짠 레거시 노드(cryptixd, Golang)를 썼는데, 이 저장소는 그것을 메모리 안전성과 성능이 강한 Rust로 통째로 대체하는 것을 목표로 한다.
토대가 중요하다. rusty-cryptix는 rusty-kaspa(Kaspa 코인의 Rust 노드)에서 포크(fork, 코드를 복제해 갈라져 나옴)되어, Kaspa의 핵심 자료구조인 BlockDAG와 GhostDAG 합의를 그대로 물려받았다. 그 위에 Cryptix만의 독자 기능 네 가지 — 매트릭스 기반 PoW 해시, 합의층에 박은 온체인 토큰/DEX(코드명 Atomic), 서명된 사기방지 밴리스트(AntiFraud), 고속 마이크로블록 릴레이(HFA) — 를 얹었다.
트렌딩 이유 · 경쟁 대비 장점.
이 저장소가 TrendShift 라이브 멘션에 뜬 직접적 계기는 v0.17.1 "Atomic Hardfork" 릴리스다. 합의층에 토큰과 탈중앙 거래소(DEX)를 직접 박아 넣는 큰 변경이 X(트위터)에서 회자되며 노출됐다. 정직하게 짚자면 이 레포는 GitHub 별은 아직 적은(★3) 작은 프로젝트이고, 아키텍처의 큰 뼈대는 Kaspa(rusty-kaspa)에서 물려받았다. 그럼에도 학습 대상으로는 가치가 크다 — 실제로 돌아가는 BlockDAG 노드의 전체 구조를 Rust로 한 채 통째로 읽을 수 있기 때문이다.
기술적으로 눈여겨볼 차별점은 네 가지다. ① Rust 전면 재작성(Go 레거시 → 메모리 안전 + 동시성), ② BlockDAG + GhostDAG(단일 체인의 처리량 한계 돌파), ③ 자체 매트릭스 heavy-hash PoW(전용 채굴기 ASIC에 저항), ④ 합의층 내장 토큰/AMM DEX(별도 스마트컨트랙트 없이 노드가 직접 토큰·유동성풀을 처리).
| 항목 | 흔한 블록체인 | rusty-cryptix의 접근 |
|---|---|---|
| 장부 자료구조 | 단일 체인(블록 1개씩 직렬) | BlockDAG(동시 다발 블록을 GhostDAG로 정렬) |
| 구현 언어 | 레거시 Go 데몬 | Rust 풀노드(62 크레이트 워크스페이스) |
| 토큰 / DEX | 별도 스마트컨트랙트·L2 레이어 | 합의층 내장 'Atomic' 인덱스(정수 AMM) |
| PoW 해시 | 표준 해시 1종 | 매트릭스 + 동적 SHA3 다단계(ASIC 저항) |
| RPC 통신 | JSON-RPC 단일 | gRPC + wRPC(WebSocket, Borsh·JSON 둘 다) |
블록을 한 번에 하나만 인정하면, 같은 순간에 두 채굴자가 블록을 만들면 하나는 버려진다(고아 블록). 안전하게 굴리려면 블록 간격을 길게(예: 10분) 둬야 하고, 그만큼 거래 확정이 느려진다. 처리량을 올리려고 간격을 줄이면 고아가 폭증해 보안이 흔들린다 — 속도와 안전이 정면충돌한다.
여러 블록이 동시에 나와도 전부 그래프에 넣고, GhostDAG가 그 그래프를 보고 정직한 블록들의 묶음(파란 집합)을 골라 전체 순서를 매긴다. 덕분에 초당 여러 블록(높은 BPS)을 내면서도 일관된 순서·보안을 지킨다. rusty-cryptix는 이 Kaspa 계열 합의를 Rust로 구현해, 파이프라인 단계마다 병렬로 검증한다.
언어·합의·저장·통신·암호 한눈에.
순수 시스템 소프트웨어라 '프론트엔드/백엔드'보다 레이어별 역할로 보는 게 맞다. 전부 Rust 한 언어로 짜여 있고(98%), 외부 의존성은 블록체인 노드의 정석 조합이다.
| 레이어 | 기술 / 버전 | 역할 |
|---|---|---|
| 언어·빌드 | Rust 1.81+ · Cargo 워크스페이스(62 크레이트, resolver 2) | 전체 구현 언어 + 모듈 분할 빌드. |
| 비동기 런타임 | tokio 1.33 | 수많은 P2P 연결·작업을 동시에 굴리는 엔진. |
| 합의 | cryptix-consensus(GhostDAG · reachability · pruning) | BlockDAG 정렬·검증·가지치기. |
| 작업증명(PoW) | cryptix-pow · Keccak/cSHAKE256 · BLAKE3 · XoShiRo256++ | 매트릭스 heavy-hash 채굴 해시. |
| 저장소 | RocksDB 0.22(cryptix-database) + UTXO 인덱스 | 블록·UTXO·인덱스를 디스크에 보관. |
| 암호 | secp256k1 0.29(Schnorr BIP340) · BLAKE3 · SHA3 · muhash · ml-kem | 서명·해시·UTXO 집합 해시 + 포스트양자 KEM 실험. |
| P2P | cryptix-p2p-lib + flows · gRPC(tonic 0.10/prost) · UPnP(igd) | 노드 간 블록·거래 교환 프로토콜. |
| RPC | gRPC(tonic) + wRPC(WebSocket · Borsh+JSON · workflow-rs 0.18) | 지갑·CLI·채굴기가 노드에 명령. |
| 지갑 | bip32 · keys · pskt · core · WASM SDK(wasm-bindgen) | 키 관리·서명·브라우저/Node 클라이언트. |
| 동시성·도구 | rayon · parking_lot · dashmap · simpa · rothschild | 병렬 검증 + 네트워크 시뮬·거래 생성기. |
블록 하나가 들어오면 어디서 어디로 흐르는가.
먼저 독수리 시점으로 전체 그림을 보자. 중심에는 노드 데몬 cryptixd가 있고, 그 주위를 네 덩어리가 둘러싼다 — P2P(바깥 노드와 대화), 합의 파이프라인(블록을 단계별로 검증), 저장소(RocksDB), RPC(지갑·채굴기 같은 클라이언트 창구). 인덱스(UTXO·Atomic)와 멤풀·채굴이 그 사이에 끼어 돈다.
이제 대표 흐름 한 줄기를 입구부터 출구까지 따라가 보자 — 코드의 5%가 일의 95%를 한다. 가장 흔한 사건은 "새 블록이 도착했다"이다.
핵심은 ②와 ④다. ②에서 이 블록이 규칙대로 만들어졌나(작업증명을 진짜 했나, 난이도가 맞나, 그래프상 위치가 정당한가)를 따지고, ④에서 방금 추가된 블록까지 포함해 전체 순서를 다시 정한다. 엣지 케이스(가지치기 증명·재동기화·고아 처리)는 여기선 생략 — 그 5%는 pruning_proof·sync 쪽에 따로 있다.
이 프로젝트 특유의 관례 하나: 합의 모듈은 "매니저 + 스토어" 모양을 반복한다. 예를 들어 GhostDAG 로직은 데이터 저장을 직접 하지 않고, 제네릭(generic, 어떤 저장소든 끼울 수 있게 타입을 비워둔 설계) 인자로 받는다.
// consensus/src/processes/ghostdag/protocol.rs — 저장소를 타입 인자로 받는 매니저
GhostdagManager<T: GhostdagStoreReader,
S: RelationsStoreReader,
U: ReachabilityService,
V: HeaderStoreReader> { genesis_hash, k, ... }
// k = '몇 단계 떨어진 블록까지 한 묶음으로 볼까'의 기준값 (레거시 기본 18, 지금은 BPS에 따라 동적)
덕분에 같은 합의 코드를 실제 RocksDB로도, 테스트용 메모리 저장소로도, 시뮬레이터(simpa)로도 똑같이 돌릴 수 있다. "로직과 저장을 분리한다"는 게 이 코드베이스를 읽는 첫 열쇠다.
consensus/src/pipeline/에 단계별 폴더가 그대로 있다.62개 크레이트, 어디부터 봐야 하나.
크레이트(crate, Rust의 패키지 단위)가 62개라 처음엔 압도적이지만, 역할별로 묶으면 10덩어리다. ★ 표시한 곳이 핵심이고, 나머지는 그 핵심을 받쳐주는 부품이라 보면 된다.
| 폴더 | 역할 |
|---|---|
cryptixd/ | 실행 진입점. 모든 크레이트를 조립해 "노드 한 대"로 띄운다. CLI 플래그(60여 개)도 여기서 파싱. |
consensus/ | 이 레포의 심장. BlockDAG 정렬(GhostDAG)·블록 검증 파이프라인·난이도(DAA)·가지치기. Kaspa에서 물려받은 핵심. |
consensus/pow/ | Cryptix 독자 작업증명. 매트릭스 + 동적 SHA3로 ASIC 저항을 노린 해시. matrix.rs·xoshiro.rs가 알맹이. |
protocol/flows/ | "블록 요청→응답" 같은 노드 간 대화 시나리오. AntiFraud 밴리스트·HFA 고속 릴레이도 여기 산다. |
indexes/atomicindex/ | 합의층 내장 토큰/DEX. 자산 생성·전송·민팅·유동성풀·정수 AMM 스왑 수학(liquidity_math.rs). |
rpc/wrpc/ | WebSocket 기반 RPC. Borsh(기계용)·JSON(범용) 둘 다. 브라우저 지갑이 여기로 붙는다. |
wallet/ · wasm/ | 키 관리·서명(PSKT=부분서명 거래)부터, 그걸 WASM으로 빌드해 JS/TS에서 쓰는 SDK까지. |
docs/ | 코드가 아니라 '규칙'. 페이로드·AntiFraud·Messenger 하드포크의 바이너리 스키마·상태머신·테스트 벡터. |
이 레포에서 배울 만한 것 + 어느 파일을 펴면 되는지.
62개 크레이트가 하나의 워크스페이스로 묶여, 버전·의존성을 Cargo.toml 한 곳([workspace.dependencies])에서 통제한다. "거대한 프로그램을 어떻게 책임 단위로 나누나"의 모범 사례 — consensus(로직)와 consensus/core(자료형)를 분리한 이유를 따라가 보면 의존성 방향 설계가 보인다.
논문으로만 보던 GhostDAG를 돌아가는 코드로 본다. consensus/src/processes/ghostdag/protocol.rs에서 파란/빨간 집합을 가르는 로직, reachability/에서 "도달 가능?"을 빠르게 답하는 트릭을 읽어보자. 곁들여 pruning/은 "오래된 과거를 어떻게 안전하게 버리나"를 보여준다.
표준 해시 하나가 아니라, 여러 단계를 의도적으로 복잡하게 엮어 전용 채굴기를 만들기 어렵게 한다. consensus/pow/src/lib.rs의 calculate_pow는 ① cSHAKE256 프리해시 → ② 64×64 행렬 생성(XoShiRo256++ 난수) → ③ 해시 바이트가 반복 횟수를 정하는 동적 SHA3 → ④ 행렬 곱·S-box·BLAKE3 → ⑤ 최종 heavy-hash 순으로 흐른다. "왜 이렇게까지?"의 답이 주석에 친절히 적혀 있다.
protocol/flows/는 "블록 요청을 받으면 무엇을 어떤 순서로 주고받나"를 시나리오(flow)로 코드화한다. 한편 rpc/grpc(서버-서버용 tonic)와 rpc/wrpc(브라우저용 WebSocket)를 비교하면, 같은 기능을 두 전송 방식으로 노출하는 어댑터 설계를 배운다.
스마트컨트랙트 없이 노드가 직접 토큰과 유동성풀을 처리한다. indexes/atomicindex/liquidity_math.rs의 정수만 쓰는 상수곱(constant-product) 스왑을 보면, 부동소수점 없이 어떻게 정밀하고 결정적인 교환 가격을 계산하는지 배울 수 있다(블록체인은 모든 노드가 똑같은 값을 내야 해서 부동소수점이 금지된다).
wasm/·wallet/wasm/은 같은 Rust 로직을 wasm-pack으로 빌드해 JS/TS에서 부른다. 노드용 핵심 코드와 브라우저 지갑이 하나의 소스를 공유하는 구조 — 중복 구현 없이 플랫폼을 넓히는 법.
예컨대 노드를 띄우고 합의 단계 로그만 자세히 보고 싶다면, 로그 레벨을 서브시스템별로 켤 수 있다:
# consensus 모듈만 trace로 — 블록 처리 파이프라인이 줄줄이 찍힌다
cargo run --bin cryptixd -- --loglevel info,consensus=trace,cryptix_core=trace
빌드하고 돌리려면 무엇이 필요한가.
순수 소프트웨어지만, RocksDB와 WASM용 secp256k1을 컴파일하느라 C/C++ 툴체인(clang/LLVM)이 필요한 게 함정이다. 빌드 전 아래를 갖춰야 한다.
| 항목 | 요구사항 |
|---|---|
| Rust | 1.81+ (rustup), edition 2021. wasm32-unknown-unknown 타깃 + wasm-pack(WASM SDK 빌드 시). |
| 빌드 도구 | protobuf-compiler(gRPC용) · clang/LLVM 15+(RocksDB·secp256k1) · build-essential. |
| Node.js | v20+ (WASM SDK 문서/예제 빌드 시에만). |
| OS | Linux · Windows · macOS 모두 지원(README에 OS별 빌드 가이드 제공). |
| 디스크 | RocksDB가 블록·UTXO를 저장. --archival(전체 보관) 모드면 사용량 크게 증가. 일반 노드는 가지치기로 절약. |
| 메모리 | --ram-scale로 내부 한도 조절. 저사양은 --no-utxoindex로 UTXO 색인을 꺼 메모리 절약 가능. |
풀노드를 돌린다는 건 '동네 공증 사무소'를 차리는 것과 비슷하다 — 모든 거래 장부를 직접 보관(디스크)하고, 끊임없이 들어오는 서류를 검증(CPU)하며, 다른 사무소와 계속 대조(네트워크)한다. 가벼운 모바일 지갑은 그 사무소에 "내 잔액만 알려줘"라고 묻는 손님이고.
읽기만 하지 말고 손에 익히는 단계.
진짜 돈이 안 걸린 testnet에서 노드를 굴려본다. 빌드 도구를 갖춘 뒤 클론하고 실행하면 다른 노드와 동기화가 시작된다. 로그에 블록이 들어오는지 확인하는 게 목표.
git clone https://github.com/cryptix-network/rusty-cryptix && cd rusty-cryptix
cargo run --release --bin cryptixd -- --testnet --utxoindex
터미널 지갑을 띄워 주소 생성·잔액 조회 흐름을 본다. 노드와 wRPC로 어떻게 붙는지 관찰하는 게 포인트.
cd cli
cargo run --release # Rusty Cryptix Wallet 터미널 인터페이스
네트워크 없이 노드 안에서 가상 시간으로 DAG를 통째로 만들어 검증 속도를 잰다. 블록 생성률(BPS)·전파 지연을 바꿔가며 검증 시간이 어떻게 변하는지 실험해 보자 — BlockDAG의 트레이드오프를 몸으로 느끼는 단계.
# 1000블록, 전파지연 2초, 초당 8블록, 블록당 거래 최대 200개
cargo run --release --bin simpa -- -t=200 -d=2 -b=8 -n=1000
s4에서 따라간 "블록 도착 → header → body → virtual" 흐름을 실제 로그로 확인한다. consensus=trace를 켜고 블록이 단계별로 처리되는 줄을 눈으로 따라가 보자.
consensus/pow/src/{lib,matrix,xoshiro}.rs를 읽고, 입력 헤더 하나가 ① 프리해시 → ② 행렬 → ③ 동적 SHA3 → ④ 행렬곱·BLAKE3 → ⑤ heavy-hash로 어떻게 변하는지 단계마다 중간값을 출력하는 작은 테스트를 작성해 본다. "왜 이 단계가 ASIC을 방해하나"를 한 줄로 설명할 수 있으면 성공.
indexes/atomicindex/liquidity_math.rs의 상수곱 스왑 공식을 읽고, 같은 입력으로 같은 출력이 나오게 별도 스크립트(파이썬·러스트 무엇이든)로 재현한다. 부동소수점 없이 정수만으로 가격을 정하는 이유와, 반올림을 어디서 어떻게 처리하는지가 핵심.
한 주씩 따라가는 6주 계획.
| 주차 | 주제 | 학습 자료 |
|---|---|---|
| 1주차 | 블록체인 기초 — UTXO·PoW·노드 개념 잡고 빌드·실행 | README 빌드 가이드 + 실습 1·2 |
| 2주차 | BlockDAG·GhostDAG 이해(논문 + 코드 대조) | PHANTOM/GHOSTDAG 논문 · consensus/src/processes/ghostdag/ |
| 3주차 | P2P 플로우 + gRPC/wRPC 통신 구조 + 시뮬레이션 | protocol/flows/ · rpc/ · 실습 3 |
| 4주차 | PoW 해시와 암호(secp256k1 Schnorr·BLAKE3) 심화 | consensus/pow/ · crypto/ · 실습 5 |
| 5주차 | Cryptix 독자 하드포크 — Atomic·AntiFraud·HFA·Messenger | indexes/atomicindex/ · docs/*.md 명세 |
| 6주차 | WASM SDK로 브라우저 지갑/클라이언트 만들기 | wasm/ · wallet/wasm/ · workflow-rs 문서 |
본문에 나온 용어 빠른 참조.
| 용어 | 의미 |
|---|---|
| 풀노드 | 모든 규칙을 스스로 검증하며 네트워크에 참여하는 완전한 노드 프로그램. |
| BlockDAG | 블록을 한 줄 체인이 아니라 그래프로 품는 구조. 동시 다발 블록 허용 → 높은 처리량. |
| GhostDAG | BlockDAG에 전체 순서를 매기는 합의 규칙. 파란/빨간 집합 + 선택부모로 정렬. |
| UTXO | '안 쓴 동전 뭉치'로 잔액을 표현하는 모델. 노드가 그 집합을 RocksDB에 관리. |
| DAA | Difficulty Adjustment Algorithm. 채굴 난이도를 자동 조정해 블록 간격을 일정하게. |
| PoW | Proof of Work(작업증명). 해시를 무수히 시도해 조건을 맞춘 블록만 인정 = 채굴. |
| heavy-hash | 행렬 곱 등 무거운 연산을 끼워 ASIC 제작을 방해하는 PoW 해시 계열(Kaspa 유래). |
| pruning | 가지치기. 오래되어 더 필요 없는 과거 데이터를 안전하게 잘라 디스크 절약. |
| selected parent | 선택부모. 각 블록이 고르는 '가장 무거운' 부모 — 이걸 이어 정사 체인을 만든다. |
| mempool | 아직 블록에 안 담긴 대기 거래들의 임시 보관소(메모리 풀). |
| Schnorr(BIP340) | secp256k1 곡선 위 서명 방식. 비트코인 Taproot도 채택. AntiFraud 밴리스트 서명에 사용. |
| Borsh / wRPC | Borsh=결정적 바이너리 직렬화. wRPC=WebSocket 기반 RPC(Borsh·JSON 둘 다 지원). |
| Atomic | Cryptix 독자 — 합의층에 박힌 토큰 + AMM/DEX 엔진(atomicindex). 정수 상수곱 스왑. |
| AntiFraud | 서명된 P2P 밴리스트. BLAKE3 루트해시 + Schnorr 서명. '연결 차단'만 통제(블록 검열 아님). |
| HFA / microblock | HF-A 고속 레일. 저지연 마이크로블록·빠른 거래 릴레이 오버레이(기본 50ms 간격). |
| simpa / rothschild | simpa=가상 시간 DAG 네트워크 시뮬레이터. rothschild=부하 테스트용 거래 생성기. |
| muhash / ml-kem | muhash=UTXO 집합 전체를 한 값으로 요약하는 누적 해시. ml-kem=포스트양자 키교환(실험적 의존성). |