전체 글 목록

비트코인 작업증명이란? 블록 해시·목표값과 채굴 난이도 원리

비트코인 작업증명(Proof of Work)은 새 블록을 제안하려는 채굴자가 정해진 계산 조건을 만족한 결과를 제시하고, 다른 노드가 그 결과를 확인할 수 있게 하는 방식입니다.

작업증명은 흔히 어려운 수학 문제를 푸는 과정으로 설명됩니다. 하지만 실제로 복잡한 방정식의 답을 찾아내는 것은 아닙니다. 채굴 장비는 후보 블록의 핵심 정보가 담긴 블록 헤더를 반복해서 해시합니다. 계산한 해시를 숫자로 보았을 때 네트워크의 목표값 이하가 되면 작업증명 조건을 통과합니다. 어떤 입력에서 조건에 맞는 결과가 나올지는 미리 알 수 없기 때문에 값을 바꾸어 가며 많은 계산을 시도해야 합니다.

거래가 만들어진 뒤 후보 블록을 거쳐 풀노드(Full Node)의 검증을 받는 흐름은 비트코인 채굴이란? 거래가 블록에 포함되는 과정과 노드·채굴자의 역할에서 설명했습니다. 이 글에서는 그중 작업증명에 초점을 맞춰 블록 헤더, 해시와 목표값, 채굴 난이도와 누적 작업량이 어떻게 연결되는지 살펴봅니다.

작업증명은 무엇을 증명하는가

작업증명은 채굴자가 누구인지 또는 믿을 만한 사람인지 확인하는 절차가 아닙니다. 새 블록 후보에 대해 네트워크가 요구하는 조건을 만족하는 계산 결과를 찾았는지 확인하는 방식입니다.

채굴자는 후보 블록의 블록 헤더를 이용해 해시를 계산하고, 그 결과가 목표값 이하인지 확인합니다. 조건을 만족하지 못하면 블록 헤더의 일부 값을 바꾸어 다시 계산합니다. 조건을 만족하는 해시가 나오면 채굴자는 그 블록을 네트워크의 다른 노드에 전달합니다.

작업증명은 채굴 장비가 정확히 몇 번 계산했는지를 기록한 증명서는 아닙니다. 다만 조건에 맞는 해시는 평균적으로 많은 계산을 시도해야 찾을 수 있습니다. 반면 다른 풀노드는 전달받은 블록 헤더를 해시하고 목표값과 비교해 작업증명 조건을 만족하는지 빠르게 확인할 수 있습니다.

여기서 작업증명 검사를 블록 전체의 유효성 검증과 구분해야 합니다. 작업증명 조건을 만족했더라도 블록 안에 유효하지 않은 거래가 있거나 다른 합의 규칙을 위반했다면 풀노드는 그 블록을 받아들이지 않습니다. 작업증명은 유효한 블록이 되기 위해 필요한 조건 중 하나이며, 거래의 서명이나 모든 블록 규칙을 대신 검증하는 장치는 아닙니다.

이처럼 작업증명은 새 블록을 제안하는 데 계산 비용이 들게 하고, 풀노드가 그 결과를 같은 기준으로 확인할 수 있게 합니다.

채굴 장비가 계산하는 것은 80바이트 블록 헤더

비트코인 블록에는 여러 거래가 들어 있지만, 채굴 장비가 작업증명을 찾기 위해 반복해서 해시하는 대상은 거래 목록 전체가 아니라 80바이트 크기의 블록 헤더입니다. 블록 헤더에는 해당 블록을 구분하고 이전 블록 및 거래 목록과 연결하는 핵심 정보가 들어 있습니다.

블록 헤더는 다음 여섯 항목으로 구성됩니다.

항목크기역할
버전(version)4바이트블록 버전과 일부 규칙 변경 신호를 담습니다.
이전 블록 헤더 해시32바이트바로 앞 블록을 가리켜 블록이 순서대로 이어지게 합니다.
머클 루트(merkle root)32바이트블록에 포함된 거래들을 하나의 값으로 요약해 블록 헤더와 연결합니다.
시간(time)4바이트채굴자가 규칙이 허용하는 범위 안에서 기록한 블록 시각입니다.
nBits4바이트작업증명에 적용할 목표값을 압축된 형식으로 담습니다.
논스(nonce)4바이트채굴 과정에서 다른 해시를 얻기 위해 바꾸어 보는 32비트 숫자입니다.

각 항목의 크기를 더하면 4 + 32 + 32 + 4 + 4 + 4 = 80바이트가 됩니다.

거래 내용이 블록 헤더에 그대로 들어가는 것은 아닙니다. 블록에 포함된 거래들로 머클 루트를 만들고, 그 머클 루트를 블록 헤더에 넣습니다. 블록에 포함할 거래의 구성이나 순서가 달라지면 머클 루트도 달라지고 블록 헤더의 해시도 달라집니다. 따라서 채굴 장비는 작은 크기의 블록 헤더를 계산하면서도 그 블록에 포함된 거래 목록과 연결된 결과를 만들 수 있습니다.

이전 블록 헤더 해시는 현재 블록을 바로 앞 블록과 연결합니다. 앞선 블록의 해시가 달라지면 다음 블록 헤더에 기록된 값과도 맞지 않게 됩니다. 이 연결 구조와 각 블록에 누적되는 작업증명이 함께 작동해 과거 기록을 바꾸기 어렵게 만듭니다.

블록 해시와 목표값은 어떻게 비교되는가

채굴 장비는 80바이트 블록 헤더를 정해진 형식으로 배열한 뒤 SHA-256 해시 함수를 두 번 적용합니다. 이 계산으로 얻은 256비트 결과를 블록 해시라고 합니다.

블록 해시 = SHA-256(SHA-256(80바이트 블록 헤더))

hash-target-flow-v1.webp 80바이트 비트코인 블록 헤더의 여섯 필드가 이중 SHA-256 해시를 거쳐 목표값과 비교되는 작업증명 흐름

같은 블록 헤더를 계산하면 항상 같은 해시가 나옵니다. 하지만 블록 헤더의 값이 조금만 바뀌어도 결과는 크게 달라지며, 어떤 값으로 바꾸어야 원하는 범위의 해시가 나올지는 미리 계산해 알아내기 어렵습니다. 채굴 장비가 여러 값을 바꾸어 가며 해시 계산을 반복하는 이유입니다.

작업증명의 통과 기준은 해시를 부호 없는 큰 숫자로 보았을 때 목표값 이하인지입니다. 목표값은 허용되는 해시의 상한선이며, 블록 헤더의 nBits 항목에는 이 큰 숫자를 4바이트로 줄여 표현한 값이 들어 있습니다.

풀노드는 새 블록과 그 안의 거래가 비트코인의 규칙에 맞는지 직접 검사하는 프로그램입니다. 새 블록을 받은 풀노드는 nBits에 압축된 값을 원래 목표값으로 풀어낸 뒤, 블록 헤더를 직접 해시합니다. 그리고 계산한 블록 해시가 목표값 이하인지 비교합니다. 즉, 채굴자가 조건을 통과했다는 주장을 그대로 믿지 않고 같은 기준으로 다시 확인합니다.

작은 숫자로 단순화하면 다음과 같습니다. 목표값이 1,000일 때 계산 결과가 725라면 목표값 이하이므로 통과합니다. 반면 1,350이라면 목표값보다 크므로 통과하지 못합니다. 실제 비트코인에서는 이보다 훨씬 큰 256비트 숫자를 비교합니다.

블록 해시를 16진수로 표시하면 조건을 만족한 값의 앞부분에 0이 여러 개 보일 수 있습니다. 그래서 작업증명을 앞에 0이 많이 붙은 해시를 찾는 과정이라고 설명하기도 합니다. 하지만 정확한 판정 기준은 0의 개수가 아니라 해시를 숫자로 보았을 때 목표값 이하인지입니다.

목표값이 낮아질수록 통과할 수 있는 해시의 범위가 좁아져 조건을 만족하기 어려워집니다. 반대로 목표값이 높아지면 통과할 수 있는 범위가 넓어집니다. 따라서 목표값과 채굴 난이도는 반대 방향으로 움직입니다. 목표값이 낮을수록 난이도는 높고, 목표값이 높을수록 난이도는 낮습니다.

채굴은 논스 하나만 바꾸는 과정이 아니다

논스(nonce)는 블록 헤더 안에 있는 32비트 숫자입니다. 채굴 장비는 논스를 바꾸어 새로운 블록 헤더를 만들고, 그때마다 해시를 계산해 목표값 이하인지 확인합니다. 논스에 넣을 수 있는 값은 약 43억 개이지만, 고속으로 계산하는 채굴 장비에는 이것만으로 충분한 탐색 공간이 되지 않습니다.

채굴 과정에서 바꿀 수 있는 값은 논스만이 아닙니다. 채굴자나 채굴 풀은 코인베이스 거래 안의 extraNonce라는 값을 바꾸어 새로운 거래 식별값을 만들 수 있습니다. 코인베이스 거래가 달라지면 거래 목록을 요약한 머클 루트가 달라지고, 머클 루트가 들어 있는 블록 헤더도 달라집니다. 이렇게 만들어진 새 블록 헤더에서는 논스 값을 다시 바꾸어 가며 또 다른 해시들을 계산할 수 있습니다.

헤더와 해시에 영향을 주는 주요 항목을 정리하면 다음과 같습니다.

바꾸는 항목블록 헤더에 미치는 영향
논스블록 헤더 안의 32비트 논스 값이 직접 바뀝니다.
코인베이스 거래의 extraNonce코인베이스 거래 식별값과 머클 루트가 달라져 블록 헤더가 바뀝니다.
거래 목록이나 순서머클 루트가 달라져 블록 헤더가 바뀝니다.
시간(time)비트코인 규칙이 허용하는 범위에서 블록 헤더의 시간 값이 바뀔 수 있습니다.
버전(version)의 일부 비트허용된 범위에서 블록 헤더의 버전 값을 바꾸어 추가 해시를 시도할 수 있습니다.

extraNonce는 이름에 논스가 들어가지만 80바이트 블록 헤더의 논스 항목은 아닙니다. 코인베이스 거래 안의 값을 바꾸어 머클 루트를 새로 만들고, 결과적으로 새로운 블록 헤더를 만드는 데 사용됩니다.

어떤 항목을 바꾸든 목적은 이전과 다른 블록 헤더를 만들어 새로운 해시를 계산하는 것입니다. 해시가 목표값보다 크면 실패이며, 그 결과에서 다음에 어떤 값을 선택해야 성공하는지 알아낼 수는 없습니다. 채굴 장비는 성공에 가까워지는 방향을 찾아가는 것이 아니라 서로 다른 블록 헤더를 계속 시도합니다.

채굴 장비는 반복 계산하고 풀노드는 작업증명을 확인한다

작업증명 조건을 만족하는 해시를 찾으려면 평균적으로 매우 많은 블록 헤더를 계산해야 합니다. 목표값이 낮아 통과할 수 있는 해시의 범위가 좁을수록 한 번의 계산이 성공할 가능성도 낮아집니다. 운이 좋으면 적은 횟수로 찾을 수도 있지만, 특정 횟수 안에 반드시 성공하는 것은 아닙니다.

채굴 과정에서 나온 수많은 실패 결과는 새 블록에 기록되지 않습니다. 조건을 만족한 블록 헤더를 포함한 완성된 블록만 네트워크에 전달됩니다. 따라서 새 블록을 받은 풀노드는 채굴자가 거쳤던 모든 실패 계산을 다시 반복할 필요가 없습니다.

풀노드는 먼저 블록 헤더의 nBits에 압축해 기록된 목표값이 현재 채굴 난이도에 맞는지 확인합니다. 그런 다음 전달받은 80바이트 블록 헤더에 SHA-256을 두 번 적용하고, 계산한 블록 해시가 그 목표값 이하인지 비교합니다. 이 과정으로 해당 블록 헤더가 작업증명 조건을 만족하는지 빠르게 판단할 수 있습니다.

작업증명 확인이 빠르다고 해서 블록 전체의 검증이 작업증명 하나로 끝나는 것은 아닙니다. 풀노드는 작업증명을 확인한 뒤에도 이전 블록과 올바르게 연결되는지, 블록 안의 거래가 유효한지, 코인베이스 거래가 허용된 보상 범위를 지켰는지 등 다른 합의 규칙을 별도로 검사합니다.

이처럼 작업증명은 조건에 맞는 결과를 찾는 데는 평균적으로 많은 계산이 필요하지만, 제출된 결과가 조건을 만족하는지는 빠르게 확인할 수 있는 구조입니다.

채굴 난이도는 왜 2,016블록마다 조정되는가

비트코인 네트워크에 참여하는 채굴 장비의 전체 계산 능력은 계속 달라집니다. 새로운 장비가 늘어 계산 능력이 커지면 같은 난이도에서도 블록을 더 빨리 찾을 가능성이 높아집니다. 반대로 참여하는 계산 능력이 줄면 블록을 찾는 데 더 오래 걸릴 수 있습니다.

비트코인은 이런 변화가 있어도 블록이 장기적으로 평균 약 10분 간격으로 생성되도록 채굴 난이도를 조정합니다. 여기서 10분은 개별 블록의 고정 시간이 아닙니다. 어떤 블록은 몇 초 만에 발견될 수 있고 다른 블록은 한 시간 이상 걸릴 수도 있습니다. 여러 블록을 길게 보았을 때 목표로 삼는 평균 간격이 600초입니다.

실제 비트코인이 거래되고 채굴되는 네트워크를 메인넷(Mainnet)이라고 합니다. 메인넷에서는 2,016블록마다 각 풀노드가 동일한 규칙에 따라 다음 목표값을 계산합니다.

이 계산은 풀노드끼리 경쟁하거나 투표하는 과정이 아닙니다. 같은 블록 기록과 합의 규칙을 사용하는 풀노드는 각각 계산하더라도 동일한 목표값을 얻습니다.

채굴자는 이 목표값을 만족하는 작업증명을 찾아야 합니다. 블록 하나의 목표 간격이 10분이므로 2,016블록의 목표 기간은 다음과 같습니다.

2,016블록 × 10분 = 20,160분 = 14일

풀노드는 직전 난이도 조정 구간의 블록 타임스탬프를 이용해 실제 경과 시간을 구하고, 목표 기간인 14일과 비교합니다. 개념을 단순화한 계산식은 다음과 같습니다.

새 목표값 = 이전 목표값 × 실제 경과 시간 ÷ 목표 기간

직전 2,016블록의 경과 시간이 14일보다 빠르거나 느린지에 따라 목표값과 채굴 난이도가 반대로 조정되는 흐름

직전 구간이 14일보다 빨리 끝났다면 실제 경과 시간이 목표 기간보다 짧으므로 새 목표값이 낮아집니다. 목표값이 낮아지면 통과할 수 있는 해시의 범위가 좁아져 난이도가 높아집니다. 반대로 직전 구간이 14일보다 오래 걸렸다면 새 목표값이 높아지고 난이도는 낮아집니다.

직전 구간의 결과새 목표값새 난이도
14일보다 빨랐음낮아짐높아짐
약 14일이 걸림거의 유지거의 유지
14일보다 느렸음높아짐낮아짐

예를 들어 직전 조정 구간의 실제 경과 시간이 7일이라면, 단순 계산상 새 목표값은 이전의 절반이 되고 난이도는 약 두 배가 됩니다. 실제 경과 시간이 28일이라면 새 목표값은 두 배가 되고 난이도는 약 절반이 됩니다.

한 번의 조정에서 난이도가 지나치게 크게 바뀌지 않도록 계산에 사용하는 실제 경과 시간에는 제한이 있습니다. 비트코인 메인넷은 실제 경과 시간이 14일의 4분의 1보다 짧으면 3.5일로, 네 배보다 길면 56일로 계산합니다. 따라서 한 조정 구간에서 난이도는 최대 네 배까지 높아지거나 이전의 4분의 1까지 낮아질 수 있습니다.

난이도는 특정 운영자나 채굴 풀이 발표하는 값이 아닙니다. 채굴자가 자신에게 유리하도록 더 쉬운 목표값을 nBits에 넣으면, 풀노드는 자신이 계산한 목표값과 일치하지 않는 블록으로 판단해 받아들이지 않습니다.

네트워크 해시레이트도 모든 채굴 장비의 성능을 직접 합산한 실측값은 아닙니다. 일반적으로 현재 난이도와 실제로 관측된 블록 생성 속도 등을 이용해 전체 계산 능력을 추정합니다. 해시레이트 변화는 블록 생성 속도에 영향을 줄 수 있고, 그 결과가 다음 난이도 조정에 반영됩니다.

누적 작업량이 과거 기록 변경을 어렵게 만드는 방식

풀노드는 누적 작업량이 가장 큰 유효한 체인을 선택한다

서로 다른 채굴자가 비슷한 시점에 유효한 블록을 발견하면 네트워크에 둘 이상의 체인 후보가 잠시 생길 수 있습니다. 예를 들어 같은 블록 뒤에서 A 블록과 B 블록이 거의 동시에 발견될 수 있습니다.

공통 체인 ─┬─ A 블록
           └─ B 블록

풀노드는 A와 B를 각각 검증합니다. 두 블록이 모두 합의 규칙을 통과하고 누적 작업량도 같다면, 풀노드마다 먼저 전달받은 체인을 현재 체인으로 볼 수 있습니다. 중앙 관리자가 어느 쪽을 선택하라고 결정하거나 풀노드들이 투표하는 과정은 없습니다.

이후 A 블록 뒤에 A-2 블록이 먼저 추가되었다고 가정해 보겠습니다.

공통 체인 ─┬─ A 블록 ─ A-2 블록
           └─ B 블록

A 쪽에는 작업증명이 하나 더 쌓였으므로 A 체인의 누적 작업량이 더 커집니다. 이 구조를 전달받아 검증한 풀노드는 A 체인을 현재 기준으로 선택합니다. 현재 기준이라는 표현은 이 선택이 누군가의 최종 선언이 아니라, 풀노드가 지금 알고 있는 유효한 후보 중 누적 작업량이 가장 큰 체인이라는 뜻입니다.

누적 작업량은 채굴 장비가 실제로 몇 번 해시를 계산했는지 세거나 사용한 전력을 더한 값이 아닙니다. 풀노드는 각 블록의 목표값을 이용해 그 블록이 나타내는 작업량을 계산하고, 이를 앞선 블록들의 작업량에 계속 더합니다. 목표값이 낮고 난이도가 높은 블록일수록 더 큰 작업량이 더해집니다.

풀노드가 단순한 블록 개수 대신 누적 작업량을 비교하는 이유는 블록마다 적용된 난이도가 다를 수 있기 때문입니다. 먼저 각 블록이 합의 규칙에 맞는지 확인한 뒤, 유효한 후보 가운데 계산된 누적 작업량이 가장 큰 체인을 같은 기준으로 선택합니다. 이 규칙을 사용하면 중앙 결정자 없이도 풀노드들이 하나의 거래 기록으로 모일 수 있습니다.

과거 기록을 바꾸려면 대체 체인을 다시 만들어야 한다

과거 기록을 바꾼다는 것은 이미 저장된 블록 파일을 직접 편집하는 일이 아닙니다. 과거 블록과 다른 거래 구성으로 대체 블록을 만들고, 그 지점부터 별도의 체인을 다시 만드는 상황을 뜻합니다.

대체 블록의 거래 구성이 달라지면 거래 목록을 요약한 머클 루트와 블록 헤더의 해시도 달라집니다. 그러면 다음 블록 헤더에 기록된 이전 블록 해시와 맞지 않으므로, 대체 블록 이후의 블록들도 새로 만들어야 합니다. 각 블록은 거래와 보상 등 다른 합의 규칙을 지켜야 하고 작업증명 조건도 만족해야 합니다.

대체 체인을 만드는 동안에도 다른 채굴자들은 현재 선택된 체인 위에 새 블록을 계속 추가합니다. 대체 체인이 풀노드의 선택을 받으려면 계속 늘어나는 현재 체인의 누적 작업량을 따라잡고 넘어야 합니다.

이 구조가 과거 기록 변경을 수학적으로 절대 불가능하게 만드는 것은 아닙니다. 다만 변경하려는 지점 뒤에 유효한 블록이 더 쌓일수록 다시 수행하고 따라잡아야 할 작업량이 커집니다. 성공 가능성은 기록을 바꾸려는 쪽의 계산 능력이 전체에서 차지하는 비중과 해당 기록 이후에 쌓인 누적 작업량 등에 따라 달라집니다. 작업량이 많더라도 유효하지 않은 거래나 합의 규칙을 위반한 블록을 풀노드가 승인하게 만들 수는 없습니다.

많은 해시 연산 능력으로 가능한 공격과 풀노드가 계속 거부할 수 있는 규칙 위반의 범위는 비트코인 51% 공격이란? 이중 지불·거래 검열과 풀노드 검증에서 구분해 설명합니다.

비트코인 작업증명의 핵심 정리

비트코인 작업증명의 흐름은 다음과 같이 연결됩니다.

후보 블록의 거래 구성 → 머클 루트 → 80바이트 블록 헤더 → 이중 SHA-256 → 목표값과 비교 → 풀노드 검증 → 누적 작업량 비교

작업증명의 핵심은 조건에 맞는 블록 헤더 해시를 찾는 데는 많은 계산이 들지만, 풀노드는 그 결과와 다른 블록 규칙을 빠르게 검증할 수 있다는 점입니다. 목표값과 난이도는 작업증명의 어려움을 조절하고, 누적 작업량은 여러 유효한 체인 중 현재 기준이 되는 체인을 선택하는 데 사용됩니다.

비트코인 채굴 관련 글 더 알아보기

작업증명과 구분되는 채굴 보상 구조와 실제 장비 운영 경험은 다음 글에서 이어서 확인할 수 있습니다.

참고한 기술 자료

댓글 남기기