← 목록
기타 2026-05-28 3KB 읽기 4분

crowny-reward Phase 11: FuncRef u32 + 루프 백점프 와이드 인코딩

날짜: 2026-05-28 담당: Claude Sonnet 4.6


개요

보상서버에 8개 신규 모듈(인증/티옴타_클라/가치동기화/영속압축/멤버검색/만기시뮬/멤버유형/만기정산) 추가 시 발생하던 라우트 timeout의 두 번째 본질 한계를 추적하여 3개 추가 버그를 발견하고 수정 완료. CrownyTVM을 cargo build --release로 재빌드 후 27모듈 통합 서버에서 3개 핵심 라우트 전체 정상 응답 확인.


무엇을 했는가

발견한 버그 3개

  1. 루프 백점프 Trit9 truncation (핵심 원인)
- emit_a(op::JMP, loop_start) 가 loop_start를 Trit9(±9841)로 저장 - 코드가 9841 인스트럭션 초과 시 루프 시작 주소가 음수로 래핑 - 동안(참) 메인 서버루프가 1회만 실행 후 탈출 → 다음 요청 처리 불가 - WAL 복구 루프 디버그로 정확히 i=1에서 탈출 확인 - 수정: emit_jmp_wide() 헬퍼(BASE=9841 와이드 인코딩) 추가, 루프 백점프 4곳 교체

  1. FuncRef(u16) 오버플로
- 함수 시작 PC가 u16(65535) 초과 시 0으로 래핑 → CALL이 잘못된 PC 실행 - 27모듈 통합 시 ~50,000+ 인스트럭션 → u16 한계 접근 - 수정: trit.rs / codegen.rs / engine.rs 전체에서 u16 → u32 확장

  1. max_cycles = 100M 서버 고갈
- 서버의 동안(참) 루프가 100M 사이클 소진 후 종료 - 수정: vm.max_cycles = u64::MAX

수정된 파일

  • /Users/ef/Downloads/CrownyTVM/src/compiler/codegen.rsemit_jmp_wide() 추가, 루프 백점프 4곳, FuncRef as u32
  • /Users/ef/Downloads/CrownyTVM/src/vm/trit.rs — FuncRef(u32), Closure { func_ref: u32 }
  • /Users/ef/Downloads/CrownyTVM/src/vm/engine.rs — call_func(u32), MAKE_FUNC/CLOSURE u32, wide_jmp_target
  • /Users/ef/Downloads/CrownyTVM/src/main.rs — max_cycles = u64::MAX, direct_output = true
  • /Users/ef/crowny-reward/보상서버.한선 — 8 신규 모듈 가져오기 추가 (Phase 11 주석)

최종 검증 결과

포트 9915, _test_보상서버_9915.han (27모듈 통합):

curl http://localhost:9915/stats
→ {"members":1,"cultures":0,"total_crd":1320,"progress":1,"stage":0}

curl http://localhost:9915/declare
→ ════════ reward.crowny.org — CRP 9 원리 헌장 ════════ ...

curl "http://localhost:9915/work?id=alice&kc=27&v=165"
→ {"id":"alice","earned_crd":1320,"new_grade":"정규","new_total_kc":54,
   "create_3x":3960,"member_share":1320,"ecosystem_share":1320,"reserve_share":1320}

3개 핵심 라우트 전체 정상.


관련 파일 경로

  • 분석 보고서: /Users/ef/crowny-reward/.compiler_threshold_analysis.md
  • 보상서버 소스: /Users/ef/crowny-reward/보상서버.한선
  • 테스트 파일: /Users/ef/crowny-reward/_test_보상서버_9915.han
  • CrownyTVM 소스: /Users/ef/Downloads/CrownyTVM/src/
  • 바이너리: /Users/ef/Downloads/CrownyTVM/target/release/crowny

잔여 이슈

  • 포트 9738의 구 crownyc 서버(LaunchAgent 자동 재시작)와 신규 CrownyTVM 서버 간 전환 필요
  • _test_*.han 임시 테스트 파일 정리 (9905~9915 포트 테스트용 — 선택적 삭제 가능)
  • 상수 풀 인덱스 한계(Trit9 ±9841, 현재 ~620 사용 중) — 50+ 모듈 통합 시 재검토 필요