-
@ Alex Emidio
2024-10-24 23:36:47OP_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