채굴 Nonce는 공개 uint32 탐색 매개변수이며 비밀이나 서명 nonce가 아닙니다. 나머지 헤더 필드가 고정되면 2^32개 값을 제공하며 현대 ASIC은 이를 빠르게 소진합니다. 따라서 채굴 소프트웨어는 coinbase 거래의 Extranonce와 그에 따른 Merkle root를 바꾸거나 nTime 및 허용된 version 비트를 바꾸어 탐색 공간을 갱신합니다.
Bitcoin 헤더는 version, 이전 블록 해시, Merkle root, time, nBits, 4바이트 Nonce로 이루어진 80바이트입니다. Nonce는 little-endian 순서로 직렬화된 부호 없는 32비트 정수입니다. 이 필드를 바꾸면 직렬화된 헤더와 double-SHA-256 해시는 달라지지만 그 자체로 거래 목록은 바뀌지 않습니다. [Bitcoin Developer Reference — Block headers]
SHA-256 입력을 조금 바꿔도 성공으로 향하는 유용한 방향은 얻을 수 없습니다. Nonce를 하나 늘리면 사실상 무관한 256비트 해시가 생기므로 서로 다른 헤더를 독립적인 확률적 시도로 모델링할 수 있습니다. 완전히 같은 헤더를 반복하면 항상 같은 해시가 나오며, 성공 값으로 이끄는 유용한 기울기는 없습니다. [Bitcoin Developer Reference — Block headers] [Bitcoin Developer Guide — Mining]
다른 헤더 필드가 그대로라면 4바이트 Nonce는 정확히 4,294,967,296개, 즉 2^32개 값을 제공합니다. 현대 ASIC은 이 범위를 초당 여러 번 탐색할 수 있어 Nonce 필드만으로는 현대 채굴에 부족합니다. 전체 범위를 소진해도 유효한 Proof of Work 발견은 보장되지 않습니다. [Bitcoin Developer Reference — Block headers] [BIP 320 — nVersion bits for general purpose use]
Mining Pool과 채굴 소프트웨어는 coinbase 거래 안에서 Extranonce를 사용합니다. 이름이 비슷해도 다른 헤더 필드는 아닙니다. Extranonce를 바꾸면 coinbase txid와 헤더의 Merkle root가 차례로 달라져 새로운 2^32개 채굴 Nonce 값의 공간이 열립니다. [Bitcoin Developer Guide — Mining] [Bitcoin Developer Reference — Transactions]
Coinbase 거래는 Merkle 트리의 잎입니다. 트리를 다시 계산하면 txid 변경이 헤더의 Merkle root에 반영됩니다. 이전 블록 해시와 거의 같은 블록 내용을 유지하면서 새 헤더를 얻으며, 이를 위해 다른 거래를 바꿀 필요는 없습니다. [Bitcoin Developer Reference — Block headers] [Bitcoin Developer Guide — Mining]
허용 범위에서 nTime을 바꾸거나 version rolling으로 허용된 version 비트를 바꾸면 탐색 공간이 늘어납니다. BIP320은 일부 nVersion 비트의 범용 사용을 제안하지만, 제안 자체가 모든 비트의 임의 변경을 허용하지는 않습니다. 합의 규칙과 채굴 작업 규칙은 계속 적용되며 최종 해시는 target을 충족해야 합니다. [BIP 23 — getblocktemplate pooled mining] [BIP 320 — nVersion bits for general purpose use]
공동 채굴에서는 Mining Pool이나 작업 조정자가 worker마다 다른 coinbase/Extranonce 또는 다른 매개변수를 할당하여 동일한 헤더의 중복 계산을 막습니다. BIP23은 선택적 noncerange 매개변수도 설명합니다. Stratum 프로토콜은 여러 ASIC 장치에 탐색 공간을 분배합니다. [BIP 23 — getblocktemplate pooled mining] [Bitcoin Developer Guide — Mining]
Nonce 숫자 자체는 좋거나 나쁘지 않습니다. Full Node는 특정 헤더 전체를 해싱하고 nBits에서 얻은 유효한 target과 비교합니다. 낮은 Nonce는 아무것도 증명하지 않으며 전체 헤더 해시가 target보다 작거나 같아야 합니다. 이 조건을 충족해도 다른 블록 유효성 규칙의 검증을 대체하지는 않습니다. [Bitcoin Developer Reference — Block headers] [Bitcoin Core v30.0 — Proof of Work validation]
Nonce는 암호학적 서명에서도 사용됩니다. 비밀 서명 스칼라를 서로 다른 메시지에 잘못 재사용하면 Private Key가 드러날 수 있습니다. 채굴 Nonce는 공개 헤더 데이터라 비밀로 할 필요가 없습니다. 서명의 공개 데이터를 비밀 스칼라 또는 채굴 카운터와 혼동해서는 안 됩니다. [BIP 340 — Schnorr Signatures]
Bitcoin Core의 getblockheader는 기본 상세 출력으로 nonce, bits, time 등의 필드를 반환합니다. verbose 매개변수를 false로 설정하면 직렬화된 헤더를 16진수로 반환합니다. 독립적으로 확인하려면 정확한 80바이트를 구성하거나 디코딩하고 double-SHA-256을 계산한 다음 Bitcoin 바이트 순서를 지켜 숫자 해시를 유효한 target과 비교합니다. [Bitcoin Developer Reference — Block headers] [Bitcoin Core RPC — getblockheader] [Bitcoin Core v30.0 — Proof of Work validation]
더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 블록 헤더, 비트코인 채굴, Proof of Work, Mining Target, 코인베이스 트랜잭션, Bitcoin. 다음 항목에서도 이 글을 참조합니다 블록 헤더, 코인베이스 트랜잭션, ASIC Miner, Mining Target.