Glossário / Referência do desenvolvedor
OP_DUP
- O que é OP_DUP?
- OP_DUP copia o item do topo da pilha para que ele possa ser usado duas vezes, e é por isso que o script padrão pay-to-public-key-hash consegue tanto calcular o hash da sua chave pública quanto verificar contra ela.
Um byte, 0x76, e uma única tarefa. O Script do Bitcoin não tem variáveis, apenas uma pilha, então um item consumido por uma instrução já desapareceu antes de a próxima ser executada, e a duplicação é a única forma de reutilizá-lo. É o primeiro dos quatro opcodes operacionais no script de 25 bytes que protegia quase todos os endereços de bitcoin que começam com 1.
Como funciona
A duplicação é necessária porque a verificação precisa da mesma chave pública para dois fins incompatíveis. A saída tinha apenas o compromisso com um hash, então a chave precisa ser submetida a hash e comparada para provar que é a chave correta. A verificação de assinatura, então, precisa da própria chave, que a comparação teria consumido.
Acompanhe um gasto legado passo a passo. Os dados de quem gasta chegam à pilha como uma assinatura com uma chave pública acima dela. OP_DUP faz uma segunda cópia da chave. OP_HASH160 substitui a cópia pelo seu resumo de 20 bytes. A saída empilha os 20 bytes comprometidos, OP_EQUALVERIFY consome ambos e aborta todo o script em qualquer divergência, e OP_CHECKSIG fica diante da chave original e da assinatura, exatamente o que precisa. Cinco passos, sem ramificações, sem laços, e um custo fixo todas as vezes.
O opcode conta para dois tetos sem fazer nada caro. É uma das 201 instruções operacionais que um script anterior ao Taproot pode conter, e a cópia que ele faz conta para o limite de 1.000 itens entre as pilhas. Nenhum dos dois importa para um gasto de chave única e ambos importam em um script que duplica dentro de uma cadeia de condições sem laços.
Onde você o vê
Observe qualquer transação que gaste um endereço que começa com 1 e o script de saída começa com OP_DUP. Os exploradores o exibem como o primeiro token do assembly.
Mais interessante é onde ele é executado sem aparecer. Uma saída SegWit nativa de chave única não contém lógica alguma, apenas um byte de versão e um hash de 20 bytes, mas o BIP-141 diz ao nó para construir o modelo clássico a partir desse hash e executá-lo de qualquer forma. Assim, o opcode ainda dispara em cada gasto P2WPKH da rede e não aparece em lugar algum do bloco. Você obtém o comportamento sem pagar as quatro unidades de peso que o byte costumava custar.
As saídas de hash de script e os gastos por caminho de chave do Taproot o ignoram por completo. Uma saída P2SH compara um hash diretamente, e um gasto por chave do Taproot verifica uma assinatura contra a chave de saída sem envolver script algum. Esta é a menor ilustração possível do que o SegWit e o Taproot realmente fizeram: não tanto capacidades novas, mas as mesmas verificações organizadas de modo que a cadeia tenha de carregar menos bytes para obtê-las.