Blockchain/Nível IV · Protocolo a fundo/4.1 Script/Lição 1
Script: uma linguagem de pilha
A pilha que mantém a execução limitada e os opcodes desativados por Satoshi
MateriaisUma folha de papel e canetaAcesso a um explorador de blocos do BitcoinA página ‘Script’ da Bitcoin Wiki
Curiosidade
- Por que uma linguagem sem laços protege cada nó de cálculos infinitos?
- Qual erro específico em 2010 permitiu que alguém gastasse as moedas de outros antes que fosse corrigido?
- Como um valor de saída pode ser marcado como comprovadamente não gastável, ainda assim contendo dados?
Explorar
- O Bitcoin Script é uma linguagem pequena, baseada em pilha, no estilo do Forth. Ela não possui laços e recursão, o que a torna deliberadamente incompleta de Turing. Esse design garante que o custo de execução de cada script seja limitado e previsível. Nenhum script pode rodar infinitamente ou consumir recursos ilimitados, protegendo a rede contra ataques de negação de serviço inerentes a códigos de uso geral. A simplicidade permite que qualquer nó valide transações de forma determinística, sem risco de esgotamento de recursos.
- Cada saída possui um script de bloqueio (scriptPubKey) que define as condições para o gasto. O gastador fornece os dados de desbloqueio via scriptSig ou, desde o SegWit, dados de testemunha. A execução empilha dados e aplica opcodes da esquerda para a direita. O gasto é válido se a execução terminar sem erro e deixar um valor verdadeiro no topo da pilha. Esse resultado binário protege os bitcoins sem nunca revelar as chaves privadas, dependendo da verificação criptográfica em vez de verificações de identidade.
- Em 2010, Satoshi Nakamoto desativou vários opcodes, incluindo OP_CAT e OP_MUL, como medida de precaução após a descoberta de bugs, um dos quais (em OP_LSHIFT) podia fazer com que os nós travassem. Uma falha ainda pior estava relacionada à maneira como scriptSig e scriptPubKey eram combinados e executados como um único script: um scriptSig que terminava em OP_RETURN podia concluir sua execução com 'true' antes mesmo que o script de bloqueio fosse executado, permitindo que qualquer pessoa gastasse as moedas de outra pessoa. A primeira correção fez com que OP_RETURN falhasse imediatamente; uma versão posterior foi ainda mais longe e executou scriptSig e scriptPubKey como scripts separados. Essa mudança fortaleceu o modelo de segurança e eliminou operações perigosas que poderiam ser exploradas ou causar comportamentos imprevisíveis.
- OP_RETURN marca uma saída como comprovadamente não gastável. É usado para incorporar pequenas quantidades de dados na cadeia sem criar um caminho válido de gasto. Como nenhuma assinatura pode satisfazer OP_RETURN, as moedas ficam permanentemente bloqueadas, mas os dados associados permanecem como parte da história do blockchain. Como tais saídas nunca podem ser gastas, os nós as excluem do conjunto de moedas utilizáveis.
- Para entender a mecânica, siga passo a passo “2 3 OP_ADD 5 OP_EQUAL” no papel. Comece com uma pilha vazia. Empilhe 2 e, em seguida, empilhe 3. Aplique OP_ADD para remover ambos da pilha e empilhar sua soma (5). Empilhe novamente 5. Aplique OP_EQUAL para comparar os dois itens do topo; como eles coincidem, ele empilha true (1). A pilha termina com um único valor true, satisfazendo o requisito de validade. Esta simples operação aritmética demonstra como os opcodes manipulam a pilha para avaliar condições.
- Abra um explorador de blocos e localize qualquer transação padrão. Identifique o scriptPubKey na seção de saídas, que começa com OP_DUP para uma saída P2PKH legada, OP_0 para SegWit nativo ou OP_1 para Taproot. Em seguida, abra uma transação que gaste tal saída e encontre a assinatura e a chave, no scriptSig para saídas legadas ou no witness para SegWit e Taproot, que a satisfazam, deixando um valor verdadeiro na pilha de execução para todos os nós validadores.
Fatos-chave
- O Bitcoin Script não é Turing-completo; ele não possui laços ou recursão.
- Em 2010, Satoshi desativou o OP_CAT, o OP_MUL e outros opcodes como medida de precaução, após a descoberta de bugs.
- Desde 2010, scriptSig e scriptPubKey são executados separadamente, em vez de serem concatenados.
- OP_RETURN marca uma saída como comprovadamente não gastável para incorporação de dados.
- Um gasto válido deixa um valor verdadeiro no topo da pilha de execução.
- O custo de cada script é limitado devido à falta de computação arbitrária.
Exercício nove, seis, três, um
9ReunirListe 9 opcodes do Bitcoin Script. Indique quais estão desativados, quais modificam diretamente a pilha e quais realizam verificações criptográficas.
6AgruparAgrupe os 9 em 6 por função: aritmética, comparação, manipulação de pilha, verificação criptográfica, incorporação de dados ou obsoleto/removido.
3DestilarReduza os 6 para 3 motivos pelos quais o script foi mantido deliberadamente limitado.
1CristalizarEscreva 1 frase sobre como a execução limitada protege a rede contra scripts maliciosos.
Verificação de fatos
Datas, números e afirmações verificados com as fontes publicadas listadas abaixo.