Glossário / Protocolo e atualizações
OP_CAT
- O que é OP_CAT?
- OP_CAT une em um só os dois itens no topo da pilha do script, uma operação que Satoshi desativou em 2010 e que o BIP-347 propõe restaurar dentro do tapscript.
Especificação no BIP-347.
A concatenação parece trivial e não é. Com ela, um script pode remontar o hash de assinatura de uma transação a partir de partes empilhadas, em blocos de no máximo 520 bytes, e então verificar esse hash com uma verificação de assinatura comum. Foi assim que um opcode desligado por ser perigoso se tornou o item mais discutido da lista de covenants.
Como funciona
Status: desativado desde agosto de 2010, quando um lote de opcodes de string e de aritmética foi desligado em uma varredura defensiva do motor de script. O BIP-347 propõe reativá-lo apenas no tapscript. Ele não está ativo na mainnet.
A operação em si é uma linha: desempilhar dois elementos e empilhar seus bytes unidos um após o outro. O motivo de ela ser perigosa em 2010 é que nada limitava o quanto um elemento da pilha podia crescer. Concatenar um elemento consigo mesmo o dobra, então um pequeno laço de empilhamentos e uniões podia inflar alguns bytes até gigabytes e levar junto a memória do nó. O motor moderno tem um limite rígido de 520 bytes para qualquer elemento da pilha, então o BIP-347 simplesmente faz a operação falhar quando o resultado o ultrapassaria, e o ataque antigo desaparece.
Há uma peculiaridade de numeração que torna o retorno excepcionalmente limpo. OP_CAT é o opcode 126. Quando o BIP-342 definiu o tapscript, declarou os opcodes 126 a 129, entre outros, como OP_SUCCESS: encontrar um deles faz o script ter sucesso na hora. Os nós antigos, portanto, já aceitam qualquer tapscript que contenha o byte 126 sem executá-lo. Redefini-lo para fazer concatenação apenas restringe o que esses nós já permitiriam, o que torna a mudança um soft fork e não uma divisão da cadeia.
O que a concatenação libera é desproporcional ao seu tamanho. Um script que consegue construir cadeias de bytes pode verificar uma prova de Merkle, verificar uma assinatura Lamport ou Winternitz construída a partir de hashes em vez de curvas elípticas, e forçar uma assinatura a usar um nonce fixo para que a própria equação da assinatura exponha ao script a transação de gasto. Esse último truque é o que transforma o OP_CAT em uma ferramenta geral de covenants sem nenhum opcode específico de covenant.
Onde ele aparece
O OP_CAT não roda no bitcoin de forma alguma. Os lugares onde ele roda são as sidechains e redes de teste que copiaram o motor de script do bitcoin e depois reverteram a decisão de 2010.
A Elements, e portanto a Liquid, tem o opcode ativado, e é por isso que a maioria das demonstrações publicadas de covenants é escrita para a Liquid e não para o bitcoin. Signets personalizadas que carregam as regras do BIP-347 são o outro ambiente, e existem para que os desenvolvedores possam construir a coisa antes de pedir a alguém que mude o consenso.
Para quem compra ou guarda bitcoins, o conteúdo prático é curto: nada na sua carteira, nos seus endereços ou nos seus backups muda se o OP_CAT for ativado ou se nunca for. Vale a pena conhecer o nome porque ele está no centro de uma divergência real sobre quanta programabilidade o bitcoin deveria ter, e porque propostas de adicionar assinaturas baseadas em hash para um futuro com computadores quânticos tendem a passar por ele.