ZooBC 위키
보안과 아키텍처

스파인 체인

모든 ZooBC 노드는 두 체인을 보관합니다. 메인 체인은 15초마다 블록을 만들고 트랜잭션을 담습니다. 그 옆에서 스파인이 돌아갑니다. mainnet에서 하루에 블록 하나이며, 트랜잭션은 전혀 담지 않습니다. 스파인 블록은 레지스트리 전체가 보증하는 것, 즉 메인 체인의 체크포인트, 합류하거나 떠난 노드 키, 최신 스냅샷의 매니페스트를 기록하며, 좌석 3분의 2의 서명이 필요합니다. 그래서 스파인은 최종성의 닻이자 모든 새 노드의 출발점입니다.

스파인 블록이 담는 것

  • 체크포인트. 각 스파인 블록은 확정될 만큼 깊은 메인 체인의 참조 블록을 지정합니다. 스파인 블록을 만들 때 메인 체인 최상단보다 760블록(3시간 10분) 아래이며, 이전 스파인 블록의 참조보다 결코 낮지 않습니다. 스파인 블록은 그 블록의 머클 루트를 복사하고, 그 페이로드 해시는 참조 블록 자체의 해시와 누적 난이도를 포함하여 확정하므로, 체크포인트는 높이만이 아니라 정확히 하나의 블록을 고정합니다.
  • 공개 키 변경. 이전 스파인 블록 이후 레지스트리에 추가되거나 제거된 노드 키
  • 스냅샷 매니페스트. 메인 체인 상태의 최근 스냅샷마다 파일 전체의 해시, 모든 청크의 해시, 기준 높이, 만료, 메인 체인의 제네시스 해시(스냅샷과 빠른 동기화 참조)

스파인은 spine_smithing_period마다 블록 하나를 만듭니다. mainnet과 testnet에서는 86,400초, 즉 하루에 하나이고, devnet에서는 3,600초, 즉 한 시간에 하나이며 체크포인트 깊이는 80블록(20분)입니다.

세 칸으로 나눠 연 스파인 블록: 최상단 아래 760의 체크포인트, 레지스트리 키 변경, 스냅샷 매니페스트. 옆에는 좌석 11개 중 8개가 서명합니다: 3분의 2.
세 칸으로 나눠 연 스파인 블록: 최상단 아래 760의 체크포인트, 레지스트리 키 변경, 스냅샷 매니페스트. 옆에는 좌석 11개 중 8개가 서명합니다: 3분의 2.

좌석의 3분의 2가 공동 서명합니다

스파인 블록은 집합 서명을 담습니다. 4바이트 개수 뒤에, 서명자마다 32바이트 노드 키와 64바이트 Ed25519 서명이 오며, 모두 같은 헤더 204바이트에 대한 서명입니다. 블록의 해시는 헤더 바이트와 서명 필드 전체의 SHA3-256입니다.

필요한 서명 수는 다음과 같습니다.

required = max(spine_min_signatures, ceil(n × 67 / 100))

여기서 n은 서명자 목록의 크기입니다. 좌석이 11개이면 11 × 67 / 100 = 7.37이고, 올림하면 8입니다. 올림은 의도적입니다. 7은 11의 3분의 2에 못 미치기 때문입니다.

스파인은 정지 여부와 상관없이 서명자 목록의 모든 좌석을 셉니다. 이는 정지된 좌석도 여전히 집계되는 유일한 3분의 2 집계이며, 그래서 체크포인트는 언제나 전체 좌석의 3분의 2를 대변합니다(3분의 2 규칙 참조).

너무 많은 좌석이 사라져 스파인이 멈추면, 기준이 한 단계 완화됩니다. 저장된 스파인 블록 없이 스파인 기간 3개(mainnet에서 3일)가 지나면 과반, 즉 11개 중 6개로 충분합니다. 어느 기준도 모든 체인에서 5인 spine_min_signatures 아래로 내려갈 수는 없습니다. 11개 서명을 모두 요구하면 좌석 하나만 빠져도 스파인이 멈출 것입니다.

좌석 11개의 두 원: 평소에는 최소 8개가 서명하고(67 %, 올림), 스파인 블록 없이 3기간이 지나면 최소 6개(과반), 결코 5 미만은 아닙니다. 각 서명자는 먼저 키 변경, 매니페스트, 참조 깊이, 그리고 높이마다 블록 하나에만 서명하는지를 검사합니다.
좌석 11개의 두 원: 평소에는 최소 8개가 서명하고(67 %, 올림), 스파인 블록 없이 3기간이 지나면 최소 6개(과반), 결코 5 미만은 아닙니다. 각 서명자는 먼저 키 변경, 매니페스트, 참조 깊이, 그리고 높이마다 블록 하나에만 서명하는지를 검사합니다.

서명자는 서명하기 전에 검사합니다

좌석은 결코 무턱대고 서명하지 않습니다. 제안에 공동 서명하기 전에 각 서명자는 다음을 검사합니다.

  • 키 변경이 같은 범위에서 자기 레지스트리의 변경과 같은지
  • 자기 체인의 모든 매니페스트가 자기 스냅샷과 해시 하나하나까지 같은지. 스냅샷이 없는 서명자는 기권합니다.
  • 참조 블록이 충분히 깊고 뒤로 가지 않는지
  • 그 스파인 높이에서 이미 다른 블록에 공동 서명하지 않았는지

노드는 스파인 블록을 저장할 때 생산자 추첨, 블록의 난이도와 함께 내용을 다시 검사합니다.

누가, 언제 제안하는가

스파인의 생산자는 서명자 목록에서 추첨합니다. 인덱스 LE64(SHA3-256(seed ‖ "spine" ‖ round)) mod n의 서명자이며, 여기서 시드는 이전 스파인 블록의 참조 높이에 있는 메인 블록의 시드이므로, 모든 검증자가 이 추첨을 재현할 수 있습니다. mainnet에서 스파인 라운드는 100초, 생성 시간 창은 300초, 허용 오차는 150초입니다. 서명자는 60초의 수집 시간 창보다 오래된 제안을 거부합니다. 이전 스파인 블록에 기간을 더하고 허용 오차를 뺀 시각보다 이르게 오는 스파인 블록은 거부됩니다.

스파인 블록은 결코 비어 있지 않습니다. 경쟁하는 스파인 사이에서는 서명이 더 많은 쪽이 이깁니다. 노드는 무엇이든 롤백하기 전에 경쟁 스파인의 무게를 재고, 자기 스파인을 릴리스 핀 아래로 결코 롤백하지 않으며, 다른 스파인을 적용하지 못하면 자기 스파인을 복원합니다.

스파인의 용도

  • 최종성. 어떤 노드도 마지막으로 저장된 스파인 체크포인트 아래로 메인 체인을 재구성하지 않습니다(최종성과 롤백 참조).
  • 빠른 동기화. 새 노드는 먼저 스파인을 동기화합니다. 그 매니페스트가 어떤 스냅샷을 가져올지, 그 키 변경이 어떤 노드 키를 신뢰할지 알려 줍니다(스냅샷과 빠른 동기화 참조).
  • 아카이브. 모든 노드가 아니라 분산 저장소가 블록 0부터의 모든 스냅샷을 보관하므로, 누구나 스파인을 따라 과거의 어느 스냅샷까지든 거슬러 올라가 그 시점의 상태를 다시 만들 수 있습니다(아카이브와 과거 조회 참조).

스파인은 Foundation이 아니라 모든 노드가 보관하며, 그 위에서 거래되는 것은 없습니다.

같이 보기