통합체인 검증 노드서버 — 달란트 시즌1 캡스톤
개요
지금까지 구축한 체인 조각(통합체인.chain 머클봉인·노드.한선 머클·체인원장 잔액·앵커게이트)을
하나의 검증가능 노드서버로 결선. 울트라 병렬(딥리서치+인벤토리) → 아키텍처 확정(오푸스) → 빌드(소넷) → 적대검증(오푸스). 섀도 :9462, 정본 chain.crowny.org→:9729는 무접촉.
설계 근거 (딥리서치 + 인벤토리)
- 딥리서치(머클증명 API 패턴: RFC6962/9162·EIP-1186·ICS-23·Esplora)는 인프라 rate-limit으로 검증 leg가 0-0 실패(위양성) → 추출 claim을 사전지식으로 교차확증해 설계 입력으로 사용.
- 채택: 증명 객체 = audit_path[{dir,hash}] + CT호환 op_index/ops_count/merkle_root/block_hash/prev_hash (라이트클라이언트 전체 링크검증). op 식별=정수 인덱스(?h&i, 한글 percent-encode 회피).
- 보안 정직노출: RFC6962 도메인분리(leaf 0x00/node 0x01)는 우리 노드_ops해시에 미적용 → /api/verify에
merkle_domain_separation:false 플래그+note. 변경 시 봉인체인·앵커 깨짐 → 하드포크급 별도 결정으로 이관.
라우트 (9개, ASCII 고정)
| 라우트 | 반환 |
|---|
| GET / | 블록 익스플로러 대시보드 HTML (다크+골드, 검증/앵커 배지, 잔액) |
| GET /health | {service,port,status:T,requests,errors} (셀서버 내장) |
| GET /api/blocks | 전체 봉인 블록 [{height,prev,merkle_root,time,block_hash}] |
| GET /api/block?h=N | 단일 블록 + ops 목록 |
| GET /api/balance[?id=X] | 부/크라우니달러 (id 또는 9인 전체+총합) |
| GET /api/verify | {valid,tip_height,tamper_height,merkle_domain_separation:false,note} |
| GET /api/proof?h=N&i=I | 머클 포함증명 {op,op_index,ops_count,merkle_root,block_hash,prev_hash,audit_path[],verified} |
| GET /api/anchor | ANCHOR_V3 9/9 검증 {match,total,pass,items} |
| GET /api/state | 9461 호환 통합상태 {height,blocks,valid,anchor,우주완성,현재부총합,부[9]} |
적대검증 (오푸스 — 직접 curl 재현)
- 머클 증명: /api/proof?h=1&i=1 →
verified:1, merkle_root=4586f019…=블록1 ops해시 일치, prev_hash=2597414b…=제네시스 블록해시 일치 (라이트클라이언트 링크 성립)
- 체인검증: /api/verify valid=1, tamper_height=-1
- 앵커: /api/anchor match=9, pass=1
- 잔액: 현재부총합 390,000, kimprin 78,000/12, 9인 정확
- WAL 무결: 원장.wal sha256 4d4be283… 작업 전후 불변(읽기전용)
- 라이브 무영향: chain 9729=200, 익스플로러 9461=200 (별도 pid)
빌드 중 해소한 함정 2건 (적대검증이 적발)
- import 자동기동:
가져오기 "크라우니익스플로러.한선"가 익스플로러의 top-level 셀서버시작을 실행해 :9462 대신 :9461이 떴다. → 익스플로러 import 제거, 셀서버/노드 직접 import + 익_ 헬퍼 로컬 이식. (한선씨 import = top-level 문 실행 → 서버 시작문 있는 파일은 라이브러리로 import 불가)
- 한글 Content-Length 잘림: 공유
응답JSON이 Content-Length=글자수()(문자수)로 보내, 한글 본문(부/크라우니달러/가입-)이 UTF8 바이트수보다 작게 잡혀 응답 끝(proof verified+}) 잘림. → 로컬 체_J(Connection:close, Content-Length 생략) 16곳 교체.
영속 / 배포
- chain-v2.crowny.org → :9462 등록(crowny-ports.sh, 게이트웨이 자동결선). 8443 게이트웨이 전파는 게이트웨이 세션 위임(301 관측 — 백엔드 LISTEN+등록은 완료).
- 부팅영속 LaunchAgent com.crowny.chain-v2-server (KeepAlive, 사용자 launchctl load -w로 활성).
관련 파일
- /Users/ef/crowny-data/services/통합체인서버.한선 (신설, ~440줄)
- ~/Library/LaunchAgents/com.crowny.chain-v2-server.plist
- 의존(읽기전용): 통합체인.chain, 통합노드.wal(.blocks), 원장.wal, 계정.dat
잔여 / 다음 결정 (이관)
- 정본 컷오버: chain.crowny.org→:9729(스테일 코인서버)를 통합체인서버로 교체 — 게이트웨이/체인 세션 조율.
- 머클 도메인분리 업그레이드: leaf/node 0x00/0x01 적용 → 2차프리이미지 방어. 봉인체인·ANCHOR 재생성 필요(하드포크급) — 사용자/체인소유 결정.
- 앵커 멀티노드 4상 합의: 현재 단일노드 로컬 9/9. 분산 정족수는 미구현(과스코프).