노드 P2P 확장 — 다른 컴퓨터를 체인 노드로
개요
검증된 체인원장(WAL 리플레이) 위에 P2P 노드 레이어를 올려, 다른 컴퓨터를 노드로 붙여 op-log 교환만으로 최종일관성 수렴(이중계상 없음)하도록 구현. chain-node.crowny.org:9412 등록.
설계 — CRDT grow-only op-log
- 각 op에 고유 opID = 노드ID-seq. 종류 M(발행)/T(이체).
- 노드는 적용됨(seen) 집합 유지 → 같은 opID 재적용 시 멱등 skip(이중계상 0).
- op-log(WAL) 교환 = 수렴. 순서 무관, 중복 안전.
산출 (한선씨, 검증)
노드.한선 — 노드생성/적용(멱등)/발행/이체/부팅리플레이/동기화적용/oplog/잔액/피어.
노드서버.한선 — HTTP 노드(상단 상수 sed로 인스턴스 분리). 엔드포인트:
/api/status /api/oplog /api/balance?id= /api/mint?id=&amt= /api/transfer?from=&to=&amt=
/api/sync?host=&port= (피어 /api/oplog 풀 → 멱등 적용)
피어 GET = 검증된 소켓 클라이언트(소켓생성(2,1)/소켓연결/소켓보내기/소켓받기). HTTP클라이언트.한선 GET은 TCP대기(서버) 오용이라 미사용.검증 (실측 — 2노드 네트워크)
- A(9412): 재단100 발행 → 재단→은행30 이체 (재단70/은행30). B(9413): 채굴27 발행.
- B sync←A: applied 2. A sync←B: applied 1. → 양 노드 재단70/은행30/채굴27 수렴.
- 멱등 재동기: applied 0 (이중계상 없음).
- 재시작 복원: A KILL→재기동 → opcount3·재단70·채굴27(피어에서 받은 op 포함) WAL 리플레이 복원.
- HTTP 헤더는 동기화 파서(5필드 미만)가 자동 무시 → 본문 추출 불필요.
관련 파일
/Users/ef/crowny-data/services/노드.한선, 노드서버.한선
- 검증:
/tmp/노드수렴.한선(오프라인 CRDT), 2인스턴스 9412/9413
- 포트: chain-node.crowny.org:9412 (gateway.yaml SSOT)
잔여
- 푸시 게시(gossip): 현재 풀(/api/sync). 자동 주기 동기화/푸시 추가 가능.
- 소켓받기 65536 단일 read → 대용량 op-log는 청크 루프 필요(현재 데모 규모 OK).
- 실 원격 노드(다른 물리 컴퓨터) 주소 등록 + 인증/서명.