← 목록
기타 2026-06-26 15KB 읽기 16분

크라우니엔진 돈 실행 계획 (bank/회원/dex 배선)

I now have a complete picture. Here is the synthesized safe-execution plan.


돈 실행 안전계획 + 엔진 배선안 (READ-ONLY 산출 — 아직 아무 돈도 이동 안 함)

★★ 결론 먼저: 3개 작업 전부 "CRD"인데, 라이브 bank(9400)는 CRD를 모른다

정찰로 확인된 가장 중요한 사실 — 요청된 3개 작업은 모두 CRD 단위이고, 라이브 뱅크 API(9400)에는 CRD가 존재하지 않는다. 9400은 CRN/FNC/CRM만 다룬다. CRD의 실제 원장은 별도 파일이다:

  • CRD 원장 SSOT = /Users/ef/crowny-data/chain/원장.wal (코드: /Users/ef/crowny-finance/src/달란트/체인원장.한선)
  • WAL 형식: M|계정|금액(발행/민팅), T|from|to|금액(이체), ANCHOR_V3|계정|부|발행|만기|해시(앵커)
  • 기동 시 전체 리플레이로 잔액 복원. 이 CRD 원장에는 현재 가동 중인 HTTP 서비스가 없다 (체인원장.한선=라이브러리, 크라우니달러.한선=데모뿐, finance 9750/9754=쿼드북 회계로 무관).
  • 엔진 클라이언트들이 가정한 /api/balance,/api/debit,/api/credit 엔드포인트는 bank에 존재하지 않으며, 과금클라이언트 기본 URL http://127.0.0.1:9760실제로는 flexible.crowny.org(전혀 다른 서비스) 다 — 즉 현재 배선은 전부 틀린 곳을 가리킨다.
따라서 실행은 CRD 원장(원장.wal) 직접 append 또는 CRD 원장용 HTTP 서비스 신규 구축 후 호출 두 경로뿐이다.


(c) KPS/kpsmacs 식별자 + 현재 CRD 잔액 (정찰 실값)

시스템KPS 식별자kpsmacs
auth (/Users/ef/crowny-data/auth/users.txt)kps / accountId CRW336e8142d7c7440a04ec (displayName "KPS")없음
bank 9400uid 세션 = CRW336e8142d7c7440a04ec (CRN/FNC/CRM만, CRD 없음)없음
CRD 원장 (원장.wal)잔액키 크라우니달러-kimprin없음
KPS 현재 CRD 잔액 = 12 CRD (M|크라우니달러-kimprin|12). 담보기준 부-kimprin = 78000. kpsmacs는 어디에도 존재하지 않음 → 생성 필요. CRD 원장에서는 첫 T/M append 시 자동 생성(이체()가 받는이 잔액 0→증가)되므로 원장 레벨 별도 가입 불필요. 단 kpsmacs가 로그인/구독 주체로 동작하려면 auth(9401)+member(9600) 계정 생성이 필요(bank POST /api/account/register 또는 auth signup) — 이 매핑은 사람 확인 필요(아래 g-2).

⚠️ 신원 불일치: KPS가 auth/bank에서는 CRW336e8142d7c7440a04ec, CRD 원장에서는 kimprin. 세 시스템 간 회원ID↔CRD계정키 매핑 테이블이 없다(엔진 data/usermap.psv도 비어 있음). 실행 전 "kimprin = KPS" 확정 필요.


(a) 각 작업의 정확한 실행 방법

전제: 모든 append 전 flock + 사전/사후 잔액 검증(아래 b). 원장.wal은 멱등키가 없으므로 같은 줄 두 번 = 이중적용 → 1줄씩, 마커 grep 선확인 필수.

작업 1 — KPS에 1,000,000 CRD 발행 (개발비)

원장.wal 에 1줄 append:
M|크라우니달러-kimprin|1000000
적용 후 KPS CRD = 12 + 1,000,000 = 1,000,012. 그리고 앵커 1줄 추가(아래 d):
ANCHOR_V3|kimprin|78000|1000012|<만기일>|<sha256(이전상태||신규)>

⚠️ 이것이 최대 위험요소다 (g-1 참조). 문서화된 CRD 담보규칙(크라우니달러.한선)상 kimprin 시즌1 개인한도 = 부 78000 ÷ 729 ≈ 107 CRD. 1,000,000은 한도를 ~9300배 초과. 현재 원장 전체 CRD 발행량은 12+6×8=60 수준 → 1백만은 원장 규모를 5자리수 키운다. 이는 "담보부 대출"이 아니라 중앙발행/개발비 정책 예외여야만 성립 → 반드시 사람 확인.

작업 2 — KPS → kpsmacs 10,000 CRD 이체

원장.wal 에 1줄 append:
T|크라우니달러-kimprin|크라우니달러-kpsmacs|10000
적용 후 KPS CRD = 1,000,012 − 10,000 = 990,012 / kpsmacs CRD = 0 + 10,000 = 10,000. (주의: 이체()는 잔액부족 시 무변경 → 작업1 선행 필수.)

작업 3 — kpsmacs 크라우니코드(엔진) 구독: 2000 CRD/월, 첫 결제 오늘

구독 차감 = CRD 원장에서 kpsmacs → 엔진수취계정 이체:
T|크라우니달러-kpsmacs|크라우니달러-<엔진수취계정>|2000
⚠️ 엔진 구독료 수취계정이 미정의(g-3). FOUNDATION? 크라우니달러-엔진? 확정 필요. 첫 결제 후 kpsmacs CRD = 10,000 − 2,000 = 8,000.

구독 상태는 엔진 구독레코드에 기록(정산.한선/구독게이트.한선 SSOT, status|lastBilledMonth|overdueSince):

data/users/kpsmacs/subscription 또는 data/subscriptions.json:
active|2026-06|0   + (신규 필드) firstBillDate=2026-06-26, nextBillAt=2026-07-31


(b) 실행 전/후 검증 (정확한 명령)

실행 전 — 현재 CRD 잔액 읽기 (원장.wal 리플레이가 정본):

bash# kimprin / kpsmacs 의 M(발행) 합 − T(보낸) + T(받은) 직접 계산
awk -F'|' '
  $1=="M" && $2=="크라우니달러-kimprin"{k+=$3}
  $1=="T" && $2=="크라우니달러-kimprin"{k-=$4}
  $1=="T" && $3=="크라우니달러-kimprin"{k+=$4}
  $1=="M" && $2=="크라우니달러-kpsmacs"{m+=$3}
  $1=="T" && $2=="크라우니달러-kpsmacs"{m-=$4}
  $1=="T" && $3=="크라우니달러-kpsmacs"{m+=$4}
  END{printf "kimprin=%d kpsmacs=%d\n",k,m}' /Users/ef/crowny-data/chain/원장.wal
# 기대(실행 전): kimprin=12 kpsmacs=0
(CLAUDE.md 규칙대로 cat/awk 직접 대신 위는 검증 전용 read-only 명령. 한선씨 경로는 체인원장.한선리플레이()+잔액() 호출이 정본.)

또한 중복 적용 가드(append 전 동일줄 부재 확인):

bashgrep -c '^M|크라우니달러-kimprin|1000000$' /Users/ef/crowny-data/chain/원장.wal   # 0 이어야 진행

실행 후 — 같은 awk 재실행:

  • 작업1 후: kimprin=1000012
  • 작업2 후: kimprin=990012 kpsmacs=10000
  • 작업3 후: kpsmacs=8000 + 엔진 구독레코드 active|2026-06
bank 9400 잔액(참고용, CRD 무관 — CRN/FNC/CRM 확인만):
bashcurl -s http://127.0.0.1:9400/api/wallet/balance -H "Cookie: <KPS세션>"   # crn/fnc/crm


(d) 블록체인 앵커 / 멱등키 적용 지점

  • CRD 원장 자체 앵커 = ANCHOR_V3 (달란트앵커v3.한선). 발행/이체 후 kimprin·kpsmacs 각각에 대해 갱신 append. 형식 ANCHOR_V3|계정|부|발행누계|만기일|sha256. → 작업1·2·3 각각 후 해당 계정 앵커 1줄.
  • 엔진 단일 해시체인 = core/체인.한선data/chain/wal.logsub:kpsmacs:2000:2026-06 TX 기록 + 일배치로 chain.crowny.org:9729 앵커(F2: daily만). 구독 차감(작업3)은 여기에도 기록.
  • 멱등키:
  • CRD 원장 WAL은 네이티브 멱등키 없음(txid/memo 필드 자체가 없음) → 일회성 작업1·2는 flock + grep 선확인으로만 이중방지. 권고: WAL 형식을 M|계정|금액|txid 로 확장하거나 별도 applied.txids 마커파일 운용(g-4).
  • 구독 정기차감(작업3 이후 매월)은 달력월키(YYYY-MM) + 구독레코드 lastBilledMonth가 멱등키. 정산.한선이 만약 (마지막청구월 == 월키대상) 반환 1로 이미 이중차감 차단(정산.한선 L424). flock(단일 라이터)와 결합.

  • (e) 엔진 클라이언트 [WIRE] 스텁 → 실 API 배선 구체안

    현재 상태: 세 클라이언트 모두 자가테스트만 통과하는 스텁. 핵심 문제 = CRD 원장 HTTP 서비스가 없음. 두 단계로 배선한다.

    E-0 (선행, 차단요소): CRD 원장 HTTP 서비스 신규 구축

    체인원장.한선을 감싸는 신규 달란트서버.한선(신규 파일, 라이브 무접촉) 필요. 엔드포인트:
    GET  /api/crd/balance?owner=크라우니달러-<id>           → {"balance":N,"currency":"CRD"}
    POST /api/crd/debit   {owner,amount,idempotencyKey,memo} → {"status":"ok"} / {"reason":"insufficient"}
    POST /api/crd/credit  {owner,amount,memo}                → {"status":"ok"}    (= M 발행)
    POST /api/crd/transfer{from,to,amount,idempotencyKey}    → {"status":"ok"}
    
    • idempotencyKeyapplied.txids(또는 WAL 4번째 필드)로 중복 차단.
    • flock으로 단일 라이터. 포트는 crowny-ports.sh freeset crowny-crd <포트>.

    E-1 core/과금클라이언트.한선 수정 (잔고=CRD 원장)

    • L39 기본URL 9760(=flexible, 오류) → CRD 서비스 포트로 교체:
    반환 "http://127.0.0.1:<CRD포트>" (또는 BANK_URLCRD_URL 환경변수로 개명).
    • L162 과금_잔고: 경로 /api/balance?user=.../api/crd/balance?owner=크라우니달러-<소유자>, 응답필드 balance 유지(OK).
    • L195 과금_차감: POST /api/debitPOST /api/crd/debit, body의 currency:"CRD" 유지. 멱등키=월키 그대로.
    • L224 과금_입금(=발행): POST /api/creditPOST /api/crd/credit.
    • 응답성공/잔고부족 판정 헬퍼(L117·L139)는 {"status":"ok"}/insufficient 그대로 호환.

    E-2 core/정산.한선 로컬 스텁 제거 → 실호출

    • L257 과금_잔고(현재 반환 9999 하드코딩) / L263 과금_차감(현재 반환 1) — 이 두 스텁이 실제 차감을 막는 가짜값. 과금클라이언트와 동일 본문(체계+curl /api/crd/*)으로 교체. (정산.한선은 과금클라이언트를 import 못 함 — 과금클라이언트 top-level 자가테스트 때문 → 동일 로직을 정산.한선 내부에 인라인 복제, CLAUDE.md C3 패턴.)
    • L283 체인_추가 스텁(/tmp/정산_chain_stub.log) → core/체인.한선 실배선.

    E-3 core/회원클라이언트.한선 배선

    • CROWNY_MEMBER_URL=http://127.0.0.1:9600(member.crowny.org) 환경변수 주입. 경로 /api/member/exists|verify|list는 코드상 준비됨. 단 member 9600의 실제 HTTP 스펙 미확인(P0) → 응답 형식 확인 후 응답_exists확인(L90) 키워드 조정.
    • kpsmacs를 OS유저↔회원ID로 회원맵등록("kpsmacs", "<회원ID>")data/usermap.psv.

    E-4 core/환율클라이언트.한선 배선

    • 이번 3작업은 전부 CRD 단일통화 → 환전 불필요, 배선 보류 가능. 추후 CRD↔CRN 환율 필요 시 DEX_URL=http://127.0.0.1:9402 주입 + dex /api/rate,/api/swap 스펙 확인(현재 미확인, g-5).

    (f) 청구 스케줄 규칙 배선 (15일/말일)

    요청 규칙: 15일 이전 첫 결제 → 다음달 15일 결제 / 15일 이후 첫 결제 → 매월 말일 결제. 이번 케이스 첫 결제 = 2026-06-26 (26일 ≥ 15)"매월 말일" 분기 적용. 첫 결제 오늘 2000 CRD(6/26~6/30분), 다음 결제 = 2026-07-31(말일), 이후 매 말일.

    현재 정산.한선은 순수 달력월(월키) 멱등 + 다음달 롤오버만 있어 이 규칙 미구현. 추가할 것:

    1) core/시간헬퍼.한선 (날짜계산 SSOT) — 신규 함수 3개:

    일자(날짜문자열) → DD 정수             ; 부분(s,8,10) 숫자변환
    말일(YYYY-MM) → "YYYY-MM-DD"          ; date 위임: date -v1d -v+1m -v-1d (BSD) / date -d (GNU)
    다음청구일(첫결제일, 직전청구일) → "YYYY-MM-DD"
       ; 일자(첫결제일) < 15  → 다음달(직전청구월)의 15일
       ; 일자(첫결제일) >= 15 → 다음달(직전청구월)의 말일
    
    (에폭 수동산술 금지 → 기존 오늘날짜(),다음달(),연체일수()처럼 date 외부위임 + /tmp.)

    2) core/구독게이트.한선 — 레코드 스키마 확장:

    • 구독_레코드쓰기(L174)에 firstBillDate, nextBillDate 필드 추가 →
    status|lastBilledMonth|overdueSince|firstBillDate|nextBillDate.
    • 구독_가입(L248): 가입 시 firstBillDate=오늘, 규칙에 따라 nextBillDate=다음청구일(오늘,오늘) 기록.
    3) core/정산.한선 — 차감 트리거를 "월키 다름"에서 "오늘 ≥ nextBillDate"로 변경:
    • 정산_1건(L403): 만약 (마지막청구월 == 월키대상) 반환 1 멱등은 유지하되, 차감 조건에 오늘날짜() >= nextBillDate 게이트 추가. 차감 성공 후 nextBillDate = 다음청구일(firstBillDate, 오늘)로 갱신.
    • 정산_누락월(catch-up)은 nextBillDate 미달이면 스킵하도록 정합.

    (g) ★ 위험요소 / 모호점 — 실행 전 사람 확인 필수

    1. [치명] 1,000,000 CRD 발행이 담보한도(≈107 CRD)를 ~9300배 초과. 담보부 대출이 아니라 중앙/개발비 무담보 발행이라는 정책 승인이 명시적으로 있어야 함. 없으면 작업1은 CRD 시스템 무결성(시스템한도 = MIN(담보합, 재단대출×3))을 위반. → 발행 권한 주체·정책근거 확인.
    2. kpsmacs 신원 미생성. CRD 원장은 자동생성되지만, 구독 주체로 로그인하려면 auth(9401)/member(9600) 계정 + CRD계정키 매핑 필요. → kpsmacs를 어느 시스템에 어떤 ID로 만들지, kimprin↔KPS 매핑 확정.
    3. 엔진 구독료 CRD 수취계정 미정의. 작업3 T의 받는이(FOUNDATION? 크라우니달러-엔진?) 확정 필요.
    4. CRD 원장 WAL에 멱등키 없음. 일회성 작업1·2는 grep+flock으로만 이중방지. 운영 정기차감 전 WAL 멱등 확장(txid 필드/applied.txids) 권고.
    5. CRD 원장 HTTP 서비스 부재(차단). E-0 신규 서비스 없이는 정기 구독차감을 API로 못 함 → 우선 일회성은 직접 append, 정기차감은 서비스 구축 후.
    6. bank/member/dex 실 API 스펙 미확정(P0, 엔진 CLAUDE.md 동일 지적). member 9600·dex 9402 응답 형식 미확인.
    7. 첫 결제 비례(proration) 모호. 6/26~6/30(5일)에 full 2000 CRD인지 일할인지, 그리고 다음 결제가 6/30인지 7/31인지 해석 여지 → 본 계획은 "오늘 full 2000 + nextBillDate=2026-07-31"로 가정. 확인 필요.
    8. 두 개의 평행 구독 시스템. subscribe.crowny.org(9946)는 "CD"(가입 2000 + 월 150) — 엔진의 "engine-pro 2000 CRD/월"과 다름. 이번 작업은 엔진 구독이 맞는지 확인(혼동 시 엉뚱한 원장에 기록).
    관련 파일 경로(전부 절대경로):
    • CRD 원장 데이터: /Users/ef/crowny-data/chain/원장.wal
    • CRD 원장 코드: /Users/ef/crowny-finance/src/달란트/체인원장.한선, 크라우니달러.한선, 달란트앵커v3.한선
    • bank: /Users/ef/crowny-bank/src/크라우니뱅크.한선 (9400, CRD 없음), WAL /Users/ef/crowny-data/bank/wal.log
    • 엔진 클라이언트(수정대상): /Users/ef/crowny-engine/core/과금클라이언트.한선(L39,162,195,224), /회원클라이언트.한선, /환율클라이언트.한선
    • 정산/게이트/시간(수정대상): /Users/ef/crowny-engine/core/정산.한선(L257,263,283,403), /구독게이트.한선(L174,248), /시간헬퍼.한선
    • auth: /Users/ef/crowny-data/auth/users.txt(kps=CRW336e8142d7c7440a04ec), /profiles.json
    아직 어떤 돈도 이동하지 않았고, 어떤 wal/원장 파일도 수정하지 않았다. 위는 실행계획일 뿐이다.