Pular para o conteúdo
buybitcoinsmart

Glossário / Referência do desenvolvedor

Bitcoin Script

Outros nomes: Script.

O que é o Bitcoin Script?
O Bitcoin Script é a pequena linguagem baseada em pilha que cada saída de bitcoin carrega, definindo as condições que alguém deve satisfazer antes que esses bitcoins possam ser gastos novamente.

Os bitcoins não são enviados a pessoas. Eles ficam bloqueados atrás de um pequeno programa, e gastá-los significa fornecer dados que fazem o programa terminar com um valor verdadeiro no topo da pilha. A linguagem não tem laços nem recursão, e um script legado para em 10.000 bytes e 201 operações, então um validador sempre sabe que o trabalho vai terminar. É por isso que o bitcoin nunca teve um contrato descontrolado.

Como funciona

O Bitcoin Script é uma máquina de pilha que lê da esquerda para a direita e não faz mais nada.

Inserções de dados vão para uma pilha; as operações retiram dela seus argumentos e devolvem os resultados. Não há variáveis, nem saltos para trás, nem qualquer forma de ler algo fora da transação que está sendo validada. Um script tem sucesso quando a execução termina sem erro e deixa um valor verdadeiro no topo.

Duas partes se encontram no momento do gasto. A saída gasta carrega o bloqueio, chamado de script de chave pública (pubkey script). A entrada que a gasta carrega a prova, chamada de script de assinatura nas saídas mais antigas ou de testemunha (witness) nas saídas segwit. Elas rodam em sequência, com a pilha passando de uma para a outra, nunca concatenadas em um único programa, uma separação introduzida desde cedo, quando ficou claro que quem gasta a saída, se pudesse injetar operadores no lado do bloqueio, poderia reescrever as condições.

O script mais comum da história do bitcoin merece ser lido por inteiro. Uma saída pay-to-public-key-hash contém OP_DUP, OP_HASH160, um hash de 20 bytes, OP_EQUALVERIFY e OP_CHECKSIG. Quem gasta fornece uma assinatura e uma chave pública. A execução empilha as duas, duplica a chave pública, calcula o hash da cópia até reduzi-la a 20 bytes, empilha o hash esperado, compara os dois e aborta se forem diferentes, e então verifica a assinatura contra uma serialização da própria transação. Seis passos, e toda a segurança de um endereço legado depende deles.

Os limites são deliberados e precisos. Um script legado ou P2SH não pode passar de 10.000 bytes nem de 201 operações que não sejam de inserção de dados. Nenhum item da pilha pode passar de 520 bytes. A pilha não pode conter mais de 1.000 itens. Um único OP_CHECKMULTISIG não pode nomear mais de 20 chaves públicas. Cada teto existe para que o custo de validar um bloco permaneça limitado, não importa o que alguém escreva.

A linguagem cresceu duas vezes, ao dar significado real a códigos reservados que não faziam nada (no-op). O BIP65 definiu o OP_CHECKLOCKTIMEVERIFY em dezembro de 2015, permitindo que uma saída se recuse a se mover antes de um horário ou uma altura indicados. O BIP112 fez o mesmo com o OP_CHECKSEQUENCEVERIFY, ativo desde o bloco 419.328 em julho de 2016, acrescentando bloqueios temporais relativos medidos a partir de quando o bitcoin foi confirmado. Esses dois opcodes são a razão de existirem canais Lightning, depósito em garantia com prazo e esquemas de herança com bloqueio temporal.

Por que isso importa quando você compra bitcoin

O endereço para o qual você saca é um tipo de script, e a escolha aparece na sua próxima taxa.

Gastar uma entrada pay-to-public-key-hash legada custa aproximadamente 148 bytes virtuais. Gastar uma entrada segwit nativa custa aproximadamente 68, porque o desconto da testemunha introduzido pelo BIP141 cobra os dados da testemunha a um quarto do valor, e um gasto pelo caminho de chave do taproot é menor ainda. Com uma taxa de 20 sat/vB, essa diferença é a maior parte do custo de um saque pequeno, repetida toda vez que você move bitcoins. Onde uma corretora permite escolher o formato do endereço para o qual você saca, escolher o moderno é um desconto permanente.

Script também é o que um cofre de multiassinatura realmente é. Um arranjo 2-de-3 é um script que nomeia três chaves públicas e exige duas assinaturas, e se um determinado dispositivo consegue exibir e assinar um arranjo assim com honestidade é uma questão que nossas análises de carteiras de hardware tratam diretamente. O mesmo vale para qualquer plano de herança baseado em um bloqueio temporal: os bitcoins só podem ser recuperados se alguém ainda tiver o script, e é por isso que os descritores de saída, a receita em texto simples para reconstruí-lo, devem estar no seu backup junto com a frase de recuperação.

Um aviso prático. Quando uma plataforma se recusa a enviar para um endereço que você colou, a causa é quase sempre que o código de saque dela não consegue construir aquele tipo de script, e não que seu endereço esteja errado. Teste qualquer formato de endereço que você não conhece com um valor pequeno antes de mover um saldo que importa para você.

O bug de 184 bilhões de bitcoin e os opcodes que Satoshi desativou

Em 15 de agosto de 2010, o bloco 74.638 continha uma transação que criou 184.467.440.737,09551616 bitcoin, dividido em duas saídas de aproximadamente 92,2 bilhões cada uma.

A verificação de que as saídas de uma transação não excediam suas entradas usava aritmética com sinal de largura fixa, e saídas grandes o suficiente para estourar essa aritmética somavam um número negativo, então a transação passava no teste. Um cliente corrigido apareceu em cerca de cinco horas, e a cadeia honesta ultrapassou a defeituosa na altura 74.691. Esses bitcoins nunca existiram na cadeia que todo mundo usa.

Esse episódio, junto com uma família de bugs relacionados nas operações de cadeias de caracteres e aritméticas, é a razão de quinze opcodes estarem permanentemente desativados: OP_CAT, OP_SUBSTR, OP_LEFT, OP_RIGHT, OP_INVERT, OP_AND, OP_OR, OP_XOR, OP_2MUL, OP_2DIV, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT e OP_RSHIFT. Uma transação cujo script apenas contenha um deles é inválida, seja executado ou não. A desativação foi um instrumento grosseiro aplicado sob pressão de tempo, e desfazer parte dela é trabalho em andamento: o BIP347 propõe restaurar o OP_CAT dentro do tapscript, onde os limites mais novos tornam o abuso muito mais difícil.

Bitcoin Script vs tapscript

Tapscript é o Bitcoin Script com o regulamento reescrito, e se aplica apenas dentro de um gasto pelo caminho de script do taproot. O BIP342 eliminou tanto o teto de tamanho de script de 10.000 bytes quanto o teto de 201 operações, desativou OP_CHECKMULTISIG e OP_CHECKMULTISIGVERIFY, e acrescentou OP_CHECKSIGADD em seus lugares para que políticas de multiassinatura possam ser verificadas em lote. As verificações de assinatura são medidas em vez de contadas: cada entrada recebe um orçamento de 50 mais o tamanho serializado de sua testemunha, e cada verificação de assinatura executada gasta 50 dele. A mesma máquina de pilha, uma contabilidade diferente.

Bitcoin Script vs um script de chave pública

Bitcoin Script é a linguagem; um script de chave pública é um programa escrito nela. Uma saída contém um script de chave pública, que é o bloqueio. A entrada que a gasta contém um script de assinatura ou uma testemunha, que é a chave. Ambos são Bitcoin Script, e chamar qualquer um dos dois simplesmente de “o script” é a fonte mais comum de confusão ao ler uma transação bruta, porque as duas metades são avaliadas separadamente e apenas uma delas foi fixada quando os bitcoins foram recebidos.

Não confundir com

Perguntas frequentes

O Bitcoin Script é Turing completo?

Não, e isso é deliberado. Ele não tem laços nem recursão, e os scripts legados têm um teto de 10.000 bytes e 201 operações, de modo que um validador pode limitar o custo de qualquer script antes de executá-lo. Por isso o Bitcoin nunca precisou de medição de gas.

Preciso entender o Bitcoin Script para comprar bitcoin?

Não, mas o tipo de endereço para o qual você faz o saque é um tipo de script e determina sua taxa. Gastar uma entrada legada custa cerca de 148 bytes virtuais, contra aproximadamente 68 de uma entrada segwit nativa, e o taproot é ainda mais barato.

Por que tantos opcodes do bitcoin estão desativados?

Por causa de bugs encontrados em 2010, incluindo o estouro de valor que criou 184 bilhões de bitcoin no bloco 74.638. Quinze opcodes de cadeia de caracteres e aritméticos foram desativados, e o BIP347 agora propõe restaurar o OP_CAT dentro do tapscript, onde os limites são mais rígidos.

O bitcoin pode fazer contratos inteligentes?

Dentro de limites, sim. Regras de multiassinatura, bloqueios temporais absolutos e relativos e bloqueios por hash são todos Bitcoin Script comum, e a Lightning é construída inteiramente a partir deles. O que ele não pode fazer é executar laços, chamar a si mesmo ou ler qualquer dado de fora da transação.

Leia a seguir

Termos relacionados

Mais em Referência do desenvolvedor

Ler esta página em inglês