최종성과 롤백
ZooBC의 블록은 두 가지 방식으로 최종이 됩니다. 블록이 720블록(3시간)보다 깊어지면, 네트워크와 보조를 맞추는 어떤 노드도 그 블록을 롤백하지 않습니다. 그리고 좌석의 3분의 2가 공동 서명한 스파인 블록이 그 블록이나 그 이후의 블록을 체크포인트로 지정하면, 경쟁 분기가 어떤 무게를 주장하든 어떤 노드도 그 아래로는 아예 재구성하지 않습니다. 이 한계의 잘못된 쪽에 고립된 노드는 거기 머물러 있지 않습니다. 스스로 막힘(wedged) 상태를 선언하고 네트워크로부터 자신을 재구축합니다.
엄격한 한계 안의 롤백
ZooBC 노드는 가장 무거운 분기를 따릅니다(포크 선택과 누적 난이도 참조). 더 무거운 분기를 알게 된 노드는 자기의 최근 블록들을 두 분기가 갈라진 지점까지 롤백한 뒤, 다른 분기의 블록들을 하나씩 검사하며 적용합니다. 롤백은 버전이 관리되는 행으로부터 모든 상태 테이블을 목표 높이로 복원하며, 제거된 블록의 코인베이스도 포함됩니다.
이 롤백에는 엄격한 한계 max_rollback_height가 있습니다. mainnet에서 720블록, 블록당 15초로 3시간이며, devnet에서는 60블록(15분)입니다. 이보다 깊은 롤백이 필요한 분기는 무게와 상관없이 거부됩니다.
이 한계가 안전한 것은 노드가 결코 무턱대고 롤백하지 않기 때문입니다. 노드는 자기 체인에 손대기 전에 경쟁 분기를 가져와 무게를 잽니다. 실제 분기점을 찾고, 무엇이든 내려받기 전에 깊이를 검사하며, 분기의 무게를 페이지 단위로 재고, 정해진 횟수만큼 시도한 뒤에는 포기하며, 분기가 더 무겁다고 입증된 뒤에야 롤백합니다.
체크포인트 하한
스파인 체인은 두 번째의, 더 강한 보장을 더합니다. 각 스파인 블록은 메인 체인의 참조 블록을 지정하며, 높이만이 아니라 해시와 무게로 정확히 고정합니다. 노드가 충분한 공동 서명을 가진 스파인 블록을 저장하면, 그 참조 높이가 체인의 확정 높이가 됩니다.
어떤 재구성도 이를 넘지 못합니다. 노드는 분기점이 확정 높이 아래에 있는 포크를 블록 하나도 가져오기 전에 거부하며, 그 아래의 블록을 제거하라는 요청을 받아도 다시 거부합니다. 스파인 블록에는 등록 좌석 3분의 2의 공동 서명이 필요하고, 각 서명자는 먼저 그 내용을 자기 체인과 대조하므로, 체크포인트는 레지스트리 전체의 진술입니다. 모든 정직한 노드는 이를 저장하는 즉시, 추가 스파인 블록을 기다리지 않고 최종으로 취급합니다.
체크포인트가 롤백 한도보다 깊은 이유
여기서 두 수치가 만납니다. 노드는 최대 720블록까지 롤백할 수 있습니다. 그리고 스파인 체크포인트는 그것이 지정하는 스냅샷과 마찬가지로 최상단보다 760블록 아래의 체인을 기술합니다(main_snapshot_min_height).
체크포인트가 롤백 한도보다 얕다면, 스파인은 정당한 재구성으로 아직 바뀔 수 있는 블록을 확정해 버릴 수 있고, 그러면 서명된 체크포인트와 모두가 따르는 체인이 어긋날 것입니다. 그래서 제네시스 생성 도구는 main_snapshot_min_height가 max_rollback_height보다 최소 20블록 커야 한다고 요구합니다. mainnet은 720에 대해 760으로 40블록의 여유를 두며, devnet은 60에 대해 80으로 같은 형태를 유지합니다. 체크포인트가 지정하는 모든 블록은 이미 허용되는 어떤 롤백보다도 뒤에 있습니다.
고립된 노드: 막힘과 재구축
롤백 한도보다 오래 단절되었던 노드는 네트워크의 나머지가 자기 손이 닿지 않는 더 무거운 분기를 따랐다는 것을 알게 될 수 있습니다. 노드는 그쪽으로 롤백하지도 않고, 영원히 혼자 계속하지도 않습니다.
최소 세 개의 등록 피어가 손이 닿지 않는 더 무거운 분기를 확인하면, 노드는 스스로 막힘 상태를 선언하고 자기 분기에서 블록 생산을 멈춥니다. 노드 자체의 막힘 탐지기도 로컬 규칙으로, 한 높이에서 최소 2개의 피어를 상대로, 최소 1,800초(30분)에 걸쳐 10번 연속으로 포크 해결에 실패하는지 지켜봅니다. 버전 0.5.8부터 기본값인 auto_resync가 켜져 있으면, 막힌 노드는 로컬 체인을 버리고 스파인 체크포인트와 스냅샷에서 시작해 네트워크로부터 체인을 재구축합니다(스냅샷과 빠른 동기화 참조).
뒤처진 노드는 레지스트리를 따릅니다
최상단 블록이 7,200초(2시간)보다 오래된 노드는 자기가 앞서 있다고 주장하는 아무 피어나 믿지 않습니다. 등록 피어 표본의 3분의 2 이상(피어 n개 중 최소 ceil(2 × n / 3)개, n은 최소 3)이 보고하는 최상단 블록을 따릅니다.
확률적 최종성과의 비교
작업 증명에서 블록에 대한 확신은 깊이와 함께 커지지만 결코 확실해지지 않습니다. Bitcoin 사용자는 흔히 결제를 확정된 것으로 보기 전에 여섯 블록을 기다립니다. ZooBC는 그 관습을 규칙으로 대신합니다. 3시간의 엄격한 롤백 한도와, 대략 하루에 한 번의 공동 서명된 체크포인트이며, 그 아래의 이력은 바뀌지 않습니다. 그 대가로, 소수 분기에서 3시간 넘게 단절되었던 노드는 롤백으로 되돌아갈 수 없고 대신 재구축합니다.