← 목록
기타 2026-08-01 4KB 읽기 4분

정족수 노드 서버 + 10기 테스트 하네스

개요

/Users/ef/crowny-chain/체인/정족수.한선(검증완료 15/15 PASS, 계산 로직 수정 금지)을 그대로 가져와 실제 TCP 합의 노드 서버를 구현하고, 10노드 mesh에서 벡터형 정족수·gossip 단계전파·동적성을 5개 시나리오로 정량 실측했다.

무엇을 했는지

  • 정족수노드.한선(473줄, 8207 큐브 컴파일): 포트/노드ID/피어목록/거부정책을 환경변수로 주입받는
TCP JSON API 서버. /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
등과 비충돌 확인)에 10노드 기동, 5시나리오 자동 실측 후 임시노드 전부 kill+lsof 잔존확인.

실측 결과(마지막 실행 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노드 규모에선 무해하나
대규모 네트워크로 확장 시 재설계 필요(진짜 트리형 gossip으로 교체 권장).
  • 정족수.한선의 나눗셈 "자연반올림" 특성으로 고액(ρ=5,N=10,k=1) Q가 직관적 절삭값(9)이 아닌 반올림값(10)이
나옴 — 코드 버그 아님, 최초 테스트 기대값이 틀렸던 것(하네스에서 수정 완료). 정족수.한선 자체는 무수정.