2 min read

Reinstalando o OP_CAT na Linguagem de Script do Bitcoin.

OP_CAT é um opcode simples, mas poderoso, que combina dois valores de entrada em uma saída. Originalmente, ele foi desativado devido a preocupações com problemas de memória, mas as condições mudaram. OP_CAT é um opcode que lida com a concatenação de valores de entrada, unindo dois valores em um. Embora possa parecer simples à primeira vista, suas possibilidades são amplas e intrigantes.

Especificação

O opcode OP_CAT opera abrindo dois elementos da pilha, concatenando-os na ordem em que estão empilhados e empurrando o elemento resultante de volta para a pilha. Dada a pilha [x1, x2], onde x2 está no topo da pilha, o OP_CAT colocará x1 x2 na pilha, onde '' denota concatenação.

Implementação

cpp
if (stack.size() < 2)
return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
valtype vch1 = stacktop(-2);
valtype vch2 = stacktop(-1);

if (vch1.size() + vch2.size() > MAX_SCRIPT_ELEMENT_SIZE)
return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);

valtype vch3;
vch3.reserve(vch1.size() + vch2.size());
vch3.insert(vch3.end(), vch1.begin(), vch1.end());
vch3.insert(vch3.end(), vch2.begin(), vch2.end());

stack.pop();
stack.pop();
stack.push_back(vch3);

Essa implementação é baseada na implementação do OP_CAT em elementos.

O valor de MAX_SCRIPT_ELEMENT_SIZE é 520 bytes.

Notas

O OP_CAT existia na base de código Bitcoin antes do commit "alterações diversas" 4bd188c que o desativou. A implementação original funcionava da seguinte forma:

cpp
// (x1 x2 -- fora)
if (stack.size() < 2)
return false;
valtype& vch1 = stacktop(-2);
valtype& vch2 = stacktop(-1);
vch1.insert(vch1.end(), vch2.begin(), vch2.end());
stack.pop_back();
if (stacktop(-1).size() > 5000)
return false;

Essas informações detalhadas sobre a especificação e a implementação do OP_CAT esclarecem como ele funciona e como as operações são executadas.

OP_CAT não é uma novidade, sendo parte das instruções do Bitcoin Script em versões antigas. Foi desativado devido a preocupações de aumento exponencial de memória na pilha de elementos. No entanto, desde que foi desativado, um tamanho máximo de 512 bytes foi fornecido para elementos de pilha, e isso também é aplicado ativamente hoje no Tapscript, que é o Bitcoin Script na atualização Taproot. O problema daquela época realmente não se aplica aqui, pois um script que desejasse criar elementos acima desse limite seria simplesmente inválido.

OP_CAT possibilita novas opções de assinatura, assinaturas Lamport com segurança quântica, cofres Bitcoin e convênios/CTV que determinam as condições de saída. Isso abre portas para métodos de escalonamento , Confirmação instantânea de transações on-chain , Livre mercado de sidechains, como Ark, e simplifica a implementação de BitVM para contratos inteligentes.

Várias aplicações possíveis para o OP_CAT, como covenants, verificação de provas SPV, proteção contra gastos duplos em transações não confirmadas, tornar o BitVM mais eficiente, realizar aritmética com números grandes, criar vaults e assinaturas resistentes a computadores quânticos.

Para reintroduzir o OP_CAT, seria necessária uma atualização (soft fork) nas regras de consenso do Bitcoin, o que exige planejamento cuidadoso. No entanto, a proposta atual é gerenciável e não apresenta as preocupações anteriores devido às limitações estabelecidas.

O OP_CAT promete ser uma adição valiosa à linguagem de script do Bitcoin, proporcionando um leque de possibilidades interessantes para desenvolvedores e usuários. A reintrodução desse opcode parece promissora, oferecendo um equilíbrio entre esforço e casos de uso potenciais, e ainda há espaço para discussões sobre suas vantagens e desvantagens.

https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2023-October/022049.html

https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2023-October/022049.html

https://github.com/EthanHeilman/op_cat_draft/blob/main/cat.mediawiki

https://medium.com/blockstream/cat-and-schnorr-tricks-i-faf1b59bd298

https://gist.github.com/RobinLinus/9a69f5552be94d13170ec79bf34d5e85