Pular para o conteúdo
buybitcoinsmart

Glossário / Referência do desenvolvedor

OP_EQUAL

O que é o OP_EQUAL?
O OP_EQUAL compara byte a byte os dois itens do topo da pilha e insere um resultado verdadeiro ou falso, e é o último opcode de toda saída pay-to-script-hash.

O byte 0x87 faz a única comparação que o bitcoin realmente precisa: esses dois blocos de bytes são idênticos? A comparação é feita sobre bytes brutos, e não sobre números, e é por isso que a linguagem traz um opcode separado para a igualdade aritmética. Todo pagamento que você já enviou para um endereço que começa com 3 termina seu script com esta única instrução.

Como funciona

Dois itens saem da pilha e um entra no lugar: um único byte 0x01 quando eles coincidem, ou um item vazio quando não coincidem. O bitcoin trata um item vazio como falso, então o resultado pode ser testado por qualquer coisa que venha depois.

A comparação de bytes é mais rígida do que parece. Dois valores que uma pessoa chamaria de mesmo número podem ser sequências de bytes diferentes, e este opcode os considera desiguais. Esse é o comportamento correto para sua função real, que é comparar hashes e pré-imagens, onde qualquer diferença, por menor que seja, deve falhar, e é por isso que resultados aritméticos são comparados com OP_NUMEQUAL.

A propriedade interessante é o que ele não faz: deixa um resultado em vez de agir sobre um. Um script termina com sucesso apenas quando o item que fica no topo é verdadeiro, então um script que termina com este opcode faz uma pergunta e deixa que o resultado valha como resposta. A regra cleanstack do Bitcoin Core acrescenta que nada mais pode ficar para trás, o que, em um gasto de hash de script, significa exatamente um valor verdadeiro e nada mais.

Esse último detalhe tem mais consequências do que parece. Pay-to-script-hash não é uma regra geral sobre scripts com hash; é uma regra sobre um padrão exato de 23 bytes, um opcode de hash, uma inserção de 20 bytes e este opcode no final. Escreva a mesma lógica com a forma combinada de verificação e o tratamento especial não se aplica, o script de resgate nunca é extraído nem executado, e a saída se comporta como um enigma de hash comum que qualquer um que adivinhe a pré-imagem pode gastar.

Onde você o vê

Toda saída não gasta em um endereço que começa com 3 mostra o mesmo assembly de três tokens em um explorador de blocos, terminando aqui. O mesmo vale para todo saque SegWit aninhado que uma corretora já lhe enviou.

Ele também aparece em contratos com bloqueio por hash. Os scripts de pagamento da Lightning calculam o hash de um segredo e comparam o resultado a um valor fixo, e é isso que permite que um pagamento seja liquidado ao longo de vários saltos no momento em que o destinatário revela uma pré-imagem de 32 bytes. As trocas atômicas entre blockchains usam a mesma estrutura.

OP_EQUAL vs OP_EQUALVERIFY

OP_EQUALVERIFY é OP_EQUAL com o teste embutido. O byte 0x88 faz a mesma comparação e então aborta o script imediatamente se a resposta for falsa, sem deixar nada na pilha quando tem sucesso. Escolher entre os dois é uma questão do que vem depois. Use a forma simples quando a comparação é a resposta final do script, como faz o pay-to-script-hash. Use a forma de verificação quando a comparação é uma condição entre várias e a execução deve continuar, como faz o modelo legado de chave única antes de verificar uma assinatura. A forma de verificação também economiza um byte em relação a escrever a comparação e uma instrução de verificação separada, o que importava muito mais quando cada byte de um script ficava na parte da transação que não é a testemunha, a quatro unidades de peso cada um.

Não confundir com

Perguntas frequentes

Qual é a diferença entre OP_EQUAL e OP_EQUALVERIFY?

A forma simples deixa verdadeiro ou falso na pilha para que outra coisa o leia, enquanto a forma de verificação aborta o script imediatamente se os dois itens forem diferentes. O pay-to-script-hash usa a forma simples porque a comparação é a resposta final do script.

Ele compara números ou bytes?

Bytes, sem nenhuma interpretação. Duas codificações que representam o mesmo número são desiguais aqui, o que é exatamente o que se quer ao comparar hashes, e é por isso que as comparações aritméticas usam um opcode separado.

Termos relacionados

Mais em Referência do desenvolvedor

Ler esta página em inglês