Glossário / Referência do desenvolvedor
Script de chave pública
Outros nomes: Pubkey script, scriptPubKey, Locking script.
- O que é o script de chave pública?
- O script de chave pública é o pequeno trecho de Bitcoin Script anexado a cada saída de transação, que declara as condições que devem ser atendidas antes que os bitcoins dessa saída possam se mover novamente.
Os bitcoins não ficam em um endereço; eles ficam em saídas, cada uma protegida por um script de chave pública. O Bitcoin Core chama o campo de scriptPubKey, e em uma saída moderna comum ele tem 22 ou 34 bytes. Quando você passa um endereço a alguém, está entregando a receita do script de chave pública que a carteira dessa pessoa vai escrever.
Como funciona
Cada saída de uma transação serializada é três coisas em sequência: oito bytes de valor em satoshis, um prefixo de comprimento e o próprio script de chave pública. Nada na saída nomeia um destinatário. O script é o destinatário, e um endereço é apenas uma codificação com soma de verificação do punhado de bytes que há dentro dele.
Cinco modelos respondem por quase tudo que existe na blockchain hoje. Um bloqueio legado pay-to-public-key-hash ocupa 25 bytes e nomeia quatro opcodes em torno de um hash de 20 bytes. Um bloqueio pay-to-script-hash ocupa 23 bytes e termina com OP_EQUAL. O SegWit nativo é deliberadamente simples em comparação: um byte de versão seguido de um único push, 22 bytes para uma única chave e 34 bytes para um hash de script, sem nenhuma lógica na saída. O Taproot também tem 34 bytes: um byte de versão e uma chave de 32 bytes.
A política de retransmissão reconhece essa pequena lista e se recusa a repassar qualquer outra coisa, e é por isso que você não pode inventar seu próprio formato de saída e esperar que uma carteira o pague. O consenso é mais flexível que a política nesse ponto, mas o efeito prático é que os cinco modelos são o menu inteiro.
O nome é um fóssil. Nas primeiras transações o script realmente continha uma chave pública: a saída coinbase do bloco gênese tem 67 bytes e contém uma chave não comprimida de 65 bytes seguida de OP_CHECKSIG, e você pode lê-la no código-fonte do próprio Bitcoin Core. Pagar a um hash em vez de a uma chave virou a norma durante 2011, e hoje a maioria dos scripts de chave pública não contém nenhuma chave pública, apenas um compromisso com uma.
Onde isso aparece
Peça a qualquer nó que decodifique uma transação bruta e cada saída trará um objeto scriptPubKey com quatro campos: a representação em assembly legível por humanos, o hexadecimal bruto, a string de tipo e o endereço ao qual o tipo corresponde. Os exploradores de blocos mostram a mesma coisa, geralmente com o rótulo de locking script ou output script.
É também onde fica a configuração de carteira somente leitura. Importar um endereço significa dizer ao seu software quais scripts de chave pública ele deve procurar na blockchain, e é por isso que um descritor, uma definição que gera toda a família de scripts que uma chave pode produzir, substituiu a importação endereço por endereço nas ferramentas sérias.
A habilidade prática de leitura é curta. Se o script começa com 0 e contém 20 bytes, alguém vai gastá-lo com uma assinatura e uma entrada barata. Se contém 32 bytes, há um contrato por trás que você não consegue ver. Se começa com 1 e contém 32 bytes, é Taproot, e pode ser uma única chave ou uma árvore inteira de condições com a mesma aparência.
Script de chave pública vs script de assinatura
O script de chave pública faz a pergunta e o script de assinatura tenta respondê-la, e eles são escritos por pessoas diferentes em momentos diferentes. Quem envia dinheiro a você escreve o script de chave pública, a partir do endereço que você forneceu, e paga pelos bytes dele. Você escreve o script de assinatura depois, quando gasta, e paga esses bytes você mesmo. É por isso que enviar a um endereço Taproot custa ao remetente um pouco mais do que enviar a um legado, mas economiza bem mais para você quando por fim mover os bitcoins. Os dois scripts também são executados em separado, e não como um único programa unido, uma mudança feita em 2010 depois que a execução combinada original se mostrou explorável.