크라우니 금융 4서비스 통합 고도화
개요
bank.crowny.org, dex.crowny.org, wallet.crowny.org, chain.crowny.org 4대 금융 서비스를 완전 한선씨화(4상균형3진 TOAU 기계어)하고, project.crowny.org로 기여보상 분배 시스템을 구축했다.
작업 내용
1. DEX 한선씨화 (dex.crowny.org:9729)
- DEX서버.한선 (892줄) — 지갑/오더북/매칭엔진/API/대시보드 올인원
- DEX대시보드.한선 (163줄) — 프론트엔드 HTML/CSS/JS 생성
- 연동.한선 (198줄) — bank/chain/project 연동 (소켓 기반)
- 보안.한선 (208줄) — 주문서명/거래해시/Rate Limiting/CWT 인증
- server.js(270줄) 레거시 완전 대체
2. 지갑 독립 서버 (wallet.crowny.org:9410)
- 지갑서버.한선 (~470줄) — CRN/FNC/CRM 통합 지갑 신규 생성
- 3종 자산 교환: CRN:FNC=1:10, FNC:CRM=1:100
- 상향 전환 0%, 하향 전환 7% 수수료
- P2P 송금, 거래 이력, 모바일 대시보드
3. 프로젝트 기여보상 (project.crowny.org)
- 기여추적엔진.한선 (452줄) — 7유형 가중치 기여 추적 + 보상 분배
- 보상분배서버.한선 (456줄) — 독립 보상 API (reward.crowny.org:9738)
- 보상대시보드.한선 (129줄) — 보상 풀/기여도/분배 이력 시각화
- 보안.한선 (167줄) — 보상 서명/기여 증명/분배 뮤텍스
- 프로젝트통합서버.한선 (500줄) — 메인 포트 9730 프로젝트관리+기여보상 통합
4. 크로스 서비스 연동
- bank 연동.한선 — DEX 시세, 체인 기록, 프로젝트 보상 수신 5함수 추가
- chain 연동.한선 (177줄) — 뱅크/DEX/프로젝트 연동 + 블록기여전파
기여 가중치 (7유형)
| 유형 | 이름 | 가중치 |
|---|
| 1 | 코드 작성 | 100 |
| 2 | 코드 리뷰 | 80 |
| 3 | 테스트 | 60 |
| 4 | 문서 작성 | 50 |
| 5 | 버그 수정 | 70 |
| 6 | 노드 완료 | 90 |
| 7 | 기타 | 40 |
보상 분배 체계
- CRN(크라우니) = 골드, FNC(포네) = 실버, CRM(맘) = 코퍼
- 교환 비율: 1 CRN = 10 FNC = 1000 CRM
- 분배: 프로젝트별 보상 풀 → 기여 비율 비례 분배
- "한 번 시작하면 멈출 수 없다" — 완전성이 핵심
포트 배정
| 서비스 | 포트 |
|---|
| bank.crowny.org | 9400 |
| wallet.crowny.org | 9410 |
| dex.crowny.org | 9729 |
| project.crowny.org | 9730 |
| reward.crowny.org | 9738 |
| chain.crowny.org | 9734 |
관련 파일 경로
- DEX:
/Users/ef/crowny-dex/
- 지갑:
/Users/ef/crowny-wallet/
- 프로젝트:
/Users/ef/crowny-project/
- 뱅크:
/Users/ef/crowny-bank/
- 체인:
/Users/ef/crowny-chain/
한선씨 관성
- 세션 시작 시 3% → 작업 후 87% (한선씨 우위)
- 총 한선씨 파일: 13+ 파일, 4000+ 줄
- 모든 파일 hanseonc_high 컴파일 EXIT=0 검증 완료
잔여 이슈 (해결됨 2026-05-21)
- ✅ 통합 시작 스크립트 —
crowny-finance/start-all.sh + 금융통합시작.한선
- ✅ E2E 테스트 —
crowny-finance/E2E테스트.한선 (소켓연결 기반 HTTP 클라이언트)
- ✅ 장애 복구 프로토콜 —
crowny-project/장애복구.한선 (WAL + 멱등성)
- ✅ 워치독 —
crowny-finance/watchdog.sh (분배서버 5초/일반 15초 감시)
무중단 보장 메커니즘
- WAL (Write-Ahead Log): 분배 직전 의도 기록 → 재시작 시 재생
- 멱등성: 같은 분배ID 두 번 적용해도 안전 (완료ID 캐시)
- 워치독: reward/project 서비스 5초 간격 감시 → 다운 시 즉시 재기동
- 3세대 백업 로테이션: WAL 파일 자동 회전
실서버 통합 완성 (2026-05-22)
발견·수정한 한선씨 VM 함정 3종
- 함수명 예약키워드 충돌:
잔액가져오기 → 가져오기 키워드 포함 → 토층 무한루프. 잔액읽기로 변경
TCP읽기 인자 누락: opcode가 [fd, 최대] 2인자 필요. TCP읽기(cl) 1인자 → max=0 → 빈 요청. 전 서버 TCP읽기(x, 4096) 일괄 수정
설정 읽기 오용: 설정(arr,i,v)은 쓰기 전용(mem[arr+i]=v). 설정(arr,i,"")를 읽기로 쓰면 배열 파괴. 읽기는 꺼내(arr,i). wallet 13곳, reward 19곳 수정
보상 분배 → 지갑 실입금 통합
- wallet 서버에
POST /api/wallet/credit 추가 (시스템→유저 보상 입금)
- reward 서버의
분배실행이 각 분배 건마다 wallet입금() 소켓 HTTP 호출
- 입금 성공/실패를 분배 이력 reason에 기록 ("기여분배" / "기여분배-미입금")
E2E 검증 결과 (18/18 통과, 내용 기반)
- 기여 등록: alice type1×100=10000점, bob type2×80=4000점
- 풀 1000 CRN 분배: alice 714(71.4%), bob 286(28.6%) — 가중치·비율 정확
- wallet 실잔액 확인: alice CRN 714/FNC 3571/CRM 14286, bob CRN 286/FNC 1429/CRM 5714 — 분배 결과와 정확히 일치
- 분배 이력 전건 "기여분배" (미입금 0건)
가동 검증 완료 — 5개 한선씨 서비스 (2026-05-22)
| 서비스 | 포트 | 한선씨 파일 | 상태 |
|---|
| bank | 9400 | 크라우니뱅크.한선 | LISTEN, WAL 172건 리플레이 |
| wallet | 9410 | 지갑서버.한선 | LISTEN, credit/send/convert 검증 |
| dex | 9729 | DEX서버.한선 | LISTEN, 입금/조회 검증 |
| chain | 9734 | 코어서버.한선 | LISTEN, 헬스 ok |
| reward | 9738 | 보상분배서버.한선 | LISTEN, 분배+wallet연동 검증 |
DEX 설정 버그 수정
- DEX서버.한선
설정 120곳 중 102곳이 읽기 오용 → 꺼내로 일괄 변환
- 남은 18곳은 정당한 재대입 쓰기 (
목록 = 설정(목록,i,표현식))
- 재컴파일 후 입금 5000 → 조회 5000 정상 확인
bank 서버 — 설정 버그 없음
- bank의 67곳은
JSON설정(JSON 라이브러리)이지 설정(배열)이 아님 — 오탐
- TCP읽기만 수정, 정상 가동
2026-05-22 후속 고도화
7서비스 체제 완성
| 서비스 | 포트 | 비고 |
|---|
| bank | 9400 | /health 인증면제 완료 |
| wallet | 9410 | credit API |
| dex | 9729 | 오더북/매칭/체결 E2E 검증 |
| chain | 9734 | POST /api/tx 거래기록 |
| reward | 9738 | WAL 무중단 분배 |
| projint | 9758 | 프로젝트통합서버.한선 (E2E 14단계 PASS) |
| monitor | 9743 | 관제서버.한선 (6서비스 통합 헬스) |
장애복구 WAL 무중단 분배 (검증 완료)
- reward 분배 시 wallet 입금 실패 →
data/미입금.wal에 기록
POST /api/retry — WAL의 미입금 건 재시도, 성공분 제거
- 워치독이 30초마다
/api/retry 자동 호출
- 검증: wallet 다운 중 분배 → 미입금 WAL 기록 → wallet 부활 → retry →
retried:1,remaining:0, 잔액 정확 복구
워치독 hang-aware 개선
- 기존: 포트 점유(lsof)만 확인 → LISTEN하나 무응답(hang)인 서비스를 못 잡음
- 개선: 실제
curl /health 응답 확인 → hang도 다운으로 감지
- restart_service: 포트 점유 프로세스 강제 종료(kill -9)로 hang 프로세스 확실히 제거
- 검증: DEX hang → 워치독 감지 → 자동 재기동 확인
DEX 매칭 E2E (검증 완료)
- trader2 매도 100@50 + trader1 매수 100@50 → 체결 T-1
- 체결 후: trader1 CRN 95000/ABC 100, trader2 CRN 105000/ABC 900 — 정확
- chain에도 거래 기록
chain 거래 기록 연동
- chain 코어서버에
POST /api/tx 추가 (from/to/asset/amount/memo → SHA256 txid)
- reward 분배 시 각 건을 chain에 기록, 실패해도 분배는 계속
워치독 LaunchAgent 상시화 (완료)
~/Library/LaunchAgents/org.crowny.finance.watchdog.plist — RunAtLoad + KeepAlive
- 재부팅·워치독 자체 크래시에도 launchd가 되살림
- 7서비스(bank/wallet/dex/chain/reward/projint/monitor) 전부 자동복구 대상
게이트웨이 등록 불일치 (발견 — 수정 보류)
gateway.yaml 등록과 실제 가동 포트 불일치:
dex.crowny.org → 9402 등록 (실제 DEX는 9729 가동)
chain.crowny.org → 9729 등록 (실제 chain은 9734 가동)
artist.crowny.org → 9734 등록 (실제 artist 미가동, chain이 9734 점유)
→ 정정하려면 artist.crowny.org 포트 재배치가 필요 — 타 서비스 영향이라 사용자 결정 후 처리.
→ 내부 통합은 localhost:port 직결이라 정상 동작 (E2E 검증 완료). 도메인 라우팅 레이어만 영향.
분배 시스템 보안 게이트 (완료)
- 돈이 움직이는 엔드포인트(
POST /api/pool/create, POST /api/distribute/:pid)에 관리자 토큰 검증
- 바디
"token":"CRN-REWARD-ADMIN-2026-729" 필드로 인증
J응답에 401 Unauthorized 상태 추가
/api/retry는 인증 없음 — WAL 재시도(이미 기록된 실패분만 처리, 새 돈 미생성), 워치독 자동 호출용
- E2E에 "인증없는 분배 거부" 검증 추가 → 19/19 통과
2026-05-27 후속 — 8서비스 체제 + 보안/UI 완성
발견·수정한 핵심 버그
- 워치독 bash 3.x 호환성 — macOS
/bin/bash(3.2.57)는 declare -A 미지원 → 모든 서비스가 monitor 포트(:9743)로 잘못 매핑되어 무한 오재시작. plist를 /opt/homebrew/bin/bash(5.x)로 변경 + shebang 통일.
- reward TOAU 경로 충돌 —
/tmp/crowny-reward.toau가 monitor 코드로 덮인 채 가동. TOAU 파일별 고유 경로(/tmp/reward.toau, /tmp/monitor.toau) 분리.
- 워치독 startup grace 부족 —
restart_service의 sleep 1이 큰 TOAU(bank 2.8MB)에 부족 → hang 오판 → 무한 재시작. grace 5초 + check_alive 2회 retry 추가.
보안 게이트 강화 (reward 서버)
- Rate limiting — IP별 분당 30회, 초과시 60초 차단
- 분배 한도 — CRN 10만/FNC 100만/CRM 1천만 상한
- 분배 쿨다운 — 같은 프로젝트 30초 내 재분배 금지
- 감사 로그 —
/Users/ef/crowny-project/data/감사.log에 행위/주체/상세 기록
- 검증: 6건 보안 게이트 전부 정상 작동 (토큰X→401, 한도초과→400, 정상→200, 쿨다운→400)
보상 UI v2 완성 (rewardUI.crowny.org:9764)
/Users/ef/crowny-project/보상UI v2.한선 (290줄, 17함수)
- 6화면: 프로젝트 목록 / 기여등록(7유형) / 풀충전 / 분배실행(2단 확인) / 실시간 분배이력(5초 폴링) / WAL 재시도
- 다크 verdant 톤, 분배 시작 시 확인 모달("멈추지 않음" 경고)
- 관리자 토큰
type=password autocomplete=off + 즉시 clearTok (localStorage 미저장)
분배 fast-path 무중단 패턴 (2026-05-28 확정)
문제: 분배실행이 매 입금마다 wallet/chain에 소켓 호출 → wallet 다운 시 소켓수신이 무한 대기 → 분배 hang → reward 자체가 워치독에 강제 재시작되며 분배 트랜잭션 유실 위험.
근본 해결: 분배실행을 fast-path로 단순화.
- 분배 = 무조건
미입금기록(uid, 자산, 금액) (WAL에 즉시 기록만)
- 실제 wallet 입금 = retry worker(워치독 30초마다
/api/retry 호출)가 담당
- WAL이 단일 원본(SSOT). 분배는 1ms~수십ms 내 완료, wallet 가동/다운과 무관.
v5 시나리오 검증 결과:
분배 응답: 14ms (wallet 다운 상태)
WAL 6건 정확 기록 (CRN/FNC/CRM × 2명)
wallet 부활 + retry → 6건 전부 입금, 잔액 정확
fp-a: CRN 300/FNC 1200/CRM 12000 (60%)
fp-b: CRN 200/FNC 800/CRM 8000 (40%)
합계: 500/2000/20000 (풀과 완전 일치, 누락/중복 0)8서비스 체제 완성
| 서비스 | 포트 | 한선씨 파일 | 검증 |
|---|
| bank | 9400 | 크라우니뱅크.한선 | ✓ |
| wallet | 9410 | 지갑서버.한선 | ✓ |
| dex | 9729 | DEX서버.한선 | ✓ |
| chain | 9734 | 코어서버.한선 | ✓ |
| reward | 9738 | 보상분배서버.한선 (보안+WAL+감사) | ✓ |
| projint | 9758 | 프로젝트통합서버.한선 | ✓ |
| monitor | 9743 | 관제서버.한선 | ✓ |
| rewardUI | 9764 | 보상UI v2.한선 | ✓ |
워치독 LaunchAgent(bash 5.x)가 8서비스 전부 자동복구.
E2E 테스트
19/19 통과 (보안 게이트 추가에도 회귀 없음).
잔여 이슈
- 게이트웨이 dex/chain/artist 포트 재배치 (사용자 결정 필요)
- DEX/projint 누적 가동 후 hang — 워치독으로 자가치유하나 근본원인(crownyc VM 단일스레드) 미해결
- gateway.yaml에 reward.crowny.org/projint.crowny.org/monitor.crowny.org/rewardUI 도메인 매핑 (gateway 세션 위임)
- contribute API에도 유저 인증 적용 (auth.crowny.org SSO 연동 후)
감사기록 함수가 셀코어 라이브러리와 이름 충돌 (동작은 정상, 추후 보안감사로 개명 권장)