← 목록

크라우니 에이전트 플랫폼 한선씨화 백서

tip.crowny.org 기록 — 2026-03-28 전체 풀스택을 JS/TS/Solidity에서 한선씨/TVM(ISA729)으로 완전 전환한 과정과 결과

1. 개요

무엇을 했나

크라우니 에이전트 플랫폼(연락처, 메신저, 성경, 지갑)의 모든 로직을 한선씨 언어로 다시 작성했다. 백엔드(Node.js), 스마트컨트랙트(Solidity), 프론트엔드(React/TypeScript) 3계층 전부.

왜 했나

규모

구분원본한선씨파일수
백엔드640줄 JS2,054줄6
컨트랙트353줄 Sol839줄3
프론트엔드~60K TS/TSX1,992줄10
합계4,885줄19

2. 아키텍처 전환 상세

2.1 백엔드: Express → CTP 서버

이전: Node.js + Express + JWT + WebSocket (단일 index.js 640줄)

이후: 한선씨 6모듈

모듈파일핵심 변경
인증인증.hsnJWT → CTP 세션 토큰 (CTP_카운터_사용자ID)
연락처연락처.hsnExpress router → 만약 (메서드+경로) 패턴
메신저메신저.hsnws 라이브러리 → WS클라이언트 맵 + CTP 시그널링
성경성경.hsn동일 시드 데이터, 맵생성/맵넣어 저장
지갑지갑.hsn7토큰 체계 유지, 3진 결과 반환
서버크라우니서버.hsn라우터 + JSON 파서 + 유틸 + 데모시드 통합
핵심 설계 결정:

2.2 스마트컨트랙트: EVM → TVM 셀

이전: Solidity 0.8.20, ERC20, 멀티시그

이후: 한선씨 셀 기반 컨트랙트

개념Solidity한선씨
상태mapping(addr=>uint)맵생성()
검증require(cond, msg)만약 → 삼진결과("T", msg) 반환
접근제어modifier onlyOwner만약 (호출자 != 소유자)
이벤트emit Transfer(...)이벤트기록("Transfer", 데이터)
반환값bool삼진결과 = {state: P/O/T, data, timestamp}
합의2진 투표(true/false)3진 합의 (P=찬성, O=보류, T=반대)
시간block.timestamp현재시간()
가스ETH gas무가스 (TVM 셀 비용)
소셜복구 3진 합의: 복구투표에서 O(보류) 상태가 존재. 찬성이 임계값에 미달하면 "투표 기록됨 (2/3)" 같은 보류(O) 응답 반환. 2진에서는 불가능했던 "아직 결정 안 됨" 상태를 자연스럽게 표현.

2.3 프론트엔드: React → 셀 반응형 VDOM

이전: React 19 + Zustand + Vite + TypeScript (25파일)

이후: 한선씨 VDOM + 상태저장소 (10파일)

핵심 아키텍처:

React                          한선씨
─────                          ──────
useState()     →   상태생성("키", 초기값) + 상태읽기/상태설정
useEffect()    →   상태구독등록("키", 콜백)
JSX <div>      →   상자(CSS, 자식들)
<span>         →   글자(텍스트, CSS)
<button>       →   버튼(텍스트, CSS, 콜백)
<input>        →   입력창(힌트, CSS, 콜백)
Zustand store  →   상태저장소 (전역 맵)
Vite HMR       →   crowni-tvm compile → .wasm

DOM 브릿지 레이어: WASM에서 브라우저 DOM을 조작하기 위해 외부함수 선언:

상태 변경 → 재렌더링: 상태설정() 호출 → 구독자 알림 → 타이머(0, 재렌더링) 배치 → VDOM 재생성 → DOM 갱신


3. 기술 결정 기록

3.1 왜 한선씨가 JS보다 나은가 (이 유스케이스에서)

  1. CTP 네이티브: 모든 응답에 9-Trit 헤더가 자연스럽게 포함. JS에서는 미들웨어로 추가해야 함
  2. 3진 결과: 삼진결과("P/O/T", data) — 성공/보류/실패가 타입 레벨에서 구분
  3. 무의존성: node_modules 0개. Express, JWT, ws, uuid 전부 불필요
  4. WASM 출력: crowni-tvm compile 한 번으로 브라우저 실행 가능
  5. 일관성: 백엔드, 컨트랙트, 프론트엔드가 동일 언어, 동일 VM

3.2 왜 한선씨가 불리한 점

  1. 줄 수 증가: JSON 직렬화를 수동으로 해야 함 (맵→문자열 변환)
  2. 도구 생태계: 디버거, 린터, 포매터가 아직 발전 중
  3. 학습 곡선: 한국어 키워드가 영어권 개발자에게 진입장벽

3.3 API 호환성 보장

프론트엔드를 수정하지 않고 백엔드만 교체할 수 있도록:


4. 용어 사전 (tip.crowny.org)

한선씨 용어영문설명
변수var변수 선언
함수function함수 정의
만약 / 아니면if / else조건 분기
동안while반복 루프
반환return값 반환
맵생성HASH_NEW (412)해시맵 생성
맵넣어HASH_SET (413)키-값 저장
맵꺼내HASH_GET (414)키로 값 조회
추가APPEND (408)배열에 항목 추가
길이LEN (406)배열/문자열 길이
삼진결과TritResult{state: P/O/T, data, timestamp}
CTP성공PPPPPOOOO상태=P, 권한=P, 합의=P
CTP실패TOOTOOOOО상태=T, 권한=O, 합의=T
Cell27슬롯 방사형 데이터 구조
가져오기import모듈 임포트
출력값PRINT (324)콘솔 출력
현재시간timestamp밀리초 타임스탬프
외부함수externWASM import 선언

5. 역사 타임라인

날짜이정표
2026-02-17CROWNY-CANON v1.0 동결 (ISA729, CAR, CTP 스펙 확정)
2026-02-21@crowny/crownyc v2.0 퍼블리시 (자체호스팅 증명)
2026-03-06크라우니 에이전트 플랫폼 v1.0 설치 (JS/TS/Solidity)
2026-03-27CrownyOS v1.0 완성 (7서버, QEMU 부팅, GUI 렌더링)
2026-03-28한선씨 풀스택 전환 완료 (19파일, 4885줄)
2026-03-28@crowny/platform-hsn v1.0.0 퍼블리시 (pkg.crowny.org)

6. 다음 클로드를 위한 가이드

이 패키지를 사용하려면:

bashnpm install @crowny/platform-hsn

서버 수정하려면:

  1. server/크라우니서버.hsn요청처리() 함수에서 라우트 확인
  2. 각 모듈 파일의 핸들러_*() 함수 수정
  3. 새 엔드포인트 추가: 라우터에 만약 (메서드 == "X" 그리고 경로 == "Y") 추가

프론트엔드 수정하려면:

  1. src-hsn/페이지/*_렌더() 함수가 VDOM 트리 반환
  2. 상태생성/상태읽기/상태설정으로 상태 관리
  3. 상자/글자/버튼/입력창 으로 UI 구성

컨트랙트 수정하려면:

  1. 모든 함수는 삼진결과("P/O/T", data) 반환
  2. 이벤트기록() 으로 온체인 이벤트 로깅
  3. 맵 기반 상태 — 맵생성/맵넣어/맵꺼내

레퍼런스: