ZooBC 위키
보안과 아키텍처

스냅샷과 빠른 동기화

몇 년 된 체인에 합류하는 노드가 블록 0 이후의 모든 블록을 재생할 필요는 없습니다. 노드는 스파인 체인을 따라가고, 스파인이 지정한 최신 스냅샷을 내려받아 조각별로, 그리고 피어들과 대조해 검사한 뒤, 그 이후에 만들어진 블록만 적용합니다. 이것이 빠른 동기화입니다. 어느 단계에서도 노드는 체인의 상태에 대해 웹사이트나 단일 피어의 말을 그대로 믿지 않습니다.

스냅샷

스냅샷은 한 높이에서의 체인 상태 전체, 즉 모든 잔액, 좌석, 기록입니다. main_snapshot_interval블록, mainnet에서 172,800블록(약 30일)마다 각 노드는 그 트리거 높이보다 760블록 아래 시점의 상태 스냅샷을 씁니다. (devnet에서는 240블록마다, 80블록 깊이입니다.) 노드들은 작업 시점을 최대 60블록까지 엇갈리게 하지만, 모든 노드의 스냅샷은 바이트 단위로 똑같습니다.

스냅샷은 체인의 상태 테이블(57개), 최근 블록 헤더, 최근 트랜잭션, 보관 비용이 아직 납부되고 있는 트랜잭션(데이터 보관 비용 (롱제비티) 참조), 최근 공개된 영수증을 담은 하나의 CBOR 문서입니다. 이는 102,400바이트 청크로 잘리며, 각 청크는 SHA3-256 해시로 이름이 붙습니다. 그 해시 목록에 파일 전체의 해시, 기준 높이, 만료, 체인의 제네시스 해시를 더한 것이 매니페스트이며, 스파인 블록이 이를 게시합니다.

스냅샷 안의 어떤 것도 서명되지 않습니다. 스냅샷의 권위는 그것을 지정한 스파인 블록에서 나옵니다. 그 블록은 좌석의 3분의 2가 공동 서명한 것이며, 각 좌석은 먼저 매니페스트를 자기 스냅샷과 해시 하나하나까지 비교했습니다.

각 노드는 최신 스냅샷 세대 세 개만 보관합니다. 블록 0 이후의 모든 스냅샷은 모든 노드가 아니라 분산 저장소가 보관하며, 각 스냅샷의 청크는 추첨으로 뽑힌 등록 노드 다섯 개가 보관합니다(아카이브와 과거 조회 참조).

단계별 빠른 동기화

노드는 최소 100블록 뒤처져 있고 자기 높이보다 위에 쓸 수 있는 매니페스트를 가지고 있을 때 빠른 동기화를 시도합니다. 노드는 매니페스트를 담은 스파인 블록을 서명과 함께 가지고 있어야 합니다. 가장 최신 매니페스트는 만료가 지나도 계속 쓸 수 있습니다.

  1. 스파인 동기화. 많이 뒤처진 노드는, 참조가 자기 최상단보다 위에 있는 스파인 블록이라도 그 블록 자체의 서명 기준(3분의 2, 또는 대체 블록이라면 과반)을 갖추었으면 저장합니다. 그 블록의 내용은 나중에 메인 체인이 참조에 이르렀을 때 검사하며, 불일치하면 경보와 함께 멈춥니다.
  2. 청크 가져오기. 연결된 등록 피어들로부터 최대 16개 샤드로 가져오며, 각 청크를 그 이름인 해시와 대조합니다.
  3. 파일 전체 검사. 매니페스트의 전체 파일 해시와 대조합니다.
  4. 상태 불러오기. 하나의 데이터베이스 트랜잭션으로 불러옵니다.
  5. 피어들과 표본 검사(아래 참조)
  6. 남은 블록 적용. 최상단까지 하나씩, 완전한 검증과 함께 적용합니다.
번호가 붙은 여섯 단계: 스파인 체인(3분의 2 서명), 매니페스트(해시 목록), 여러 피어에게서 받은 청크, 상태 불러오기, 피어들과 대조한 표본, 최상단까지 남은 블록. 스냅샷은 172,800블록(약 30일)마다.
번호가 붙은 여섯 단계: 스파인 체인(3분의 2 서명), 매니페스트(해시 목록), 여러 피어에게서 받은 청크, 상태 불러오기, 피어들과 대조한 표본, 최상단까지 남은 블록. 스냅샷은 172,800블록(약 30일)마다.

증언: 피어들과 상태 검사하기

해시가 일치하면 그 바이트가 매니페스트가 지정한 바이트라는 것은 증명됩니다. 그러나 그 바이트가 실제 상태라는 것까지 증명하지는 않습니다. 스파인의 공동 서명자들은 이미 모든 매니페스트를 자기 스냅샷과 비교합니다. 버전 0.5.8부터 합류하는 노드는 거짓 매니페스트를 받았을 경우에 대비해 자체 검사를 더합니다.

불러온 뒤 노드는 새 상태에서 최대 8개의 계정과 8개의 레지스트리 노드를 고릅니다. 선택은 스냅샷 자체의 해시로 정해지므로, 합류하는 모든 노드가 같은 행을 고르며, 위조자는 어떤 행을 일관되게 꾸며야 할지 미리 알 수 없습니다. 노드는 무작위로 고른 등록 피어 3개에게 스냅샷 높이에서 각 계정의 잔액과 각 노드의 키와 상태를 묻습니다. 한 높이의 한 체인에 대한 정직한 답은 똑같습니다.

  • 최소 2개 피어가 동의하고 아무도 반박하지 않으면: 노드는 계속 진행합니다.
  • 반박이 수적으로 밀리지 않으면: 조회를 피어 7개로 넓히고, 그때는 최소 2개의 일치하는 답과 답한 피어의 3분의 2 이상이 필요합니다.
  • 그렇지 않으면 스냅샷을 거부하고 블록 단위 동기화로 돌아갑니다.

답하는 피어가 너무 적으면, 노드는 해시만을 근거로 진행합니다.

스냅샷 해시로 노드가 계정 8개와 노드 8개를 골라 피어 3개에 묻습니다. 최소 2개가 일치하고 반박이 없으면 진행합니다. 반박이 밀리지 않으면 피어 7개에 묻고, 3분의 2 이상이 일치하면 진행하며, 아니면 거부하고 블록 단위로 동기화합니다.
스냅샷 해시로 노드가 계정 8개와 노드 8개를 골라 피어 3개에 묻습니다. 최소 2개가 일치하고 반박이 없으면 진행합니다. 반박이 밀리지 않으면 피어 7개에 묻고, 3분의 2 이상이 일치하면 진행하며, 아니면 거부하고 블록 단위로 동기화합니다.

결과를 신뢰할 수 있는 이유

  • 스냅샷을 지정한 스파인 블록은 좌석의 3분의 2가 각자 매니페스트를 자기 스냅샷과 비교한 뒤 공동 서명한 것입니다.
  • 모든 청크와 파일 전체가 매니페스트의 해시와 일치해야 합니다.
  • 불러온 상태의 표본은, 충분한 수가 답하는 한, 무작위로 고른 독립적인 등록 피어들과 대조합니다.
  • 스냅샷 이후의 모든 블록은 완전히 검증합니다.
  • 스파인 자체는 노드의 릴리스와 함께 오는 릴리스 핀으로 고정할 수 있습니다.

아무도 스냅샷에 손으로 서명하지 않고, 어떤 웹사이트도 신뢰하지 않으며, 블록 0부터 재생하는 것도 없습니다.

같이 보기