연합체인 anti-entropy 차분 동기화 (Phase4 P5)
개요
연합 앵커-노드 간 체인 동기화에서 전체 nodes.ndjson 재전송을 제거하고, Consul anti-entropy(Detect → Highlight → Repair → Verify) 방식으로 누락 블록만(delta) 전송한다. 노드가 자기 헤드(마지막 블록해시)를 보내면 앵커는 그 헤드 이후 블록만 골라 전송한다. 헤드가 같으면 전송 0바이트.
라이브 게이트웨이(:8080/:8443/gateway.yaml) 무접촉. 연합 모듈(:9160)만 수정.
무엇을 했는지
신규 라이브러리 (ADDITIVE, 자동실행 없음)
크라우니게이트웨이연합동기화.한선 — 8함수
체인헤드()— head.txt(마지막 블록해시) 반환 (Detect 기준값)블록목록(since해시)— since 이후 블록만 직렬 반환. since 빈값/영해시→전체.
차분적용(받은블록들)— Repair: 받은 첫 블록 prev==로컬 헤드면 append-only 머지(+새헤드).
- 헬퍼:
S공백정리 / S값 / S첫줄prev / S끝줄hash / S블록수
신규 검증 진입점
크라우니게이트웨이연합동기화검증.한선 — 비파괴(/tmp 임시체인 5블록), 7케이스 전부 PASSAPI 엔드포인트 추가 (:9160)
크라우니게이트웨이연합API.한선
가져오기 "크라우니게이트웨이연합동기화.한선"추가GET /head—{ok,head,blocks}(Detect)GET /sync?since=<해시>— since 이후 블록 ndjson (Highlight). 빈값=전체, head=0바이트, 위조=전체폴백/자기소개 JSON에 두 엔드포인트 등재
검증 결과
3레이어 트리플체크 (컴파일/실행/구조 전부 ✅ PASS):
- 동기화.한선: 함수8, 7679큐브, 215KB TOAU
- 동기화검증.한선: --run ✅ 7/7 PASS
- 연합API.한선: 함수18, 36047큐브, 1MB TOAU (sync import 후 정상 컴파일)
① 전체 블록목록("")=5 PASS
② 차분 블록목록(h2)=2 PASS → 전송절감 3블록 60%
③ 동일 블록목록(head)=0 PASS (Detect 전송0)
④ 위조 since=5 PASS (전체 폴백)
⑤ 차분적용(이어지는 2블록)=+2, head=h4 PASS (머지후 5블록)
⑥ 분기거부 차분적용=-1, 체인 무손상 5 PASS
⑦ 빈입력 차분적용=0 무변화 PASS
라이브 :9160 curl (실제 연합체인 4블록, head c3e537...):
GET /head → {"ok":true,"head":"c3e537...","blocks":4}
GET /sync → 4블록(전체)
GET /sync?since=4277b6... → 2블록(node-busan, node-legacy) ← 차분
GET /sync?since=c3e537(head)→ 0바이트 ← Detect 전송0
GET /sync?since=deadbeef... → 4블록(전체 안전 폴백)
테스트 서버 종료 후 실제 체인 무손상 확인(4블록, head 동일).전송절감: 노드가 1블록 뒤처졌을 때 N블록 체인 → 전체 N 대신 1블록만 전송. 헤드 동일 시 0바이트(메타데이터만). 차분 비율 = (전체-차분)/전체.
관련 파일
/Users/ef/crowny-gateway/한선게이트웨이/크라우니게이트웨이연합동기화.한선(신규)/Users/ef/crowny-gateway/한선게이트웨이/크라우니게이트웨이연합동기화검증.한선(신규)/Users/ef/crowny-gateway/한선게이트웨이/크라우니게이트웨이연합API.한선(수정: import + /head + /sync)/Users/ef/crowny-gateway/data/federation-chain/nodes.ndjson(읽기만, 무손상)
잔여 이슈 / 인수인계
- 풀(full) pull 자동화: 노드 쪽에서
GET /head→ 로컬 헤드와 비교 →
GET /sync?since=<로컬헤드> → 차분적용() 하는 풀 루프(노드 측 진입점)는 미구현.
현재는 앵커가 차분을 제공하는 절반만 구현. 노드 측 pull 클라이언트가 다음 단계.
- /sync 서명: 현재 /sync 는 읽기전용·공개. 운영 시 노드 인증(계층A 공유키) 게이팅 검토.
- 대용량 차분 청크: 차분이 STR_MAX(16KB) 초과 시 호출측 청크 전송 필요(현재 라인누적 1응답).
?since=&limit=) 추가 권장.
- 분기(fork) 해소: 차분적용 -1(분기) 시 현재는 거부+보고만. fork 자동 해소 정책(최장체인 등) 미정.