본문으로 건너뛰기
buybitcoinsmart

용어집 / 채굴과 합의

이전 블록 헤더 해시

이전 블록 헤더 해시란 무엇입니까?
이전 블록 헤더 해시는 모든 블록 헤더에서 부모 블록을 가리키는 32바이트 필드이며, 블록 더미를 하나의 체인으로 만드는 유일한 연결 고리입니다.

각 블록은 뒤를 가리키며, 앞을 가리키지 않습니다. 이 포인터가 해시 대상인 80바이트 안에 있기 때문에, 오래된 블록의 내용을 조금이라도 고치면 그 블록의 해시가 바뀌고 그 위에 쌓인 모든 블록이 깨집니다. 따라서 1년 전의 결제를 되돌리려면 대략 52,000개 블록 분량의 작업 증명을 다시 해야 합니다. 사람들이 비트코인을 불변이라고 부를 때 뜻하는 것은 데이터 삭제에 관한 어떤 규칙이 아니라 바로 이것입니다.

작동 방식

이전 블록 헤더 해시는 부모 블록의 80바이트 헤더에 SHA-256을 두 번 적용해 만들어지며, 블록이 자기 바깥의 무언가를 가리키는 유일한 참조입니다.

부모 블록의 헤더에는 그 부모의 해시가 들어 있고, 이것이 시작까지 이어지기 때문에 32바이트 필드 하나가 그 뒤의 전체 역사를 확정합니다. 체인의 끝을 검증한 노드는 그 끝으로 이어지는 체인이 내부적으로 일관된다는 것도 암묵적으로 검증한 것입니다. 지난여름에 채굴된 블록의 트랜잭션 하나를 조작하면 그 블록의 헤더 해시가 바뀌고, 그러면 자식 블록이 보관한 사본이 더 이상 일치하지 않으며, 자식 블록은 무효가 되고 그 뒤의 모든 블록도 무효가 됩니다. 손상을 복구하려면 그 블록들을 하나하나 다시 채굴해야 하며, 이는 하루에 대략 144개 블록, 1년에 52,560개 블록에 해당합니다.

제네시스 블록은 예외이며, 그럴 수밖에 없습니다. 그 앞에는 아무것도 없으므로 이 필드는 영으로 채워진 32바이트입니다.

블록 안에서 앞을 가리키는 것은 아무것도 없습니다. Bitcoin Core가 nextblockhash를 보고할 때 그것은 블록이 아니라 자체 인덱스를 읽는 것이며, 바로 그렇기 때문에 이 값은 재편성 중에 바뀔 수 있지만 이전 블록 헤더 해시는 결코 바뀌지 않습니다. 두 블록이 같은 부모를 가리키는 것도 오류가 아닙니다. 그것이 데이터의 관점에서 본 포크의 모습이며, 네트워크는 어느 한쪽 포인터를 틀렸다고 선언하는 대신 누적 작업량이 가장 많은 가지를 선호함으로써 이를 해결합니다.

확인할 수 있는 곳

이전 블록 헤더 해시는 무엇을 보고 있느냐에 따라 조금씩 다른 이름으로 나타납니다.

Bitcoin Core는 getblockheader와 getblock에서 이를 previousblockhash로 반환합니다. 블록 0의 경우에는 이름 붙일 부모가 없기 때문에 응답에서 이 필드가 아예 없습니다. 블록 탐색기는 보통 이를 Previous Block으로 표시하고 링크로 만들어 주며, 이것이 클릭으로 역사를 거슬러 올라갈 수 있는 방식입니다.

이 필드는 헤더 체인 동기화의 핵심 전체이기도 합니다. 헤더를 내려받는 노드는 헤더마다 두 가지를 확인합니다. 하나는 이 헤더가 직전 헤더를 가리키는지, 다른 하나는 그 해시가 목표값을 충족하는지입니다. 그 체인이 온전히 이어진 뒤에야 노드는 블록 본문을 요청하기 시작합니다. 라이트 지갑은 여기서 더 나아가지 않으며, 연결과 작업량만 보관하고 그 밖의 것은 두지 않습니다.

이 필드를 직접 구성해 본다면 눈으로 보는 것과 논쟁을 벌이게 될 것입니다. 헤더 안의 바이트는 해시를 보통 인용하는 순서로 기록되어 있지 않기 때문입니다.

이전 블록 헤더 해시 vs 내부 바이트 순서

이전 블록 헤더 해시는 모두가 인용하는 순서와 반대 바이트 순서로 저장되며, 이 때문에 헤더를 직접 검증하려는 거의 모든 사람이 혼란을 겪습니다. 블록 1은 부모의 해시를 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000으로 담고 있습니다. 이것은 익숙한 제네시스 해시 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f를 한 바이트씩 거꾸로 쓴 것입니다. 작업 증명이 만들어 내는 앞쪽의 0들은 원시 필드에서는 뒤쪽에 놓입니다. 둘이 눈에 띄게 일치하지 않는다고 해서 잘못된 것은 아닙니다. 바이트를 뒤집으면 일치합니다.

혼동하기 쉬운 용어

자주 묻는 질문

제네시스 블록의 이전 블록 헤더 해시는 무엇입니까?

32바이트 전체가 영입니다. 블록 0 앞에는 아무것도 없었기 때문에 이 필드는 영으로 채워지며, Bitcoin Core는 해당 블록의 getblockheader 응답에서 previousblockhash를 그냥 생략합니다.

블록 탐색기에서 블록 해시가 뒤집혀 보이는 이유는 무엇입니까?

헤더가 해시를 모두가 인용하는 순서와 반대 바이트 순서로 저장하기 때문입니다. 블록 1은 부모의 해시를 6fe28c0a로 시작하는 형태로 담고 있는데, 이것은 익숙한 제네시스 해시가 00000000으로 시작하는 형태를 한 바이트씩 거꾸로 쓴 것입니다.

다음에 읽을 글

관련 용어

채굴과 합의 분야의 다른 용어

이 페이지를 영어로 읽기