Uma assinatura de bitcoin são dois números, r e s. O procedimento que os produz cabe em cinco linhas, o que os verifica cabe em três, e a razão de funcionar cabe numa única substituição algébrica. Esta aula faz as três coisas.
Comece pelo que entra. A mensagem assinada é a transação, resumida pela SHA-256 e lida como um número, que se chama z. A chave privada é o número d, e a chave pública é o ponto Q, que vale d vezes G. E há um terceiro ingrediente, sorteado na hora, o nonce k.
Assinar tem quatro passos. Sorteie k entre um e n menos um. Calcule o ponto k vezes G e pegue a coordenada x dele, reduzida módulo n: esse é o r. Calcule s como o inverso de k multiplicado pela soma de z com r vezes d, tudo módulo n. A assinatura é o par r, s. Se r ou s der zero, sorteia-se outro k — o que na prática nunca acontece.
Repare que a chave privada d aparece uma vez só, na terceira linha, misturada com z e protegida pela multiplicação com o inverso de k. Nada em r ou s permite isolá-la — desde que k seja diferente a cada vez, e a próxima aula é inteiramente sobre o que acontece quando não é.
Verificar tem três passos, e quem verifica tem apenas a transação, a chave pública Q e o par r, s. Calcule o inverso de s módulo n. Multiplique z por ele e chame de u1; multiplique r por ele e chame de u2. Some os pontos u1 vezes G e u2 vezes Q. A assinatura vale se a coordenada x do ponto que saiu, reduzida módulo n, for igual a r.

Agora a substituição que explica tudo. O ponto calculado na verificação é u1 vezes G mais u2 vezes Q. Trocando Q por d vezes G, isso vira o inverso de s multiplicando a soma de z com r vezes d, tudo isso vezes G. Mas s foi definido exatamente como o inverso de k vezes essa mesma soma — então o inverso de s vezes a soma é simplesmente k. O ponto que a verificação produz é k vezes G: precisamente o ponto que o assinante calculou no segundo passo, e cuja coordenada x virou o r que está sendo comparado.
É por isso que verificar funciona sem revelar nada. Quem confere não descobre d, não descobre k e nunca chega a saber qual foi o sorteio. Ele apenas reconstrói o mesmo ponto por um caminho diferente e confirma que os dois caminhos se encontram.
Três detalhes práticos fecham o assunto.
O primeiro é que r guarda só a coordenada x do ponto, e a altura é descartada. Como cada x corresponde a dois pontos, um acima e outro abaixo do eixo, a assinatura sozinha não diz qual dos dois era. É por isso que recuperar a chave pública a partir de uma assinatura exige um bit extra de recuperação, e é por isso que uma transação comum carrega a chave pública em vez de deduzi-la.

O segundo é uma consequência incômoda da simetria. Para toda assinatura válida com o valor s, o valor n menos s também é válido — são dois pares diferentes provando a mesma coisa. Isso permitia alterar o identificador de uma transação sem invalidá-la, o defeito que a guerra dos blocos mencionou. Desde 2016 a rede exige o menor dos dois valores, e o outro caminho está fechado.

O terceiro é a embalagem. Os dois números viajam num formato herdado dos padrões de certificados, o DER, que gasta de setenta a setenta e dois bytes por causa de marcadores de comprimento e de tipo. A assinatura de Schnorr, que o Taproot trouxe, tem sessenta e quatro bytes fixos e nenhum enfeite — parte da economia daquela atualização está aqui.
A matemática desta aula é sólida e não foi quebrada nenhuma vez. O que já foi quebrado, com prejuízo real e em mais de um caso famoso, foi o sorteio da terceira linha. Na próxima aula, o nonce repetido e a álgebra de colégio que entrega a chave privada.