Pular para o conteúdo
buybitcoinsmart

Glossário / Endereços e chaves

Ponto NUMS

O que é um ponto NUMS?
Um ponto NUMS é uma chave pública cuja chave privada ninguém possui, usada como chave interna do taproot quando o caminho de gasto cooperativo deve ser impossível.

Especificação no BIP-341.

"Nothing Up My Sleeve" (nada na manga) é a propriedade: o ponto vem de uma receita pública e repetível, de modo que ninguém pode alegar ter uma chave secreta para ele. O BIP-341 publica um desses pontos, a coordenada x 0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0, produzida pelo hash da codificação padrão não comprimida do ponto base G da secp256k1. Para uma carteira, é assim que uma saída taproot passa a ser somente script: gastável por meio de sua árvore de condições e por nada mais.

Como funciona

Um ponto NUMS começa a vida como um hash, não como uma chave.

Uma chave pública comum é o gerador G multiplicado por um número secreto, e quem escolheu esse número pode assinar. Um ponto NUMS é construído ao contrário: pegue uma string pública fixa, aplique o hash e leia o resumo de 32 bytes como uma coordenada x. O exemplo do BIP-341 aplica o hash à codificação padrão não comprimida do próprio G, o que não deixa ao autor nenhuma liberdade para manipular a entrada. Converter esse valor em um ponto da curva dá uma chave pública válida em todos os aspectos menos um: assinar por ela significaria resolver um logaritmo discreto, e o BIP-341 cita 1 em 2 elevado a 128 como o limite de segurança do projeto.

O taproot fornece o resto. Uma chave de saída taproot é a chave interna P deslocada ao longo da curva por um ajuste que se compromete com a raiz de merkle da árvore de scripts: o BIP-341 define t = hash_TapTweak(p || merkle_root) e então Q = P + int(t)G. Assinar por Q no caminho de chave exige a chave privada por trás de P, então, quando P é um ponto NUMS, esse caminho fica fechado e o caminho de script é a única entrada. Um gasto assim revela uma folha mais um bloco de controle de 33 + 32m bytes, em que m é o número de hashes irmãos, limitado pelo BIP-341 a 128.

Há um vazamento que vale conhecer. Um ponto NUMS bem conhecido é reconhecível à primeira vista, então publicá-lo puro em um bloco de controle anuncia que o caminho de chave estava morto desde o início. O BIP-341 recomenda não fazer isso: escolha um inteiro novo r uniformemente ao acaso de 0 a n menos 1 e use H + rG, que é indistinguível de uma chave interna comum. Guarde r e você ainda pode provar a um coassinante que o ponto era NUMS entregando-o para recálculo.

Onde você o vê

Um ponto NUMS nunca aparece em um endereço, apenas na testemunha de um gasto pelo caminho de script.

On-chain, a saída tem 34 bytes, OP_1 seguido de um push de 32 bytes, sem diferença de qualquer outra saída taproot. A chave interna são os 32 bytes que seguem o primeiro byte do bloco de controle, então ela surge na primeira vez que alguém gasta pela árvore. Uma saída que recebe fundos e nunca é gasta por script nunca a revela.

Os descritores tornam a escolha explícita. O BIP-386 exige que toda expressão de chave dentro de tr() seja x-only e coloca a chave interna em primeiro lugar em tr(KEY, TREE), então um ponto NUMS ali é como um descritor declara que não existe caminho de chave. O caso espelhado é tr(KEY) sem árvore, em que o BIP-386 cita o conselho do BIP-341 de que uma saída sem caminho de script ainda deve se comprometer com um caminho impossível de gastar.

Uma chave interna NUMS faz a recuperação depender da string do descritor e não apenas das frases de recuperação: as frases reproduzem as chaves das folhas, e nada nelas registra a árvore nem o ponto acima dela. O fluxo de multiassinatura do Sparrow orienta você a guardar o descritor, e essa instrução pesa mais aqui do que em uma carteira comum de caminho de chave.

Ponto NUMS vs transação de dados nulos

Um ponto NUMS fecha um caminho de gasto, enquanto uma transação de dados nulos torna uma saída impossível de gastar por completo. Uma saída OP_RETURN está comprovadamente morta por definição: os nós a removem do conjunto de UTXO e qualquer valor atribuído a ela é queimado. Os bitcoins por trás de uma chave interna NUMS não são queimados: cada condição na árvore de scripts ainda permite gastar normalmente. A palavra que ambos compartilham é impossível de gastar, abrangendo uma saída inteira em um caso e um único ramo no outro.

Não confundir com

Perguntas frequentes

O bitcoin enviado a uma saída taproot com uma chave interna NUMS ainda pode ser gasto?

Sim, pelo caminho de script. Uma chave interna NUMS desativa apenas o gasto pelo caminho de chave, então cada script vinculado na árvore ainda é gasto normalmente e nada é queimado.

Por que o BIP-341 recomenda adicionar um valor aleatório ao ponto NUMS?

Para ocultar o fato de que o caminho de chave é inutilizável. O BIP-341 sugere escolher um inteiro novo r ao acaso e usar H mais r vezes G como chave interna, de modo que o valor revelado em um bloco de controle pareça qualquer outra chave, e r pode ser divulgado depois para provar que o ponto não tinha nenhuma chave privada conhecida.

Como um comprador comum de bitcoin, preciso me preocupar com pontos NUMS?

Não, a menos que você construa contratos taproot ou restaure uma carteira a partir de um descritor. Uma carteira de assinatura única usa uma chave interna que você controla de verdade, e o truque NUMS aparece apenas em arranjos somente script, como cofres e esquemas de custódia compartilhada.

Leia a seguir

Termos relacionados

Mais em Endereços e chaves

Ler esta página em inglês