Blockchain/Nível IV · Protocolo a fundo/4.2 Atualizações/Lição 2
Tapscript e árvores de script (MAST)
A árvore que esconde o contrato
MateriaisUm explorador de blocos com capacidade de inspeção de dados de testemunhaUma carteira compatível com Taproot que suporta árvores de scriptsPapel milimetrado para desenhar árvores Merkle binárias
Curiosidade
- Por que gastar segundo uma cláusula específica de um contrato deveria revelar todo o contrato?
- O que faz com que uma assinatura cooperativa seja indistinguível de uma assinatura simples?
- Como uma única chave pode comprometer toda uma biblioteca de condições ocultas de gastos?
Explorar
- As árvores de sintaxe abstrata Merkleizadas (MAST) foram descritas pela primeira vez por Russell O’Connor em 2013 e desenvolvidas em propostas em 2016 e 2017. O conceito consiste em inserir condições alternativas de gasto em uma árvore Merkle, permitindo que o gastador revele apenas o ramo específico que está utilizando. Enquanto o termo “árvore de sintaxe abstrata” se referia a estruturas de compiladores nas quais cada condição criava um novo nó, a implementação do Bitcoin evoluiu de maneira diferente. Anthony Towns cunhou posteriormente o backronym “Merklized Alternative Script Tree” para descrever a estrutura efetivamente adotada: um conjunto de scripts completos e independentes, dos quais apenas um é selecionado no momento do gasto.
- O Taproot integrou essa estrutura de árvore nas regras de consenso por meio do BIP341. Cada folha da árvore Merkle contém um script, e a raiz dessa árvore contribui para a chave de saída final. Quando os fundos são gastos pelo “caminho do script”, o gastador revela o script específico da folha, seus inputs e a prova Merkle – os hashes dos nós irmãos em cada nível. Os galhos não utilizados permanecem ocultos na cadeia, preservando a privacidade para arranjos complexos como multisig ou timelocks, que anteriormente eram forçados a usar estruturas P2SH.
- Tapscript (BIP342) é o dialeto específico utilizado para esses scripts de folha, divergindo do Bitcoin Script legado em vários aspectos cruciais. OP_CHECKMULTISIG está desativado no tapscript. Seu substituto, OP_CHECKSIGADD, verifica uma assinatura contra uma chave e soma 1 a um contador; uma assinatura vazia não adiciona nada, enquanto uma inválida e não vazia faz com que todo o script falhe; um script encadeia uma verificação por chave e compara o valor do contador com o limite. Cada assinatura é associada a uma chave conhecida, portanto não há necessidade de tentativas sucessivas para encontrar a correspondência, e as assinaturas podem ser verificadas em lote.
- O Tapscript também reserva espaço para atualizações com códigos de operação OP_SUCCESS: hoje, qualquer script que contenha um deles funciona sem condições, por isso ninguém os utiliza, e um futuro soft fork pode atribuir a eles significados mais restritivos sem invalidar nada que esteja em uso. O limite antigo de 10.000 bytes para o tamanho dos scripts é removido no Tapscript; em vez disso, o tamanho do script é limitado apenas pelo peso do bloco e pelos limites estabelecidos pelas políticas. Além disso, o orçamento destinado às operações de assinatura aumenta conforme o tamanho do “witness”, evitando ataques de negação de serviço por meio da verificação excessiva de assinaturas.
- Considere um exemplo prático: um usuário possui fundos em um caminho de chave 2-de-2 para despesas cotidianas, onde ambas as partes assinam de forma cooperativa para revelar apenas uma assinatura Schnorr padrão. No entanto, a árvore de scripts inclui uma folha oculta que permite que uma única chave gaste os fundos após um período de bloqueio de um ano. Se o parceiro cooperativo deixar de responder, o usuário pode ativar esse ramo de recuperação. A prova Merkle revela apenas aquele script específico relacionado ao bloqueio temporal, mantendo outros ramos potenciais — como recuperação social ou hashlocks — completamente privados.
- Para verificar essas mecânicas, abra um explorador de blocos e localize uma transação Taproot gasta por meio do caminho do script. Inspecione o “witness”: as entradas do script, o próprio script folha e um bloco de controle cujo primeiro byte combina a versão da folha (0xc0 para tapscript) com um bit de paridade, seguido pela chave interna e um hash de 32 bytes por nível da árvore. Compare isso com um gasto por meio do caminho da chave do mesmo tipo de endereço; este último revela apenas uma assinatura de 64 ou 65 bytes e nenhum dado do script, demonstrando como contratos complexos permanecem invisíveis quando não são utilizados.
Fatos-chave
- MAST significa Merklized Alternative Script Tree, um backronym cunhado por Anthony Towns para descrever a estrutura do Taproot.
- O Tapscript remove o limite antigo de tamanho do script de 10.000 bytes, restringindo os scripts apenas pelo peso do bloco e pela política.
- OP_CHECKSIGADD em tapscript substitui OP_CHECKMULTISIG para verificações de limite compatíveis com loteamento.
- O path do script revela o script filho, suas entradas e uma prova Merkle dos hashes dos irmãos.
- OP_SUCCESS os códigos OP reservam espaço para futuros soft forks sem quebrar os tapscripts existentes.
- A versão da folha 0xc0 indica TapScript; as versões desconhecidas da folha permanecem sem restrições para futuros soft forks.
Exercício nove, seis, três, um
9ReunirListe 9 condições de gasto distintas (por exemplo, multisig, timelock, hashlock) que poderiam ser inseridas em uma árvore de scripts Taproot. Indique o propósito principal de cada condição.
6AgruparAgrupe as 9 condições em 6 categorias com base em suas implicações de privacidade: totalmente ocultas, parcialmente reveladas, sempre visíveis ou outras restrições estruturais.
3DestilarReduza os 6 grupos a 3 razões principais pelas quais esconder ramificações específicas de scripts é importante para a eficiência da cadeia e a segurança do usuário.
1CristalizarEscreva 1 frase explicando como uma árvore Merkle permite que uma única chave pública se comprometa com várias regras de gasto mutuamente exclusivas sem revelá-las.
Verificação de fatos
Datas, números e afirmações verificados com as fontes publicadas listadas abaixo.
- BIP341: Taproot: SegWit version 1 spending rules
- BIP342: Validation of Taproot Scripts
- Bitcoin Optech, 'MAST' and 'Tapscript' topics
- Anthony Towns, 'Merklized Alternative Script Trees' proposal discussions