용어집 / 채굴과 합의
블록 헤더
별칭은 헤더입니다.
- 블록 헤더란 무엇입니까?
- 블록 헤더는 블록의 80바이트 요약입니다. 여기에는 버전, 이전 헤더 해시, 머클 루트, 타임스탬프, nBits, 논스가 담기며, 채굴업자가 실제로 해시하는 부분이기도 합니다.
채굴업자는 결제 내역을 직접 해시하지 않습니다. 이 고정 크기 기록을 해시하며, 이 기록은 머클 루트를 통해 트랜잭션 목록에, 이전 헤더 해시를 통해 모든 이전 블록에 결속됩니다. 블록당 80바이트는 2009년 1월 이후의 전체 헤더 체인이 휴대폰에 넉넉히 들어갈 만큼 작으며, 바로 이 사실 덕분에 경량 검증이 아예 가능해집니다.
작동 방식
블록 헤더는 고정된 순서의 6개 필드로 이루어지며, 각 필드의 바이트 오프셋은 절대 바뀌지 않습니다.
버전은 0번부터 3번 바이트를 차지합니다. 이전 블록 헤더 해시는 4번부터 35번 바이트를 차지합니다. 머클 루트는 36번부터 67번 바이트를 차지합니다. 유닉스 에포크 이후 초 단위인 타임스탬프는 68번부터 71번 바이트에 있습니다. 인코딩된 난이도 목표인 nBits는 72번부터 75번 바이트에 있습니다. 논스는 76번부터 79번 바이트를 채웁니다. 모든 필드는 리틀 엔디언으로 저장되며, 그래서 블록 탐색기에서 보이는 16진수는 원시 블록 덤프의 16진수와 비교해 바이트 순서가 뒤집힌 것처럼 보입니다.
블록 해시는 이 필드들 중 하나가 아닙니다. 이 해시는 80바이트에 SHA-256을 두 번 적용해 계산되며, 노드는 이를 신뢰하지 않고 도출합니다. 바로 이 점 때문에 블록은 자기 자신의 정체성에 대해 거짓말을 할 수 없습니다. 작업 증명은 여기에 비교 연산을 붙인 같은 연산입니다. 즉 결과 숫자는 nBits가 인코딩한 목표값과 같거나 그보다 작아야 합니다.
이 중 두 필드는 사람들을 놀라게 하는 규칙을 지닙니다. 타임스탬프는 정확할 필요가 없습니다. 이전 열한 개 블록 타임스탬프의 중앙값을 넘고 수신 노드 자체 시계와 2시간 이내에만 있으면 되므로, 시간이 약간 어긋난 헤더도 평범하고 유효합니다. 버전 필드 역시 이제 단순한 카운터가 아닙니다. BIP9에 따른 소프트 포크 신호와 BIP320에 따른 버전 롤링 모두 이 필드에서 비트를 빌려 쓰므로, 현대 헤더의 버전 번호는 릴리스 번호가 아니라 비트 필드입니다.
확인하는 곳
블록 헤더는 새 노드가 가장 먼저 내려받는 것이며, 많은 지갑이 보관하는 유일한 정보입니다.
Bitcoin Core는 2015년 2월에 출시된 버전 0.10부터 헤더를 먼저 동기화합니다. 노드는 헤더 체인을 가져와 검증하고, 실제 작업 증명이 있는지 확인한 뒤에야 블록 본문을 요청하며, 이미 무엇을 찾는지 알고 있으므로 여러 피어에서 병렬로 요청할 수 있습니다. 경량 클라이언트는 이 첫 단계에서 멈춥니다. SPV 또는 Neutrino 지갑은 헤더를 보관하고, 트랜잭션의 머클 가지가 그중 하나에 연결되는지 확인합니다. 헤더 하나가 80바이트이므로 900,000개 헤더의 체인은 72MB이며, 그래서 이 방식이 모바일 데이터로도 작동합니다.
제네시스 헤더는 살펴볼 만한 정석적인 예입니다. 버전은 1이고, 이전 헤더 해시는 모두 영이며, 머클 루트는 4a5e1e4b 등이고, 타임스탬프는 1231006505로 2009년 1월 3일에 해당하며, nBits 값은 0x1d00ffff이고, 논스는 2083236893입니다. 이 80바이트를 직접 해시하면 영이 열 개로 시작하는 익숙한 블록 해시를 얻을 수 있습니다. 다른 헤더를 보고 싶다면 Bitcoin Core의 RPC getblockheader가 정확히 이 필드들만 반환합니다.