비트코인 기술
해시 함수(SHA-256)
- 비트코인을 한 줄로 줄이면 “해시 함수 위에 올린 돈”이다. 작업증명, 블록 연결, 머클 트리, 주소 생성, 거래 ID까지 전부 같은 함수에 의존한다.
개념
- 해시 함수는 임의 길이의 입력을 받아 고정 길이의 출력을 내는 함수.
- SHA-256은 어떤 데이터를 넣어도 256비트(64자리 16진수)를 반환한다. 1바이트 문자도, 1GB 영상도 같은 길이로 반환된다.
📌 해시 함수가 암호학적으로 쓸모 있으려면 다음 성질이 필요함.
- 결정성: 같은 입력은 항상 같은 출력을 만든다.
- 산정 효율: 입력 → 해시 계산은 빠르다.
- 역상 저항(Pre-image resistance): 해시값만 보고 원래 입력을 알아내는 것은 사실상 불가능하다.
- 충돌 저항(Collision resistance): 서로 다른 두 입력이 같은 해시를 만드는 경우를 찾는 것도 사실상 불가능. SHA-256에서는 약 2^128 번의 시도가 필요하다.
- 어바란시(Avalanche) 효과: 입력의 한 비트만 바꿔도 출력의 약 절반이 뒤집힌다.
비트코인이 해시를 쓰는 곳
- 작업증명: 채굴 난이도 해싱
- 채굴자는 블록 헤더의 해시가 난이도 목표보다 작아질 때까지 nonce를 바꿔가며 SHA-256을 반복한다. 정답을 찾는 것은 어렵지만, 검증은 한 번의 해시 계산으로 끝난다. 이 비대칭성이 핵심.
- 블록 연결: 이전 블록 해시 연결
- 각 블록 헤더에는 직전 블록 헤더의 해시가 들어간다. 과거 블록의 한 비트라도 바꾸면 해당 블록 해시가 바뀌고, 이후 모든 헤더가 연쇄적으로 깨진다.
- 머클 트리: 거래 데이터 요약
- 블록 안 수천 개의 거래를 쌍으로 묶어 해시한 뒤, 그 결과를 다시 묶어 하나의 머클 루트를 만든다. 이 루트가 블록 헤더에 들어간다. 라이트 노드는 전체 거래를 받지 않고도 SPV 증명으로 특정 거래의 포함 여부를 확인할 수 있다.
- 주소 생성: 공개키 해싱
- 공개키를
SHA-256 → RIPEMD-160으로 해시한 결과를 인코딩한다. 공개키 노출 시점을 거래 사용 시점까지 늦춘다.
- 공개키를
- 거래 ID: TXID
- 거래 데이터 전체를 두 번 SHA-256한 값이다. 한 비트만 바뀌어도 TXID가 달라진다. 디지털 지문 역할을 한다.
왜 SHA-256인가
- 사토시는 2008년 시점에 가장 널리 검증된 표준인 SHA-256을 선택했다. (미국 NIST가 2001년 표준화)
- 이후 SHA-3가 후속 표준으로 나왔지만 비트코인은 바꾸지 않았다.
- 해시 함수를 교체하는 것은 사실상 새 코인을 만드는 것과 같고, 모든 노드와 채굴 장비가 동시에 바뀌어야 하기 때문이다. 비용이 천문학적이다.
- 양자 컴퓨팅 위협도 SHA-256보다 비대칭 키 알고리즘 쪽에 더 가깝다. 그로버 알고리즘으로 공격해도 보안 강도가 128비트로 줄어들 뿐이며, 현실적인 양자 하드웨어로는 아직 한참 멀다.
해시 함수는 비트코인이 신뢰 없이도 무결성과 합의를 만들어내는 토대. 작업증명의 비대칭성, 머클 트리의 효율성, 블록의 연쇄, 주소의 익명성, 거래의 지문이 전부 같은 함수의 다른 활용이다. SHA-256 하나가 비트코인 보안의 절반을 차지함
난이도 조정(Difficulty Adjustment): 비트코인의 항상성
- 난이도 조정은 2,016블록(약 2주)마다 채굴 난이도를 자동으로 조절해 평균 블록 생성 시간을 약 10분으로 유지하는 메커니즘
- 외부 관리자 없이 네트워크가 스스로 균형을 유지하게 하는 통화 정책의 기술적 구현
난이도 타겟과 nBits
- 채굴은 블록 헤더의 해시값이 특정 타겟(target) 이하가 되는
nonce값을 찾는 과정. - 타겟은 256비트 정수, 타겟이 낮을수록 유효한 해시를 찾기 어려움
- 블록 헤더에는 이 타겟이 nBits라는 4바이트 압축 형식으로 저장된다.
- 첫 1바이트가 지수(exponent), 나머지 3바이트가 가수(coefficient)다.
- 예: nBits =
0x1b0404cb이면 - 타겟 =
0x0404cb × 2^(8×(0x1b-3))로 계산된다.
- 예: nBits =
- 난이도(difficulty)는 제네시스 블록의 최대 타겟을 현재 타겟으로 나눈 비율.
- 난이도 1이 최대 타겟에 해당, 현재 난이도는 100조를 넘는다.
2,016블록 주기의 수학
- 사토시는 블록 간격을 10분으로 설계함
- 10분 × 2,016블록 = 20,160분 = 14일
- 이 주기는 충분한 통계 샘플을 확보하면서도 해시레이트 변화에 합리적으로 대응할 수 있는 균형점으로 선택됐다.
조정 알고리즘은 단순하다.
- 이전 2,016블록의 실제 소요 시간을 목표 시간(20,160분)으로 나누고, 그 비율만큼 새 타겟을 조정한다.
- 실제 소요 시간이 1주일이었다면 타겟이 절반으로 줄어(난이도 2배), 4주일이었다면 타겟이 두 배로 늘어난다(난이도 절반).
4배 조정 상한/하한
- 한 주기에 난이도는 최대 4배까지만 오르거나 내릴 수 있다.
- 상한이 없으면 해시레이트 급증 후 이탈 시 블록 생성이 극도로 느려질 수 있고, 하한이 없으면 대규모 이탈 시 보안이 급격히 약화될 수 있다. 4배 제한은 네트워크가 점진적으로 적응하도록 하는 안정화 장치.
난이도 조정 게이밍 공격과 방어
난이도 조정 메커니즘을 악용하려는 시도가 있을 수 있음
- 타임스탬프 조작: 채굴자가 타임스탬프를 미래로 설정해 난이도를 부당하게 낮추려는 시도
- 방어기작: 블록 타임스탬프는 이전 11개 블록의 중앙값(Median Time Past)보다 커야 하고, 네트워크 시간으로부터 2시간 이내여야 한다는 규칙을 적용함
- 셀피시 마이닝: 발견한 블록을 숨겨 다른 채굴자의 연산을 낭비시키는 전략. 하지만 상당한 해시레이트와 네트워크 조건이 필요해 현실적 제약이 큼
다른 암호화폐의 난이도 알고리즘 비교와 역사적 난이도 변화
- Bitcoin Cash의 ASERT는 매 블록마다 지수 함수로 조정한다. 이더리움 PoW 시절도 매 블록 조정이었다.
- 비트코인이 2주 주기를 고수하는 이유는 빈번한 조정이 반드시 더 나은 것은 아니기 때문이다. 더 민감한 조정은 게이밍에 더 취약해질 수 있다. 안정성과 예측 가능성을 우선한 설계.
- 2021년 중국 채굴 금지로 해시레이트의 약 50%가 사라지면서 난이도가 연속 급락했다. 그러나 조정 메커니즘 덕분에 네트워크는 멈추지 않았고, 수개월 내에 재분배되어 회복됐다.
- 2009년 초기 난이도 1에서 시작해 ASIC 등장 이후 현재 100조 배 이상으로 상승한 곡선은, 네트워크에 투입된 에너지와 자원의 역사적 기록이기도 하다.
머클 트리(Merkle Tree): 효율적 데이터 검증
- 머클 트리는 대량의 데이터를 하나의 해시값(머클 루트)으로 요약해 효율적으로 무결성을 검증하는 이진 해시 트리 구조.
- 1979년 랠프 머클(Ralph Merkle)이 발명, 비트코인 블록 구조와 경량 클라이언트 검증의 핵심이다.
구조

- 리프 해시: 각 트랜잭션의 txid(double-SHA256)를 리프 노드로 사용한다.
- 쌍별 결합: 인접한 두 해시를 연결(concatenate)한 뒤 다시 double-SHA256을 적용해 부모 노드를 만든다.
SHA256(SHA256(H(A) || H(B))) - 반복: 노드가 하나만 남을 때까지 반복한다. 최종 해시가 머클 루트이며 블록 헤더의
hashMerkleRoot에 기록된다.
트리 깊이는 log₂(N)이다. 1,000개의 트랜잭션이 있는 블록도 단 10단계의 해시 연산으로 머클 루트에 도달한다.
머클 증명 (Merkle Proof)
- 특정 트랜잭션이 블록에 포함됐음을 증명하는 데이터.
- 전체 블록을 받을 필요 없이, 해당 트랜잭션에서 루트까지의 경로에 있는 형제 해시만 있으면 된다.
- 예: 8개 트랜잭션 중 D를 증명하려면 H©, H(AB), H(EFGH) 세 개만 필요하다.
- 검증자는 H(D)부터 시작해 형제 해시와 차례로 결합해 루트를 계산하고, 블록 헤더의 머클 루트와 일치하는지 확인한다.
- 시간 복잡도는 O(log n)이다. 블록에 4,000개의 트랜잭션이 있더라도 약 12개의 해시만으로 증명이 완료된다.
SPV 경량 검증에서의 활용
- SPV(Simplified Payment Verification)는 사토시 백서 8절에 기술된 경량 검증 방식이다.
- 클라이언트는 블록 헤더(80바이트)만 저장하고, 관심 트랜잭션에 대해 풀노드에게 머클 증명을 요청한다.
- 저장·대역폭 요구가 극히 적어 모바일 지갑이 가능해졌다.
- 다만 SPV는 풀노드에 의존하므로, 풀노드가 특정 트랜잭션의 존재를 숨기는 공격에는 취약.
비트코인 구현 세부사항(규칙)
- txid 페어링: 트랜잭션 해시들은 순서대로 페어링된다.
- 홀수 처리: 특정 레벨에서 노드 수가 홀수인 경우, 마지막 노드를 복제하여 자기 자신과 페어링
- A, B, C가 있으면 C를 복제하여 (A,B), (C,C)로 처리
- 코인베이스 트랜잭션: 블록의 첫 번째 트랜잭션은 항상 코인베이스(채굴 보상) 트랜잭션이며, 이것도 머클 트리의 첫 번째 리프로 포함된다.
- 증인 머클 트리(세그윗): 세그윗은 트랜잭션 머클 트리와 별도로 증인(서명) 데이터 전용 머클 트리를 도입했다. 그 루트는 블록 헤더가 아니라 코인베이스 트랜잭션의 증인 커밋먼트(witness commitment)에 저장된다.
CVE-2012-2459
- 2012년에 발견된 홀수 노드 복제 방식을 악용해, 동일한 머클 루트를 유지하면서 트랜잭션 목록을 변조할 수 있던 취약점이었다.
- 유효한 블록을 무효로 거부하게 만드는 DoS 벡터로 활용될 수 있었다.
- Update: 동일한 해시 쌍이 발견되면 해당 블록을 무효로 처리하도록 검증 로직을 추가했다.
탭루트의 MAST (Merklized Abstract Syntax Trees)
- MAST는 머클 트리 구조를 비트코인 스크립트에 적용한 것.
- 2021년 활성화된 탭루트(Taproot) 업그레이드의 핵심 구성 요소
- 가능한 모든 지출 조건을 리프로 두고, 실제로 사용된 조건의 경로만 공개한다.
- 예를 들어 "3-of-5 다중서명 또는 1년 후 2-of-5 다중서명 또는 2년 후 단독 서명"이라는 복잡한 지출 조건이 있을 때)
- MAST를 사용하면 실제 지출 시 사용된 조건과 머클 증명만 공개하면 되므로, 다른 조건의 존재 자체가 드러나지 않는다. 이는 프라이버시를 크게 향상시키며, 공개해야 하는 데이터양이 줄어 수수료도 절감된다.
댓글