Visão geral
O Bitcoin Script é a linguagem de programação que alimenta todas as transações Bitcoin. Cada saída de transação contém um script de bloqueio (scriptPubKey) que especifica as condições sob as quais a saída pode ser gasta. Para gastar essa saída, uma transação subsequente deve fornecer um script de desbloqueio (scriptSig) que satisfaça essas condições. O Script é intencionalmente limitado em capacidade para priorizar segurança e previsibilidade.
Como funciona a execução do Script
O Script usa um modelo de execução baseado em pilha onde dados e operadores são processados da esquerda para a direita, empurrando valores para e retirando valores de uma pilha:
Exemplo: Verificação P2PKH (Pay-to-Public-Key-Hash)
Script de desbloqueio (scriptSig): <signature> <public_key>
Script de bloqueio (scriptPubKey): OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
Execução:
Pilha: []
Empurrar <signature> → [sig]
Empurrar <public_key> → [sig, pubKey]
OP_DUP → [sig, pubKey, pubKey]
OP_HASH160 → [sig, pubKey, hash(pubKey)]
Empurrar <pubKeyHash> → [sig, pubKey, hash(pubKey), pubKeyHash]
OP_EQUALVERIFY → [sig, pubKey] (hashes devem coincidir)
OP_CHECKSIG → [true] (assinatura válida)
Filosofia de design
O Script é deliberadamente não Turing-completo: não tem loops e sempre termina. Essa escolha de design previne ataques de negação de serviço e garante que o tempo de execução de cada script possa ser limitado. Embora isso limite a expressividade do Script em comparação com linguagens de contratos inteligentes de uso geral, torna a validação de transações do Bitcoin altamente previsível e segura.
Tipos de script comuns
- P2PKH: Pagamento para um hash de chave pública (endereços legacy começando com 1)
- P2SH: Pagamento para um hash de script (endereços começando com 3), habilitando scripts complexos como multisig
- P2WPKH/P2WSH: Versões SegWit com dados witness separados da transação
- P2TR: Saídas Taproot que podem ser gastas via caminho de chave ou caminho de script
Casos extremos
Um caso extremo notável é o opcode OP_RETURN, que marca uma saída como comprovadamente não gastável. Isso é usado para incorporar pequenas quantidades de dados arbitrários no blockchain sem criar UTXOs não gastáveis que os nós precisam rastrear indefinidamente.