비트코인 블록 해시 검증하기
2025.12.07 - [분류 전체보기] - 비트코인 블록 헤더 구조 분석
비트코인 블록 헤더 구조 분석
비트코인은 블록체인으로 만들어져 있다는 얘기는 이제는 너무 유명하다.블록체인이란 블록을 해싱해서 체인으로 연결했기에 이와 같이 불린다.사토시가 제시한 백서에서는 공식적으로 블록
3min-bitcoin.tistory.com
비트코인 블록 해시값은 블록 헤더를 HASH256 함수로 해싱해서 구한다.
비트코인 장부는 모든 노드에 복제, 동기화되어 보관된다. 따라서 직접 블록 헤더를 구해서 검증할 수 있다.
그래서 이번엔 내 풀노드에 있는 장부로 직접 해시값을 구해보려 한다.
Don't trust, verify 2탄(?)이다.
직접 계산해보기 with umbrel

엄브렐에서 도커 컨테이너로 비트코인 소스코드가 실행되기 때문에, 아래 명령어를 쳐서 컨테이너에 접속.
sudo docker ps | grep bitcoin
sudo docker exec -it bitcoin_app_1 bash
도커 컨테이너중 bitcoin 이라는 이름만 조회해서 동작중인 컨테이너 내부로 진입한다.
직접 진입한 이유는, bitcoin-cli 깔려있는 컨테이너 사용하기 위함이다.
bitcoin-cli getblockhash 57043
# 위 명령에서 RPC credentials 오류 발생시 .cookie 파일 경로를 잘못 읽고 있는 것.
# 따라서 .cookie 파일 경로를 찾아서 아래와 같이 rpc 쿠키파일 경로 명시해서 해결
bitcoin-cli -rpccookiefile=/data/bitcoin/.cookie getblockhash 57043
피자데이 블록 해시 조회해보면 아래와 같이 나온다. 이를 이용해서 block 데이터를 가져올 수 있다.
00000000152340ca42227603908689183edc47355204e7aca59383b0aaac1fd8
# json 형태로 깔끔하게 출력된다.
bitcoin-cli getblock 00000000152340ca42227603908689183edc47355204e7aca59383b0aaac1fd8
# 마지막에 verbosity 인자로 0을 주입한 것으로 16진수로 나열된다.
bitcoin-cli getblock 00000000152340ca42227603908689183edc47355204e7aca59383b0aaac1fd8 0

json 형태로 출력된 모습이다.

hex 형태로 출력된 모습이다. 헤더만 출력된게 아니라 body 까지 전부다 출력된거라서.. 첫 80바이트만 가져오면 되니 첫 160 글자를 복사하면 아래와 같다.
010000008095126f08f377b143410cc3c5da3f3d25732d014dc9da1855e8e713000000005a1b723ae6c479056af838a6ea40db6f4acee39f262bf49864cd98f511221d5c7f1ff84b249c151c23af360b
이를 sha256 계산기에 넣고 2번 돌리면 된다.
첫 번째 해시 결과
- efea2d6b84324a8c640e62c23dbda006cad4b1221cd41cd948c3760ab1bbf8f2
두 번째 해시 결과
- d81facaab08393a5ace704523547dc3e1889869003762242ca40231500000000
json 형태로 출력된 결과값의 hash 필드값
- 00000000152340ca42227603908689183edc47355204e7aca59383b0aaac1fd8
두 번째 더블 해싱을 한 결과와 bitcoin-cli에 있던 결과 순서가 얼핏봐도 반대로 보인다.
이는 리틀엔디안 방식으로 컴퓨터가 해석하기 때문이다.
이는 1바이트씩 거꾸로 배열하면 된다. 따라서 2자리씩 앞뒤를 바꿔보면 계산한 값이 나온다.
리틀 엔디안
리틀 엔디안이란 little-endian으로 가장 작은 자릿수 값(least-significant)을 “작은 주소” 메모리 위치에 저장한다는 뜻이다.
반대로 빅 엔디안은 가장 큰 자릿수 값(most-significant)을 작은 주소 메모리 위치에 저장한다는 뜻이다.

컴퓨터 메모리에는 주소가 있다. 컴퓨터는 메모리 주소가 낮은 부분부터 순차적으로 읽는다.
그러면 하위 바이트부터 바로 연산을 할 수 있기에 이점이 있다고 알려져 있다. (올림 연산 같은 것)
1번 주소부터 5번 주소가 있다고 하자. 그리고 숫자 12345가 있다고 가정하고, 주소 하나에 숫자 1개씩 저장된다고 가정해보자.
리틀 엔디안은 1번 주소에 5(일의자릿수)를 넣는다. 반대로 빅 엔디안은 1번 주소에 1을(만의자릿수) 그대로 넣는다.
실제로 컴퓨터는 바이트 단위로 위 작업을 하기 때문에, 16진수로 봤을 때는 2칸씩 순서를 바꿔주면 된다.