모두의 계산기
← 블로그로 돌아가기

재미있는 숫자 상식

비트코인 난이도 조정: 2,016개 블록과 목표값 계산의 정확한 원리

비트코인 메인넷이 2,016블록마다 실제 소요 시간과 2주 목표를 비교해 작업증명 목표값을 바꾸는 공식, 4배 제한과 난이도의 역비례 관계를 설명합니다.

비트코인 채굴에서는 블록 헤더를 해시한 값이 정해진 목표값(target) 이하가 되어야 유효한 작업증명이 됩니다. 목표값이 작을수록 조건을 만족하는 해시가 적어져 평균적으로 더 많은 시도가 필요합니다. 네트워크의 계산 능력이 늘거나 줄어도 블록이 장기간 평균 약 10분 간격으로 생성되도록 비트코인 메인넷은 2,016개 블록마다 목표값을 조정합니다. 흔히 ‘지난 2주 동안 블록이 빨리 나왔으면 난이도를 높인다’고 요약하지만, 실제 합의 코드는 목표값에 시간 비율을 곱하고 한 번의 변화 폭을 제한합니다. 난이도와 목표값은 서로 반대 방향으로 움직인다는 점도 함께 봐야 합니다.

해시가 목표값 이하라는 조건

SHA-256 해시 결과는 256비트 정수로 해석할 수 있습니다. 채굴자는 블록 헤더의 nonce와 다른 변경 가능한 항목을 바꾸며 해시를 반복 계산합니다. 결과 정수가 블록 헤더의 nBits가 나타내는 목표값 이하이면 작업증명 조건을 통과합니다. 해시가 가능한 범위에 균등하게 분포한다고 보면 한 번의 시도가 성공할 확률은 대략 허용되는 목표 범위가 전체 256비트 범위에서 차지하는 비율입니다. 목표값을 절반으로 줄이면 성공 구간도 절반이 되어 평균 시도 횟수는 약 두 배가 됩니다. 그래서 목표값이 작을수록 채굴이 어렵습니다.

난이도는 목표값의 역수에 비례한다

사용자가 보는 ‘난이도’는 기준 목표값과 현재 목표값의 비율로 표현됩니다. 개념적으로 Difficulty=Difficulty_1_target/current_target입니다. 현재 목표값이 기준의 절반이면 난이도는 2, 4분의 1이면 난이도는 4입니다. 합의 검증에서 직접 사용하는 것은 압축 형식 nBits로 기록된 목표값이며, 난이도 수치는 사람이 비교하기 편하도록 나타낸 값입니다. 따라서 새 목표값이 커지면 성공 가능한 해시 범위가 넓어져 난이도는 낮아지고, 새 목표값이 작아지면 난이도는 높아집니다.

왜 2,016개와 2주인가

목표 블록 간격은 10분, 즉 600초입니다. 2,016×600초는 1,209,600초이며 정확히 14일입니다. 메인넷의 정상 규칙에서는 조정 구간이 끝날 때 직전 구간의 시간 정보를 이용해 다음 구간의 목표값을 계산합니다. 해시레이트가 이전보다 커져 구간을 2주보다 빨리 끝냈다면 새 목표값을 낮춰 조건을 어렵게 합니다. 반대로 시간이 더 오래 걸렸다면 목표값을 높여 조건을 쉽게 합니다. 개별 블록의 간격을 매번 10분으로 맞추는 방식이 아니므로 몇 초 만에 블록이 나오거나 한 시간 가까이 기다리는 일도 가능합니다. 10분은 장기간을 두고 기대하는 평균 간격입니다.

목표값 조정 공식

핵심 계산은 new_target=old_target×actual_timespan/target_timespan입니다. target_timespan은 1,209,600초입니다. 예를 들어 측정 시간이 1,088,640초, 즉 12.6일이라면 시간 비율은 0.9입니다. 새 목표값은 이전 목표값의 0.9배가 되고, 난이도는 역비례하므로 약 1/0.9=1.111배가 됩니다. 난이도가 약 11.1% 높아지는 셈입니다. 반대로 16.8일이 걸려 비율이 1.2라면 목표값은 1.2배, 난이도는 약 1/1.2=0.833배가 됩니다. ‘시간이 20% 늘었으니 난이도도 20% 낮아진다’고 바로 빼면 역수 관계 때문에 정확한 값과 차이가 납니다.

실제 소요 시간새 목표값새 난이도(이전 대비)
7일 이하로 측정되어 제한 적용이전의 0.25배최대 4배
12.6일이전의 0.9배약 1.111배
14일변화 없음변화 없음
16.8일이전의 1.2배약 0.833배
56일 이상으로 측정되어 제한 적용이전의 4배최소 0.25배

한 번에 4배를 넘지 못하게 하는 제한

Bitcoin Core의 메인넷 작업증명 계산은 실제 소요 시간을 목표 기간의 4분의 1보다 작지 않고 4배보다 크지 않게 제한합니다. 즉 계산에 넣는 actual_timespan은 최소 302,400초, 최대 4,838,400초입니다. 그 결과 한 조정에서 목표값은 이전의 0.25배에서 4배 사이로만 바뀝니다. 난이도로 바꾸면 최대 4배 상승하거나 최소 4분의 1로 하락할 수 있습니다. 또한 새 목표값은 네트워크가 허용하는 가장 쉬운 한계인 powLimit보다 커질 수 없습니다. 이 제한은 매우 급격한 시간 측정이나 계산 능력 변화가 한 번의 조정에 그대로 반영되는 범위를 묶습니다.

2,016개 블록인데 시간 차는 2,015개 간격

Bitcoin Core 코드는 조정 직전 블록의 시간과 같은 구간 첫 블록의 시간을 뺍니다. 예를 들어 구간에 2,016개 블록이 있다면 첫 블록부터 마지막 블록까지 사이에는 2,015개의 간격이 있습니다. 개발자 문서도 이 구현상의 오프바이원 특성 때문에 2,016블록 조정에 2,015개 간격의 타임스탬프가 사용된다고 설명합니다. 프로토콜 역사 전체가 이 규칙으로 합의되어 있으므로 단순히 2,016번째 이전 블록과 다음 블록 사이까지 더해 바꾸면 기존 네트워크와 다른 결과가 됩니다. 합의 시스템에서는 직관적인 수정이 아니라 실제 검증 코드와 동일한 계산을 재현해야 합니다.

블록 타임스탬프는 정밀한 시계가 아니다

조정 계산은 블록 헤더의 타임스탬프를 사용하지만 각 값이 중앙 기관의 정확한 측정 시각은 아닙니다. 채굴자가 기록하고 노드가 합의 규칙에 따라 허용 여부를 검사하는 값입니다. 짧은 구간에서는 블록 간격의 무작위성과 타임스탬프의 거친 성격이 크게 보일 수 있습니다. 2,016블록이라는 묶음은 이런 변동을 어느 정도 평균화합니다. 난이도 조정이 미래의 해시레이트를 예측하는 모델도 아닙니다. 이미 끝난 구간의 시간을 바탕으로 다음 구간에 사용할 목표값을 정하는 후행 조정입니다.

해시레이트가 두 배가 되면 바로 5분으로 고정될까

조정 직후 네트워크 해시레이트가 갑자기 두 배가 되고 그대로 유지된다고 가정하면, 현재 난이도에서는 평균 블록 간격이 약 5분으로 줄어듭니다. 그러나 목표값은 다음 조정 경계 전까지 그대로이므로 즉시 10분으로 돌아오지 않습니다. 구간이 예상보다 빨리 끝난 뒤 다음 목표값이 대략 절반으로 내려가고 난이도가 대략 두 배가 되면 평균 간격이 다시 10분 부근으로 맞춰집니다. 실제 블록 발견은 확률 과정이므로 정확히 5분마다 나오거나 정확히 7일 만에 구간이 끝난다는 보장은 없습니다. 공식은 관측 시간의 비율을 사용하며 단일 구간에는 확률적 흔들림이 남습니다.

메인넷 규칙과 테스트 네트워크 규칙은 다르다

‘비트코인은 언제나 2,016블록마다 같은 방식으로만 조정한다’고 말하면 네트워크 종류의 차이를 빠뜨립니다. Bitcoin Core 소스에는 메인넷 외 테스트 네트워크를 위한 최소 난이도 예외와 리타기팅을 끄는 설정 등이 있습니다. Testnet4에는 예외 블록 처리와 관련한 별도 코드도 있습니다. 이 글의 공식과 4배 제한은 비트코인 메인넷의 표준 난이도 조정을 설명하는 것입니다. 다른 암호화폐가 비트코인의 코드에서 출발했더라도 블록마다 또는 더 짧은 구간마다 조정하는 별도 알고리즘을 쓸 수 있으므로 이름만 보고 같은 공식을 적용하면 안 됩니다.

계산 예제를 단계별로 풀기

이전 난이도를 50조라고 하고 실제 측정 시간이 10.5일이었다고 가정하겠습니다. 첫째, 시간 비율은 10.5/14=0.75입니다. 둘째, 새 목표값은 old_target×0.75입니다. 셋째, 난이도는 목표값의 역수에 비례하므로 새 난이도는 50조/0.75=약 66.67조입니다. 변화율은 약 33.33% 상승입니다. 측정 시간이 목표의 4분의 1보다 작거나 4배보다 크지 않으므로 제한은 작동하지 않습니다. 이 예제처럼 목표값 비율을 먼저 구하고 난이도는 그 역수로 바꾸면 방향과 변화율을 혼동하기 어렵습니다.

자주 틀리는 설명 바로잡기

  • 난이도 계산은 직전 2,016개 블록의 평균 해시값을 구하는 일이 아니라 타임스탬프로 측정한 구간 시간 비율을 목표값에 반영하는 일입니다.
  • 새 목표값은 old target×actual/target이며, 난이도는 목표값과 역비례합니다.
  • 블록은 정확히 10분마다 생성되지 않습니다. 10분은 설정된 평균 목표입니다.
  • 메인넷에서는 한 번의 조정 폭이 목표값 기준 0.25배에서 4배로 제한됩니다.
  • 실제 구현은 2,016개 블록 구간의 첫 블록과 마지막 블록 시간을 빼므로 2,015개 간격을 측정합니다.
  • 다른 비트코인 계열 네트워크와 테스트넷에는 메인넷과 다른 예외 규칙이 있을 수 있습니다.

비트코인 난이도 조정은 가격이나 채굴자의 수를 직접 입력하지 않습니다. 블록 헤더에 남은 시간과 현재 목표값만으로 다음 목표값을 결정합니다. 2,016×10분=2주라는 기준, new_target=old_target×actual/target 공식, 목표값과 난이도의 역비례, 한 번에 4배라는 범위를 함께 기억하면 계산 방향을 정확히 이해할 수 있습니다. 이 규칙은 해시레이트가 변하는 환경에서도 장기적인 블록 생성 속도를 목표치 부근으로 되돌리는 피드백 장치입니다.

nBits는 목표값을 압축해 저장한다

블록 헤더에는 256비트 목표값 전체를 그대로 넣지 않고 nBits라는 4바이트 압축 표현을 기록합니다. 흔히 compact 형식이라고 부르며 지수와 유효 숫자 부분으로 큰 정수를 나타냅니다. 노드는 이 값을 목표 정수로 복원한 뒤 음수 표현, 0, 범위 초과 여부와 작업증명 한계를 검사합니다. 마지막으로 블록 해시를 정수로 바꿔 목표값 이하인지 확인합니다. compact 변환에서는 표현 가능한 유효 자릿수 때문에 정수 반올림 효과가 있으므로 웹 계산기의 소수 난이도 값만으로 합의 결과를 재현하기보다 Bitcoin Core의 정수 연산과 인코딩 규칙을 따라야 합니다.

난이도 변화율을 공개 데이터로 검산하려면 같은 조정 구간의 첫 블록과 마지막 블록 타임스탬프, 이전 nBits를 사용해야 합니다. 단순히 달력상 14일 전 블록이나 거래소가 제공하는 해시레이트 추정치를 넣으면 합의 코드의 결과와 맞지 않을 수 있습니다. 해시레이트는 관측된 블록 속도와 난이도에서 거꾸로 추정한 값인 경우가 많아 짧은 기간에는 크게 흔들립니다. 난이도는 블록 검증에 쓰이는 합의 변수이고 해시레이트는 직접 기록되지 않는 추정량이라는 차이를 기억해야 합니다.

참고 자료

  • Bitcoin Developer Guide, Block Chain—Proof of Work and retargeting: https://developer.bitcoin.org/devguide/block_chain.html
  • Bitcoin Core, src/pow.cpp (GetNextWorkRequired and CalculateNextWorkRequired): https://github.com/bitcoin/bitcoin/blob/master/src/pow.cpp
  • Bitcoin Core, consensus parameters: https://github.com/bitcoin/bitcoin/blob/master/src/kernel/chainparams.cpp