Pular para o conteúdo
buybitcoinsmart

Glossário / Referência do desenvolvedor

OP_EQUALVERIFY

O que é OP_EQUALVERIFY?
OP_EQUALVERIFY compara os dois itens do topo da pilha e encerra o script imediatamente se eles forem diferentes, e é assim que um gasto legado prova que apresentou a chave pública correta.

O byte 0x88 é o ponto de verificação no meio do modelo de script mais antigo do bitcoin. Ele não deixa nada para trás quando é aprovado e interrompe a execução na hora quando falha, então uma entrada que fornece a chave errada não produz um pagamento falho, produz uma transação inválida que nenhum nó vai retransmitir. Se sua carteira assinou com a chave correta ou não, isso geralmente é decidido aqui.

Como funciona

OP_EQUALVERIFY retira dois itens da pilha, compara-os byte a byte e continua em silêncio ou encerra o script.

Quando ele é executado em um gasto legado, a pilha contém duas cadeias de 20 bytes. Uma é a impressão digital que a saída fixou quando os bitcoins chegaram, possivelmente anos antes. A outra é a impressão digital da chave pública que quem gasta acabou de fornecer. Um único bit diferente nesses 20 bytes encerra a avaliação, e não há recuperação: o Script do Bitcoin não tem tratamento de exceções nem segunda tentativa.

O sucesso não empilha nada de volta. Essa é toda a razão de a forma fundida existir, e é por isso que o script pay-to-public-key-hash de 25 bytes pode terminar em uma verificação de assinatura em vez de em um booleano restante que ninguém quer. O interpretador do Bitcoin Core implementa a fusão literalmente, executando o caso de comparação e depois passando direto para o caso geral de asserção, de modo que os dois são um só caminho de código e não dois caminhos parecidos.

O padrão se repete por toda a linguagem. Todo opcode VERIFY fundido fica exatamente um byte acima de seu equivalente simples: 0x87 e 0x88 para igualdade, 0xac e 0xad para verificação de assinatura, 0xae e 0xaf para o antigo opcode de multiassinatura. Onde uma condição precisa ser verdadeira antes que qualquer outra coisa possa acontecer, os autores de scripts recorrem ao byte mais alto.

Onde você o encontra

O lugar mais claro para encontrar OP_EQUALVERIFY é uma mensagem de rejeição, e não um explorador de blocos.

Transmita uma transação assinada com uma chave que não corresponde ao endereço e o Bitcoin Core responde com mandatory-script-verify-flag-failed, nomeando a operação OP_EQUALVERIFY que falhou no parêntese que segue. Na prática, esse erro quase sempre significa uma coisa: o dispositivo de assinatura derivou sua chave de um caminho diferente ou de uma frase de recuperação diferente da que é dona dos bitcoins. Restaurar uma carteira sob o caminho de derivação errado e depois tentar gastar produz exatamente isso.

Scripts decodificados também mostram isso claramente. Qualquer saída que paga a um endereço que começa com 1 é renderizada como um script de cinco tokens com este opcode em quarto lugar, e bitcoin-cli decodescript imprime o mesmo assembly para um script de resgate que você colar.

OP_EQUALVERIFY vs OP_VERIFY

OP_EQUALVERIFY é um teste específico com uma asserção soldada a ele, e OP_VERIFY é a asserção sozinha. A forma geral, byte 0x69, não sabe nada sobre o que produziu o valor que examina; ela retira um único item e exige que esse item seja verdadeiro. OP_EQUALVERIFY realiza a comparação e a exigência juntas em um único byte, e é por isso que os dois raramente são escritos separadamente. Recorra à forma geral quando a condição vem de aritmética, de uma verificação de timelock ou de um teste de pré-imagem que não é uma igualdade simples. Recorra à forma fundida sempre que a pergunta for realmente se duas cadeias de bytes coincidem, o que em um gasto de chave única é sempre o caso.

Não confundir com

Perguntas frequentes

O que significa o erro de OP_EQUALVERIFY ao transmitir uma transação?

Significa que a chave pública fornecida pela sua carteira não resulta no hash que a saída fixou, de modo que a assinatura nem chegou a ser verificada. Quase sempre a carteira que assina está no caminho de derivação errado ou foi restaurada a partir da frase de recuperação errada.

Por que não escrever simplesmente OP_EQUAL seguido de OP_VERIFY?

Ele se comporta de forma idêntica e custa um byte a mais. O opcode fundido existe porque esse par de comparação e aborto aparece em cada saída legada de chave única, e um byte por entrada se acumula ao longo de toda a cadeia.

Termos relacionados

Mais em Referência do desenvolvedor

Ler esta página em inglês