O mineiro calcula um hash, uma impressão digital numérica do cabeçalho do bloco. Para satisfazer Proof of Work (uma prova de trabalho computacional), o resultado tem de ser menor ou igual a um limite chamado target. Nonce é um dos valores que se podem alterar para preparar outra tentativa. Não é uma palavra-passe nem uma chave secreta: qualquer pessoa o pode ler depois de o bloco ser publicado.
A Anna tem um equipamento de mineração que tenta produzir um novo bloco de transações. A partir do cabeçalho, um conjunto compacto de dados sobre o bloco, calcula com SHA-256 uma impressão digital numérica, o hash. O Bitcoin aplica esse cálculo duas vezes, daí double-SHA-256. Se o resultado exceder o limite permitido, o aparelho altera, por exemplo, o Nonce de 10 para 11 e tenta novamente. A Anna não adivinha números à mão: o equipamento faz automaticamente uma enorme quantidade de tentativas. Um Nonce maior não implica um hash menor nem que esteja mais perto do objetivo. Um cabeçalho exatamente igual dá sempre o mesmo hash; recalculá-lo não cria uma nova oportunidade. [1] [2]
O Nonce ocupa quatro bytes, ou 32 bits. Permitem representar os inteiros de 0 a 4 294 967 295, inclusive: no total, 4 294 967 296 possibilidades, ou 2^32. Parece muito, mas um aparelho especializado em mineração, chamado ASIC, percorre esse intervalo rapidamente. Experimentar todos os valores não garante sucesso. Se os restantes dados do cabeçalho não mudarem, recomeçar apenas repete os resultados anteriores. Por isso, o software também precisa de preparar cabeçalhos diferentes. [1] [5]
Uma opção é alterar Extranonce. O nome parecido pode confundir: não é outro campo do cabeçalho, mas um dado da transação coinbase, a primeira do bloco, que atribui a recompensa de mineração. A alteração muda o seu identificador, o txid, e depois o Merkle Root, a impressão conjunta das transações guardada no cabeçalho. O equipamento passa a ter outra entrada. Pode reutilizar os mesmos valores de Nonce, mas calcula agora hashes de cabeçalhos diferentes. Estas novas 2^32 possibilidades também não garantem encontrar um bloco. [2] [3]
Um explorador pode mostrar um Nonce pequeno num bloco e um grande noutro. O número, por si só, não diz quão difícil foi encontrar o bloco nem se ele é melhor. Um Full Node, um programa que verifica por si os blocos e as transações segundo as regras do Bitcoin, calcula o hash de todo o cabeçalho e compara-o com o target válido, cuja representação compacta está em nBits. Importa que o hash seja menor ou igual a esse limite, não o tamanho do Nonce. O nó tem ainda de validar as transações e as restantes regras do bloco. [1] [8]
Nonce surge também nas explicações sobre assinaturas de transações. Nesse contexto, pode ser um número auxiliar secreto, tecnicamente um escalar, usado pelo algoritmo em conjunto com a Private Key, a chave privada que autoriza gastar fundos. Reutilizá-lo incorretamente para mensagens diferentes pode revelar a chave. O Nonce de mineração é diferente: é público e o mesmo número pode aparecer em cabeçalhos distintos. As partes públicas de uma assinatura também não são esse valor auxiliar secreto. As regras de um uso não devem, por isso, ser transferidas automaticamente para o outro. [9]
Quando muitos aparelhos colaboram num Mining Pool, não devem todos calcular hashes dos mesmos cabeçalhos. Repetir não acrescenta tentativas novas. O coordenador atribui-lhes, por isso, dados distintos, por exemplo para coinbase e Extranonce. Protocolos como Stratum transmitem as tarefas; as unidades de mineração ligadas são também chamadas workers. O BIP23 descreve ainda o parâmetro opcional noncerange para delimitar o intervalo de Nonce. Isso não obriga todos os pools a usá-lo nem lhes permite mudar as regras de validade dos blocos. [4] [2]
Um Merkle Tree combina gradualmente as impressões das transações numa impressão conjunta, o Merkle Root. O identificador da transação coinbase, o seu txid, entra nesse cálculo como uma folha da árvore. Alterar Extranonce produz, assim, um novo txid e depois um novo Merkle Root. O mineiro pode manter as restantes transações e a referência ao bloco anterior, obtendo mesmo assim outro cabeçalho. Não está a reescrever um bloco confirmado: está a alterar uma proposta de bloco novo para a qual ainda procura um Proof of Work válido. [1] [2]
O software pode criar mais variantes do cabeçalho alterando o tempo, nTime, dentro dos limites permitidos ou modificando os bits de versão autorizados. Esta segunda técnica chama-se version rolling. O BIP320 propõe a utilização geral de determinados bits nVersion; a proposta não autoriza a alteração arbitrária de todos os bits. Continuam a aplicar-se as regras da rede e da tarefa de mineração atribuída. Nenhuma destas opções dispensa o hash final de satisfazer o target válido. O BIP323 propõe mais bits e mantém o estado Draft, ou seja, rascunho. [4] [5] [10]
Para ler documentação técnica também ajuda conhecer o formato. O cabeçalho contém 80 bytes: versão, hash do bloco anterior, Merkle Root, tempo, nBits e Nonce de quatro bytes. O Nonce é um inteiro sem sinal de 32 bits, do tipo uint32. É codificado em ordem little-endian, com o byte menos significativo primeiro. Alterar apenas o Nonce muda o cabeçalho e o seu hash double-SHA-256, não a lista de transações. O software exige essa representação exata, mas compreender a mineração não obriga a saber montá-la à mão. [1]
Um leitor avançado pode usar getblockheader no Bitcoin Core com o hash de um bloco específico. A saída detalhada predefinida inclui nonce, bits e time. Definir o parâmetro verbose como false devolve os 80 bytes exatos do cabeçalho em hexadecimal. A partir deles, pode calcular double-SHA-256 e comparar o resultado numérico com o target válido. Uma implementação própria tem de respeitar a ordem dos bytes do Bitcoin: invertê-los incorretamente altera a comparação. Ler o Nonce num explorador não substitui essa verificação. [1] [6] [8]
Para ter uma visão mais completa, leia este verbete junto com Block Header, Mineração, Proof of Work, Mining Target, Transação coinbase, Bitcoin. Também há referências a este verbete em Block Header, Transação coinbase, ASIC Miner, Stratum V1.