Nonce

O campo coringa usado na mineração

Diagrama mostrando a localização do campo nonce dentro do cabeçalho do bloco.

O nonce é um campo reservado no fim do cabeçalho do bloco usado para a mineração.

Nonce é uma abreviação de number used once (número usado uma vez).
cryptography.fandom.com/wiki/Cryptographic_nonce

Eu gosto de chamá-lo de "campo de mineração".

De qualquer forma, a maneira mais fácil de entender o seu propósito é ajustar o nonce em um cabeçalho de bloco e ver como ele afeta o hash do bloco:

Cabeçalho do Bloco

Decodifique e codifique um cabeçalho de bloco.

0 bytes
Cabeçalho do Bloco (Campos)

Versão

Versão: 0
0d
0d

Uso

Para que serve o campo nonce?

O nonce é um campo de 4 bytes que pode conter números entre 0 e 4294967295 (0x0 a 0xffffffff em hexadecimal).

Os mineradores incrementam o valor do nonce ao minerar, para obter resultados de hash completamente diferentes para o cabeçalho do seu bloco candidato. Eles torcem para tropeçar em um valor de nonce "mágico" que produza um hash de bloco abaixo do alvo atual.

Então não há habilidade em tentar encontrar um nonce que funcione. É só um campo reservado que permite aos mineradores re-hashear rapidamente o cabeçalho do bloco sem ter que reconstruir o bloco inteiro.

Simulador de mineração mostrando várias tentativas de hash ao incrementar o nonce.
Esta é uma simulação em câmera lenta de como o processo de mineração funciona por baixo dos panos.
Este vídeo sobre SHA-256 mostra o processo de mineração em ação.

Notas

Alguns detalhes extras sobre como o nonce funciona:

Limitações

Todo bloco tem um nonce "mágico"?

Os mineradores geralmente esgotam o campo nonce de 4 bytes do cabeçalho do bloco sem encontrar um valor de nonce "mágico" que produza um hash de bloco abaixo do alvo atual.

Então não, a maioria dos blocos não terá um valor de nonce "mágico".

Quando um minerador esgota o campo nonce, o passo óbvio seguinte é ajustar o campo tempo. Isso produz um cabeçalho de bloco ligeiramente diferente, o que permite ao minerador incrementar o campo nonce novamente em uma tentativa de minerar o mesmo bloco de transações.

Porém, os mineradores são tão rápidos que esgotam o campo nonce em menos de 1 segundo, então o campo tempo não ajuda muito nessa situação. Por isso, os mineradores buscam outras formas de modificar o cabeçalho do bloco sem ter que reconstruir o bloco inteiro de transações (o que levaria mais tempo)…

Ter um campo nonce tão pequeno (4 bytes) no cabeçalho do bloco foi possivelmente um erro de design do Satoshi.

ExtraNonce

O ExtraNonce fica localizado dentro do scriptSig de uma transação coinbase.

Se um minerador esgota o campo nonce, ele passa a ajustar o que é chamado de "ExtraNonce".

O ExtraNonce fica localizado dentro do scriptSig da transação coinbase. Os mineradores ficam livres para colocar qualquer dado que quiserem no scriptSig, o que significa que podem modificá-lo para servir como um campo não oficial para um valor de nonce adicional.

Isso funciona porque:

  1. Mudar o conteúdo do scriptSig muda os dados da transação.
  2. Mudar os dados da transação coinbase muda o seu TXID.
  3. Mudar o TXID da transação coinbase muda a raiz de Merkle.
  4. Mudar a raiz de Merkle muda o cabeçalho do bloco.

Então, uma mudança no scriptSig da transação coinbase é uma forma rápida e fácil de modificar o cabeçalho do bloco via a raiz de Merkle.

Não há uma posição "oficial" para um ExtraNonce dentro do scriptSig, então nem sempre é fácil identificar qual parte o minerador usou como ExtraNonce. Porém, os mineradores normalmente incrementam algum dado próximo ao início do campo scriptSig.

  • A forma mais rápida de minerar é ajustando o nonce diretamente. Se você usasse apenas o campo ExtraNonce para minerar, teria que recalcular a raiz de Merkle a cada tentativa, o que seria mais lento.
  • O campo versão também pode ser usado como um nonce extra.

Terminologia

Por que se chama nonce?

Boa pergunta.

É um termo usado em criptografia para "número usado uma vez", então basicamente se refere a qualquer momento em que você precisa usar um número aleatório de uso único para algum propósito criptográfico.

A menos que você seja britânico, claro, caso em que a palavra não significa nada disso.

Gifs

Aqui está um gif horrível que fiz em 2016 mostrando como o nonce é usado para mudar o hash do bloco:

Gif animado do nonce sendo usado para mudar o hash do bloco.

E aqui está outro mostrando uma visualização aproximada do processo de mineração:

Gif animado do nonce sendo usado durante o processo de mineração.

Se esses gifs não explicam tudo, não sei o que explica.

Recursos