비트코인 블록 헤더와 머클 증명으로 거래 포함을 확인하는 법
거래 ID가 조회된다는 사실, 거래가 어떤 블록에 들어갔다는 사실, 그 블록이 현재 가장 긴 작업증명 사슬에 남아 있다는 사실은 서로 다르다. 이 글은 블록 헤더와 머클 증명을 이용해 두 번째 사실을 확인하는 구조를 설명한다. 2026년 8월 9일 [Bitcoin 개발자 블록체인 레퍼런스](https://developer.bitcoin.org/reference/block_chain.html), [개발자 가이드](https://developer.bitcoin.org/devguide/block_chain.html), [Bitcoin Core gettxoutproof 문서](https://bitcoincore.org/en/doc/27.0.0/rpc/blockchain/gettxoutproof/)를 확인했다. 이는 기술 교육용 설명이며, 비트코인 보유에는 가격 변동·키 분실·거래 상대방 위험에 따른 원금 손실 가능성이 있다.

먼저 구분할 세 가지 확인 수준
지갑이나 탐색기가 TXID를 보여 주면 네트워크에 거래 데이터가 전파됐거나 어떤 서버가 보관한다는 단서가 될 수 있다. 그러나 TXID 하나만으로는 블록 포함이나 최종성을 증명하지 못한다. 블록 포함은 해당 TXID의 해시가 그 블록의 머클 루트에 이르는 경로에 있는지로, 사슬 위치는 그 헤더가 후속 헤더들과 유효하게 이어지는지로 별도 점검한다. 거래소의 내부 장부 이동은 온체인 거래가 아닐 수 있으므로 출금·입금 안내도 구분한다.
| 확인 대상 | 확인 자료 | 알 수 있는 것 | 아직 알 수 없는 것 |
|---|---|---|---|
| 전파·표시 | TXID, 탐색기 화면 | 거래 식별자와 관측 사실 | 블록 포함·자금 통제권 |
| 블록 포함 | 머클 경로, 블록 헤더 | 특정 TXID가 해당 블록 집합에 포함됨 | 그 헤더가 최선 사슬인지 |
| 사슬 깊이 | 후속 헤더, 독립 노드 | 재구성에 필요한 작업량이 늘어남 | 키 탈취·수탁 위험 |
정확한 정의: 헤더는 80바이트의 요약이다
Bitcoin의 일반 블록 헤더는 버전 4바이트, 이전 블록 헤더 해시 32바이트, 머클 루트 32바이트, 시간 4바이트, nBits 4바이트, nonce 4바이트로 직렬화된다. 전체 거래 본문을 헤더에 넣는 대신 거래 해시들을 한 값으로 요약한 머클 루트를 넣는다. 이전 헤더 해시는 과거 블록을 바꾸면 뒤의 헤더도 다시 계산해야 하게 만든다. nBits는 목표값의 압축 표현이고, 헤더 해시는 그 목표값 이하이어야 한다. nonce는 채굴자가 해시 입력을 바꾸는 값 중 하나다.
| 필드 | 크기 | 역할 | 읽을 때의 주의점 |
|---|---|---|---|
| version | 4바이트 | 적용 규칙 신호 | 단독으로 기능 사용을 확정하지 않음 |
| previous block hash | 32바이트 | 이전 헤더 연결 | 표시 바이트 순서가 도구마다 다를 수 있음 |
| merkle root | 32바이트 | 거래 집합 요약 | 거래 수·수수료·잔액 자체는 담지 않음 |
| time·nBits·nonce | 각 4바이트 | 시간 제한·난이도 목표·탐색 입력 | 시간은 정확한 확정 시각이 아님 |
머클 트리가 거래 집합을 요약하는 과정
블록 안의 TXID를 합의 규칙의 순서로 놓고, 인접한 두 해시를 연결한 뒤 SHA256을 두 번 적용해 부모 해시를 만든다. 이 과정을 한 값이 남을 때까지 반복한 것이 머클 루트다. 거래 수가 홀수면 마지막 해시를 복제해 짝을 맞추는 규칙이 적용된다. 따라서 단 하나의 거래 해시가 달라져도 그 경로의 부모와 루트가 달라지고, 결국 헤더 해시도 달라진다. 다만 해시 연결은 거래가 경제적으로 합리적이라는 판단이나 수취 주소의 실제 소유자를 알려 주지 않는다.
머클 증명은 무엇을 보내는가
특정 TXID 하나를 검증하려면 블록의 모든 거래를 받을 필요가 없다. 대상 TXID, 각 단계에서 짝이 되는 형제 해시, 대상이 왼쪽·오른쪽 어느 쪽인지의 순서 정보를 받으면 된다. 검증자는 대상과 형제 해시를 정해진 순서로 이중 SHA256해 부모를 만들고, 받은 경로를 끝까지 계산한다. 최종 계산값이 신뢰할 수 있는 블록 헤더의 merkle root와 같아야 한다. Bitcoin Core의 gettxoutproof는 TXID가 블록에 포함됐음을 나타내는 직렬화된 증명을 반환하지만, 블록 해시를 지정하지 않을 경우 UTXO 또는 txindex 조건에 따라 동작 범위가 달라질 수 있다.
숫자로 보는 간단한 계산 예시
거래가 8개인 블록에서 한 거래의 포함을 보려면 대상 해시 1개와 형제 해시 3개가 필요하다. 8개 전체 TXID를 받는 대신 3단계 경로를 재계산하는 셈이다. 거래 수가 2의 10승인 1,024개라면 필요한 형제 해시는 일반적으로 10개다. 이는 log2(거래 수)에 비례하는 설명용 계산이며, 실제 증명 바이트 수는 직렬화 방식·플래그·복수 대상 여부에 따라 달라진다. 같은 블록 안의 거래가 많다고 그 거래의 금액이나 수수료가 더 안전해지는 것은 아니다.
| 가정한 거래 수 | 경로 단계 수 | 형제 해시 수 | 해석 |
|---|---|---|---|
| 2개 | 1 | 1 | 한 번 결합해 루트 확인 |
| 8개 | 3 | 3 | 대상 외 3개 해시만 필요 |
| 1,024개 | 10 | 10 | 전체 목록보다 작은 확인 자료 |
단계별 확인법: 탐색기 화면에서 멈추지 않기
첫째, TXID와 블록 높이·블록 해시를 기록하고 서로 다른 독립 서비스 또는 직접 운영 노드에서 대조한다. 둘째, 블록 헤더의 merkle root와 증명 재계산 결과가 같은지 확인한다. 셋째, 해당 헤더의 previousblockhash가 앞선 헤더와 이어지는지, 이후 블록이 얼마나 쌓였는지 확인한다. 넷째, 입금 판단이라면 서비스가 요구하는 컨펌 기준과 주소·네트워크를 별도로 대조한다. 주소 한 글자 오입력, 잘못된 체인 선택, 거래소 내부 제한은 머클 증명이 해결하지 못한다.
지표를 함께 읽는 방법
컨펌 수는 포함 블록 위에 누적된 블록 수로, 재구성 비용에 관한 단서다. 그러나 컨펌 수와 수수료율, 멤풀 혼잡, 거래소의 입금 정책은 한 지표가 아니다. 수수료율이 높아도 이미 포함된 뒤의 체인 재구성 위험을 0으로 만들지 않으며, 컨펌이 많아도 개인키가 탈취된 주소의 통제권은 되돌아오지 않는다. 금액·상대방 위험·서비스 규칙에 맞는 확인 절차가 필요하며 특정 수치를 보편적 정답처럼 제시할 수 없다.
시장이 다르게 반응하는 이유
블록 생성·머클 증명은 원장 검증 장치이지 가격 예측 지표가 아니다. 같은 네트워크 혼잡도도 보유자는 송금 비용으로, 채굴자는 수수료 수입 구성으로, 단기 매매자는 체결 지연으로 다르게 볼 수 있다. 유동성, 거시 환경, 규제, 수요와 위험 선호가 동시에 바뀌므로 블록 수나 컨펌만으로 가격 방향을 결론 내리는 것은 근거가 부족하다.
흔한 오해와 데이터 한계
‘머클 증명이 있으니 경량 지갑이 모든 규칙을 검증한다’는 말은 과장이다. 증명은 특정 거래가 특정 헤더의 거래 집합에 포함됐음을 확인한다. 입력이 실제 UTXO였는지, 스크립트가 유효한지, 누적 작업증명이 충분한지까지 독립적으로 검증하려면 더 많은 데이터와 규칙이 필요하다. 헤더만 신뢰하는 방식은 피어의 거짓말, 체인 분기, 네트워크 단절 및 소수 확인 재조직 위험을 고려해야 한다.
원금 손실 위험과 실전 체크리스트
머클 경로를 확인해도 잘못된 주소로 보낸 비트코인, 유출된 백업 문구, 지급불능 수탁기관에서의 손실은 복구되지 않을 수 있다. 실제 송금 전에는 소액 시험, 수취 체인·주소 형식 확인, 서비스의 최소 컨펌 정책 확인, 독립 노드 또는 복수 출처 대조, TXID와 기준 시각 기록을 수행한다. 이 글의 계산 예시는 검증 구조를 설명하기 위한 것이며 수익·가격·송금 성공을 보장하지 않는다.
헤더 시간과 실제 거래 시각을 혼동하지 않기
헤더의 time은 채굴자가 제시한 Unix 시간이며, Bitcoin 노드는 이전 11개 블록의 중앙값보다 커야 하고 네트워크 시간이 허용하는 미래 범위 안이어야 한다. 그래서 이 값은 거래가 사용자의 지갑에서 서명된 시각, 피어가 처음 받은 시각, 거래소가 입금을 반영한 시각과 같지 않을 수 있다. 분쟁 기록이나 회계 기준 시점에는 서비스 로그·블록 높이·헤더 시간·현지 시간대를 각각 보관해야 한다. 한 화면의 ‘몇 분 전’ 표기는 편의용 표시일 뿐 법적 또는 회계적 확정 시각이 아니다.
검증 시나리오: 0.015 BTC 입금 표시를 받았을 때
가상의 수취인이 0.015 BTC 입금 알림을 받았다고 하자. 먼저 표시 금액뿐 아니라 출력의 수취 스크립트가 자신이 통제하는 주소에 대응하는지 지갑에서 확인한다. 다음으로 TXID가 포함된 블록 해시와 높이를 기록하고, 그 블록 헤더의 머클 루트에 TXID가 연결되는지 증명으로 확인한다. 이후 후속 헤더가 늘어나는 동안 서비스 정책상 필요한 컨펌을 기다린다. 이 과정은 그 출력이 자동으로 현금화되거나 가격 변동에서 보호된다는 뜻이 아니다. 송금 후 시장 가격이 변할 수 있고, 보관 키가 노출되면 원금 손실이 발생할 수 있다.
| 점검 순서 | 확인 입력 | 판단 결과 | 남는 위험 |
|---|---|---|---|
| 1 | 수취 주소·출력 금액 | 의도한 온체인 출력인지 | 주소 통제권 탈취 |
| 2 | TXID·블록 해시·증명 | 해당 블록 포함 여부 | 헤더 신뢰·분기 |
| 3 | 후속 헤더·서비스 정책 | 요구 컨펌 충족 여부 | 재조직·정책 변경 |
| 4 | 보관·환전 조건 | 실제 이용 가능성 | 수탁·유동성·가격 위험 |
공식 도구의 출력도 가정과 함께 읽기
Bitcoin Core RPC는 노드가 보유한 체인·인덱스 설정을 전제로 결과를 반환한다. 예를 들어 getblockheader의 confirmations가 음수이면 그 블록은 현재 주사슬에 없다는 뜻으로 읽어야 하며, 단순히 숫자의 절댓값을 신뢰하면 안 된다. gettxoutproof는 블록 해시를 명시하거나 txindex를 유지하는 조건을 확인하지 않으면 원하는 거래에서 항상 증명을 얻는다는 보장이 없다. 따라서 검증 스크립트나 탐색기 자동화에서는 노드 버전, 동기화 상태, 조회 시각, 블록 해시와 실패 응답을 함께 기록한다. 이것이 재현 가능한 확인법이며, 단일 API의 성공 응답을 절대적 사실로 취급하는 실수를 줄인다.
검증 결과는 조회 당시의 사슬 상태를 기록한 것이다. 네트워크 단절, 피어 장애, 이후의 체인 재조직처럼 데이터가 달라질 수 있는 조건도 메모해야 한다. 특히 큰 금액이나 업무상 정산은 독립된 운영 절차와 책임 기준을 먼저 정하고, 이 기술 설명만으로 지급 결정을 대신하지 않는다.
반복 확인의 목적은 불안을 없애는 것이 아니라 어떤 사실을 어떤 자료로 확인했는지 분리하는 데 있다. 블록 헤더, 머클 증명, 지갑의 수취 기록, 수탁 서비스의 내부 잔고는 서로 다른 층위의 데이터다. 누락된 층위를 문서화하면 사고 발생 뒤 원인 추적도 훨씬 더 쉬워진다. 이 기록은 재검토에도 유용하다.
공식 참고 자료: [Bitcoin 블록체인 레퍼런스](https://developer.bitcoin.org/reference/block_chain.html), [Bitcoin 블록체인 개발자 가이드](https://developer.bitcoin.org/devguide/block_chain.html), [Bitcoin Core gettxoutproof](https://bitcoincore.org/en/doc/27.0.0/rpc/blockchain/gettxoutproof/), [Bitcoin Core getblockheader](https://bitcoincore.org/en/doc/0.16.3/rpc/blockchain/getblockheader/).