Pular para o conteúdo
buybitcoinsmart

Glossário / Referência do desenvolvedor

Script de assinatura

Outros nomes: Script de desbloqueio, scriptSig, Unlocking script.

O que é um script de assinatura?
Um script de assinatura é o dado de desbloqueio que uma entrada carrega para satisfazer o script de chave pública da saída que ela gasta, e nas entradas SegWit modernas ele fica vazio.

Toda entrada de uma transação aponta para uma saída anterior e precisa provar que tem permissão para gastá-la. O Bitcoin Core chama esse campo de scriptSig; em uma entrada legada pay-to-public-key-hash ele carrega uma assinatura de 71 ou 72 bytes e uma chave pública de 33 bytes, aproximadamente 107 bytes. Desde o SegWit essa prova geralmente fica em outro lugar, e é nisso que está a maior parte do motivo pelo qual um saque para um endereço bech32 custa menos.

Como funciona

O script de assinatura é executado primeiro e deixa seus resultados na pilha para o script da saída consumir. Os dois não são executados como um único programa unido: são executados em sequência, com a pilha passando de um para o outro, uma separação introduzida em 2010 depois que o desenho original se mostrou explorável.

A política de retransmissão exige que esse campo não contenha nada além de inserções de dados. Nenhum condicional, nenhuma aritmética, nenhum opcode que faça algum trabalho. A restrição existe porque quem gasta controla esses bytes por completo, e deixar um atacante executar lógica na entrada reabre problemas que a rede fechou há muito tempo. O pay-to-script-hash transforma a regra em um requisito de consenso e não em uma preferência, já que o script de resgate precisa chegar como a última inserção simples.

Seu tamanho depende inteiramente do que ele desbloqueia. Uma entrada legada de chave única carrega uma assinatura e uma chave. Uma entrada SegWit aninhada carrega exatamente 23 bytes, uma única inserção do programa de testemunha de 22 bytes, e empurra todo o resto para a testemunha. Uma entrada bech32 ou bech32m nativa não carrega nada: o campo serializado é um único byte de comprimento zero.

Há uma entrada cujo script de assinatura não é prova de nada. A única entrada de uma transação coinbase não tem saída anterior para desbloquear, então o campo é reaproveitado como espaço livre entre 2 e 100 bytes, e desde o BIP-34 ele precisa começar pela altura do bloco. Mineradores assinam mensagens, votos e piadas ali desde 2009.

Onde você o vê

Decodifique qualquer transação e cada entrada mostra um objeto scriptSig com uma visão em assembly e uma visão em hexadecimal. Em uma entrada SegWit nativa ou Taproot, ambas são strings vazias, enquanto um campo de testemunha separado guarda os dados, e essa assimetria visual é a maneira mais rápida de saber de relance qual formato de endereço uma transação antiga usou.

Ele também explica um episódio histórico amplamente mal interpretado. Como o scriptSig fazia parte do ID da transação, um terceiro podia recodificar uma assinatura sem invalidá-la e mudar o ID de uma transação já transmitida. A Mt. Gox suspendeu os saques em fevereiro de 2014 e culpou exatamente esse comportamento, embora uma análise acadêmica posterior da blockchain tenha constatado que o volume de transações com maleabilidade era pequeno demais para explicar os bitcoins desaparecidos. O SegWit encerrou a discussão em agosto de 2017 ao tirar os dados de desbloqueio do cálculo do ID por completo.

Script de assinatura vs dados de testemunha

Um script de assinatura e os dados de testemunha carregam o mesmo tipo de prova, e o SegWit transferiu a tarefa de um para o outro sem mudar o que uma assinatura significa. As diferenças que importam para você são preço e permanência. Os bytes da testemunha são cobrados a uma unidade de peso cada um, enquanto os bytes do script de assinatura custam quatro, então o mesmo gasto de chave única ocupa aproximadamente 148 bytes virtuais quando a prova viaja no scriptSig e aproximadamente 68 quando viaja na testemunha. Os dados de testemunha também ficam fora do ID da transação, então o identificador de um gasto não pode ser alterado em trânsito. Uma entrada legada ainda usa o campo antigo, e é por isso que bitcoins parados em um endereço que começa com 1 custam mais para serem movidos, silenciosamente, a cada vez que você os move.

Não confundir com

Perguntas frequentes

Por que o script de assinatura está vazio na minha transação SegWit?

Porque a assinatura e a chave pública passaram para o campo de testemunha, que é cobrado a um quarto do peso. Um scriptSig vazio em uma entrada bech32 é correto e esperado, não um sinal de que algo falhou.

Alguém pode alterar meu script de assinatura depois que eu transmito a transação?

Em uma entrada legada, um terceiro podia antes recodificar a assinatura e mudar o ID da transação sem invalidar o gasto. O SegWit eliminou essa possibilidade para entradas com testemunha ao excluir os dados de desbloqueio do identificador.

Termos relacionados

Mais em Referência do desenvolvedor

Ler esta página em inglês