Skip to main content
네트워크에 합류하는 노드는 두 가지 질문에 답해야 합니다. 체인이 지금 있는 지점까지 어떻게 도달할 것인가, 그리고 그 지점을 어떻게 유지할 것인가입니다. 상태 동기화는 둘 다에 답하며, 그 사이의 트레이드오프를 숨기지 않고 드러냅니다.

따라잡는 두 가지 방식

부트스트래핑(아무것도 없는 상태에서 현재 버전에 도달하는 일)은 근본적으로 다른 두 방식 중 하나로 이루어집니다. 이력을 재실행합니다. 제네시스에서 시작해 앞으로 나아가며, 모든 트랜잭션을 다시 실행하거나 실행이 이미 만들어 낸 출력을 적용합니다. 그 결과 노드는 전체 이력을 보유합니다. 모든 버전, 모든 증명, 모든 트랜잭션을 갖게 됩니다. 대신 느리고, 체인이 돌아가는 날마다 더 느려집니다. 현재 상태를 내려받습니다. 이력을 건너뛰고 최신 버전 시점의 상태 키와 값을 가져와, 확정된 루트에 대조해 검증합니다. 노드는 훨씬 짧은 시간에 최신 상태가 되지만, 체인이 거기까지 어떻게 왔는지는 전혀 알지 못합니다.
새 노드
부트스트래핑 방식
이력 재실행제네시스부터 재실행, 또는 저장된 출력 적용느리고, 체인이 돌아가는 날마다 더 느려짐
현재 상태 내려받기최신 버전의 키와 값, 확정된 루트에 대조해 검증훨씬 짧은 시간에 최신 상태
현재 버전이후 지속 동기화
두 경로는 같지 않음현재 상태를 내려받은 노드는 과거를 묻는 조회에 답할 수 없고, 포지션이 어떻게 지금에 이르렀는지도 설명할 수 없습니다. 인덱서나 감사를 뒷받침하는 노드에는 건너뛴 이력이 필요합니다.
재실행 경로 안에도 선택이 하나 더 있습니다. 트랜잭션을 다시 실행할지, 저장된 출력을 적용할지, 아니면 그때그때 더 빠른 쪽을 노드가 고르게 할지입니다. 다시 실행하는 쪽이 더 강한 검사입니다. 기록된 결과를 믿는 대신 결과를 재현하기 때문입니다. 출력을 적용하는 쪽은 더 빠릅니다. 혼합 방식이 있는 이유는 노드가 얼마나 뒤처져 있느냐에 따라 정답이 달라지기 때문입니다.
이것은 아무 생각 없이 받아들일 기본값이 아니라 운영상의 결정입니다. 현재 상태를 내려받은 노드는 과거를 묻는 조회에 답할 수 없고, 어떤 포지션이 어떻게 지금 상태가 되었는지도 설명할 수 없습니다. 읽을 이력이 없기 때문입니다. 인덱서나 감사 절차를 뒷받침하는 노드에는 건너뛴 그 이력이 필요합니다.

최신 상태 유지

현재 버전에 도달한 뒤에는 도착하는 확정 블록을 소비하며 따라갑니다. 여기서도 트랜잭션을 실행하거나 출력을 적용하며, 검증 강도와 속도 사이의 트레이드오프도 그대로입니다. 부트스트래핑과 다른 점은 간격이 크고 줄어드는 중이 아니라 작고 일정하다는 것입니다. 충분히 뒤처진 노드는 임의로 벌어진 간격을 조금씩 좁히려 하는 대신 부트스트래핑 경로로 다시 들어갑니다.

데이터가 오가는 방식

동기화는 한 노드가 다른 노드에 블록 구간을 요청하는 일이 아닙니다. 어떤 단일 피어도 의존 대상이 되지 않고 어떤 단일 장애도 진행을 멈추지 못하도록 계층으로 나뉘어 있습니다. 여기서 이해할 만한 결론은 이것입니다. 동기화 중인 노드는 피어를 신뢰하지 않습니다. 모든 청크는 네트워크가 확정한 루트에 대한 증명과 함께 도착하며, 일관되지 않은 데이터를 내놓는 피어는 신뢰받는 것이 아니라 거부됩니다. 피어 선택은 신뢰의 문제가 아니라 성능의 문제입니다.

검증

상태 동기화에서 누가 보냈는지를 근거로 받아들여지는 것은 없습니다. 상태 값은 확정된 상태 루트에 대조해 검증됩니다. 트랜잭션과 출력은 어큐뮬레이터에 대조해 검증됩니다. 부트스트래핑을 마친 노드의 상태는 그 루트가 검증자 정족수가 서명한 값과 일치합니다. 빠른 경로가 안전한 이유가 여기에 있습니다. 현재 상태를 내려받으면 이력은 건너뛰지만 검증까지 건너뛰지는 않습니다.

다음으로 읽을 문서

스토리지와 증명

동기화를 검증 가능하게 만드는 구조입니다.

노드 운영

노드의 역할, 그리고 운영에 대해 문의하는 방법입니다.

네트워크 토폴로지

동기화 중인 피어가 어느 계층의 노드와 이야기하고 있는지 다룹니다.

인덱서

현재 상태로는 답할 수 없는 것에 이력이 어떻게 답하는지 다룹니다.