정족수 노드 서버 + 10기 테스트 하네스
개요
/Users/ef/crowny-chain/체인/정족수.한선(검증완료 15/15 PASS, 계산 로직 수정 금지)을 그대로 가져와
실제 TCP 합의 노드 서버를 구현하고, 10노드 mesh에서 벡터형 정족수·gossip 단계전파·동적성을
5개 시나리오로 정량 실측했다.무엇을 했는지
정족수노드.한선(473줄, 8207 큐브 컴파일): 포트/노드ID/피어목록/거부정책을 환경변수로 주입받는
/propose(제안) /vote_req(투표요청, gossip 1홉씩 전파) /vote_reply(투표회신)
/status(GET) /set_volume(POST, B용 최근거래금액 이력 설정) /health.
bind 실패 시 while 루프 미진입으로 즉시 프로세스 자연종료(busy-spin 금지, 명시적 종료API 없어 대체).
10기하네스.sh: 임시 포트 9470~9479(사전crowny-ports.sh check로 라이브 포트 9400·9402·9603·9729
실측 결과(마지막 실행 exit 0)
| 시나리오 | 결과 |
|---|---|
| 1. 정족수 스케일(N=10,B=1000) | 소액300→Q1, 보통1000→Q5, 고액5000→Q10, 초고액100000→Q10 — 전부 공식과 일치 |
| 2. 소액 즉시확정+전파 | 제안 즉시 자기표만으로 "티" 확정, 7초 내 10/10 노드 전파 도달, 최대 홉수 1 |
| 3. 고액 대기 | 고액(ρ=100,Q=10=N)은 즉시 "티" 되지 않음(REJECT 노드 6기 존재로 즉시 "타") — "즉시확정 아님" 검증 통과 |
| 4. 동적성 | 같은 금액 1000: B=1000→Q5, B=20000→Q1(소액판정 임계 진입) — 벡터형 하락 확인 |
| 5. 거부 정족수 | REJECT 노드 6기(4~9), 보통금액(Q=5,거부한계=5)에서 거부수6>5 → "타" 확정 |
중요 VM 함정 (신규 발견)
싱글스레드 blocking accept-loop 서버가 서로 동기 curl로 호출하면 순환 데드락. 초기 구현은/propose 핸들러 안에서 9개 피어에게 동기 curl(체계())로 /vote_req를 순차 전송했는데,
각 피어도 자신의 핸들러 안에서 다시 전 피어(제안자 포함)에게 동기 broadcast를 하다 보니
"A가 B의 응답을 기다리는 동안 B는 A에게 다시 접속을 시도하지만 A가 accept를 못 하는" 순환 대기가
발생해 10노드 mesh에서 /propose 자체가 20초+ 응답불가로 멈췄다.
해법: 원격 POST를 (curl ... &) </dev/null 형태 백그라운드 서브셸+stdin분리로 바꿔
체계() 호출이 즉시 반환하도록(fire-and-forget) 수정 — 데드락 해소, 5시나리오 전부 통과.
(기존 CLAUDE.md에 있던 "체계()로 데몬 기동 시 서브셸+stdin분리" 함정과 동일 계열이지만,
이번엔 데몬 기동이 아니라 노드간 RPC 호출에서도 같은 패턴이 필요하다는 점이 신규 확인 포인트.)Korean URL 경로 curl 자동 percent-encoding. 최초 API 경로를 /제안 /투표요청 등 한글로 설계했으나
curl이 비ASCII 경로를 자동으로 %ec%xx%xx로 퍼센트인코딩해 서버측 경로 == "/제안" 비교가 항상 실패했다.
해법: HTTP 경로만 ASCII(/propose,/vote_req,/vote_reply,/status,/set_volume)로 변경,
내부 함수/변수/JSON 필드명은 한글 유지(한선씨 우선 규칙과 충돌 없음 — 이건 외부 프로토콜 표기 문제).
관련 파일
/Users/ef/crowny-chain/체인/정족수노드.한선(신규, 473줄)/Users/ef/crowny-chain/체인/10기하네스.sh(신규)/Users/ef/crowny-chain/체인/정족수.한선(기존, 미수정 — 그대로 가져다 씀)- 참조만 함(복붙 안 함):
/Users/ef/crowny-gateway-chain/체인/합의엔진.한선
잔여 이슈
- gossip 전파는 fire-and-forget이라 타이밍이 비결정적 — "홉수 수렴"으로만 판정(문서화됨), 밀리초 단위
date +%s 정밀도 한계).
/vote_reply회신도 전 피어에 동보하는 방식이라 N이 커지면 트래픽 O(N²) — 10노드 규모에선 무해하나
- 정족수.한선의 나눗셈 "자연반올림" 특성으로 고액(ρ=5,N=10,k=1) Q가 직관적 절삭값(9)이 아닌 반올림값(10)이