이력 정리
모든 블록을 영원히 보관하는 체인은 모든 노드에 이력 전체를 저장하는 비용을 지웁니다. ZooBC 노드는 대신 정리(prune)합니다. 스냅샷에 연동된 경계 아래에서 오래된 블록, 트랜잭션, 원장 행, 영수증, 대체된 기록 버전을 삭제합니다. 잔액, 레지스트리 좌석, 데이터셋 행 같은 현재 상태는 이런 방식으로 정리되지 않으며, 오래된 이력만 정리됩니다. mainnet에서 실행 중인 노드는 30~60일치의 블록을 보관합니다.
경계
mainnet에서 172,800블록(약 30일)마다 각 노드는 상태의 스냅샷을 씁니다(스냅샷과 빠른 동기화). 정리 경계는 가장 최근 두 스냅샷의 기준 높이 중 더 오래된 쪽입니다. 스냅샷이 하나뿐이면 그 높이에서 간격 하나를 뺀 값이며, 스냅샷 매니페스트가 존재하기 전에는 아무것도 정리되지 않습니다. 버전 0.5.8부터 경계는 모든 노드가 공유하는 순수한 공식보다 앞서 나갈 수 없습니다.
horizon(h) = floor(h ÷ interval) × interval − interval
간격이 172,800블록이면 경계는 최상단 블록보다 간격 하나에서 둘만큼 뒤에 있습니다. 예를 들어 높이 500,000에서 경계는 최대 172,800이므로, 노드는 최신 블록 최소 327,200개, 약 57일치를 보관합니다. 다음 스냅샷인 518,400 뒤에는 경계가 간격 하나만큼 올라가고 약 30일치가 남습니다.
두 가지 한도가 더 있어 정리를 완만하게 합니다. 최신 1,440블록(6시간)은 경계가 무엇이라 하든 결코 정리되지 않으며, 노드는 블록마다 테이블당 최대 500행만 제거하므로 작업이 분산됩니다.
경계 아래에서도 남는 것
어떤 블록은 아무리 오래되어도 보관됩니다.
- 블록 0
- 롱제비티 기록에 아직 돈이 남은 트랜잭션을 담은 모든 블록. 그 트랜잭션과 함께 보관됩니다.
- 최신 스냅샷 시점에 자금이 적립된 트랜잭션. 스냅샷이 이를 담을 수 있도록 간격 하나만큼 더 보관됩니다.
스냅샷은 자금이 적립된 트랜잭션과 그 블록의 헤더를 담으므로, 스냅샷에서 합류한 노드도 이를 보관합니다.
다른 시계들
시간 범위가 있는 규칙은 정리만이 아니며, 숫자를 혼동하기 쉽습니다.
| 무엇 | mainnet에서의 기간 |
|---|---|
| 실행 중인 노드의 블록 | 30~60일 (스냅샷 간격 1~2개) |
| 결코 정리되지 않는 블록 | 최신 1,440개 (6시간) |
| 영수증 | 518,400블록, 약 90일 (영수증과 네트워크 토폴로지) |
| 트랜잭션 id | 최소 25시간, 가장 긴 유효 기간인 하루보다 김 (만료와 타임스탬프) |
| 롤백 한도 | 720블록, 3시간 (최종성과 롤백) |
롤백 한도는 체인이 얼마나 멀리 되돌아가 재구성할 수 있는지를 말할 뿐, 아무것도 삭제하지 않습니다.
더 많이 보관하기
- 운영자는 node.conf에
keep_all_history를 설정해 정리된 이력을 로컬에 보관할 수 있습니다. 이는 기본값이 아닌 로컬 선택입니다. - 누구나 롱제비티 예치금으로 트랜잭션 하나를 보관하는 비용을 낼 수 있습니다.
- 아카이브 노드는 노드 옆에서 인덱싱 서비스를 실행하고 익스플로러를 제공합니다(익스플로러와 아카이브 노드).
- 분산 저장소는 블록 0 이후의 모든 스냅샷을 보관하며, 각 스냅샷의 청크는 추첨으로 뽑힌 등록 노드 다섯 개에 있습니다. 따라서 어떤 노드도 모든 블록을 보관하지 않고도 과거 어느 스냅샷 시점의 상태든 다시 만들 수 있습니다(아카이브와 과거 조회).
상태는 임대료로 다듬어집니다
이력 정리는 현재 상태를 건드리지 않습니다. 상태는 다른 방식, 즉 임대료로 줄어듭니다. 계정 임대료를 낼 수 없는 계정은 정리되고, 임대료를 내지 못한 데이터셋 행은 비활성화되며, 예치금이 떨어진 저장 파일은 정리됩니다. 어느 경우든 남은 돈은 롱제비티 풀로 가며, 잃는 ZBC는 없습니다.