OP_RETURN
Armazenando dados na blockchain
OP_RETURN refere-se a um tipo de script de travamento padrão que pode ser usado para armazenar dados dentro de transações.
O opcode OP_RETURN em si encerra imediatamente a execução do script e o marca como inválido.
Embora seja um opcode próprio que pode ser usado em vários scripts diferentes, o nome "OP_RETURN" também é usado para se referir a um padrão de script padrão usado para armazenar dados arbitrários dentro de transações.
Esta página cobre o padrão de script de travamento OP_RETURN.
Este script de travamento não pode ser destravado. Não trave nenhuma quantidade de bitcoins usando este padrão de script.
Isso às vezes é chamado de script "nulldata". Mas, embora esse seja o termo tecnicamente correto, ele não é muito usado, e é por isso que me refiro a este script de travamento como "OP_RETURN".
Uso
Como um script OP_RETURN funciona?
ScriptPubKey
O script de travamento padrão OP_RETURN contém apenas o opcode OP_RETURN seguido de um ou mais empilhamentos de dados.
ASM
OP_RETURN
OP_PUSHBYTES_11
68656c6c6f20776f726c64 Hex
6a0b68656c6c6f20776f726c64 Transação: 6dfb16dd580698242bcfd8e433d557ed8c642272a368894de27292a8844a4e75 (Saída 2)
Esses empilhamentos de dados podem conter quaisquer bytes que você quiser.
São comumente usados para armazenar strings de texto codificadas em ASCII (veja os exemplos).
ASCII
- Você só pode usar opcodes de empilhamento de dados.
- A saída precisa ter um valor de 0 satoshis. Se você incluir uma quantidade de bitcoins na saída, ela será considerada não padrão e não será retransmitida pelos nós. Isso serve para te proteger de perder bitcoins ao travá-los em um script de travamento não gastável.
ScriptSig
Um script de travamento OP_RETURN é não gastável, então não há ScriptSig que possa destravá-lo.
Então, em última análise, as saídas com o script de travamento OP_RETURN só existem para armazenar bytes de dados arbitrários, e nunca podem ser usadas como entradas em transações futuras:
Limites
Quantos dados você pode armazenar em um OP_RETURN?
Não há limite para a quantidade de dados que você pode armazenar dentro de um script padrão OP_RETURN. O único fator limitante é o tamanho máximo de uma transação padrão.
Dentro de cada script OP_RETURN você pode incluir múltiplos empilhamentos de dados. Por exemplo:
ASM
OP_RETURN
OP_PUSHBYTES_15
6c6561726e6d6561626974636f696e Hex
6a0f6c6561726e6d6561626974636f696e Transação: 293af55e572c95ef769bc3fbb4084cb1e4c95f143ce30d923dde26a123c158de (Saída 1)
Tamanho total = 17 bytes (1 × empilhamento de 15 bytes)
ASM
OP_RETURN
OP_PUSHBYTES_15
6c6561726e6d6561626974636f696e
OP_PUSHBYTES_15
6c6561726e6d6561626974636f696e Hex
6a0f6c6561726e6d6561626974636f696e0f6c6561726e6d6561626974636f696e Transação: 500d993b94d13c8e0969ac7f1e7590a5af622f9a6a5d25f98e31801790f99ff5 (Saída 1)
Tamanho total = 33 bytes (2 × empilhamento de 15 bytes)
ASM
OP_RETURN
OP_PUSHBYTES_15
6c6561726e6d6561626974636f696e
OP_1
OP_2
OP_3
OP_4 Hex
6a0f6c6561726e6d6561626974636f696e51525354 Transação: 9aa48ce6b9045d5cd29398272502325255d731ddb97dc207f30d14f35628ed08 (Saída 1)
Tamanho total = 21 bytes (1 × empilhamento de 15 bytes + 4 × empilhamentos de número único)
Nota: os opcodes individuais OP_N também contam como empilhamentos de dados, então também podem ser usados dentro de um script padrão OP_RETURN.
Empilhamento de dados único
Quantos dados você pode armazenar em um único empilhamento?
Um opcode de empilhamento de dados de 1 byte (ou seja, OP_PUSHBYTES_X) só consegue empilhar até 75 bytes de cada vez. Por exemplo:
ASM
OP_RETURN
OP_PUSHBYTES_75
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c6561726e6d6561626974636f696e Hex
6a4b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c6561726e6d6561626974636f696e Transação: 2033435de7ce307341231e818ed937cd3a5e8597381fd83a7e5b0234f61b38d3 (Saída 1)
Tamanho total = 77 bytes (1 × empilhamento de 75 bytes)
Então, se você quiser usar um único empilhamento de 76 bytes ou mais, precisa usar um opcode como OP_PUSHDATA1 (veja empilhamentos de dados para detalhes):
ASM
OP_RETURN
OP_PUSHDATA1
50
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c6561726e6d6561626974636f696e Hex
6a4c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c6561726e6d6561626974636f696e Transação: 2033435de7ce307341231e818ed937cd3a5e8597381fd83a7e5b0234f61b38d3 (Saída 1)
Tamanho total = 83 bytes (1 × empilhamento de 80 bytes)
Nota: o opcode OP_PUSHDATA1 permite incluir um empilhamento de dados entre 76 e 255 bytes.
Nota: o 0x50 após o OP_PUSHDATA1 é usado para indicar os 80 bytes que virão a seguir.
Para empilhamentos de dados ainda maiores, você precisaria usar OP_PUSHDATA2 (que permite um empilhamento entre 256 e 65535 bytes) ou OP_PUSHDATA4 (que permite um empilhamento entre 65536 e 4294967295 bytes).
Histórico
Como o tamanho máximo de armazenamento de dados do OP_RETURN mudou ao longo do tempo?
O script OP_RETURN foi introduzido pela primeira vez como um script padrão no Bitcoin v0.9.0.
- Bitcoin v0.9.0 (março de 2014) — Permitia um único empilhamento de dados de até 40 bytes.
- Apenas uma saída OP_RETURN era permitida por transação.
- O limite foi inicialmente definido em 80 bytes (pull request #2738), mas foi reduzido para 40 bytes (pull request #3737) pouco antes do lançamento da v0.9.0.
- Bitcoin v0.11.0 (julho de 2015) — Permitia um único empilhamento de dados de até 80 bytes.
- Apenas uma saída OP_RETURN era permitida por transação.
- Veja a pull request #5286
- Bitcoin v0.12.0 (fevereiro de 2016) — Permitia múltiplos empilhamentos de dados, mas com um tamanho total de script de no máximo 83 bytes.
- Apenas uma saída OP_RETURN era permitida por transação.
- Embora o limite tenha sido alterado para um tamanho total de script de 83 bytes, devido à sobrecarga dos opcodes de empilhamento de dados precedentes, o tamanho máximo para um único empilhamento de dados ainda era limitado a 80 bytes.
- Bitcoin v30.0 (outubro de 2025) — Limite removido. O tamanho dos scripts OP_RETURN agora é limitado apenas pelo tamanho máximo de uma transação padrão.
- Múltiplas saídas OP_RETURN agora são permitidas por transação.
- Veja a pull request #32406
Exemplos
Onde você pode encontrar scripts OP_RETURN?
Qualquer um pode usar um script OP_RETURN para armazenar alguns dados em uma transação, e você pode encontrá-los espalhados pela blockchain:
ASCII
Exemplo 1 — hello world
ASM
OP_RETURN
OP_PUSHBYTES_11
68656c6c6f20776f726c64 Hex
6a0b68656c6c6f20776f726c64 Transação: 6dfb16dd580698242bcfd8e433d557ed8c642272a368894de27292a8844a4e75 (Saída 2)
Exemplo 2 — charley loves heidi
ASM
OP_RETURN
OP_PUSHBYTES_19
636861726c6579206c6f766573206865696469 Hex
6a13636861726c6579206c6f766573206865696469 Transação: 8bae12b5f4c088d940733dcd1455efc6a3a69cf9340e17a981286d3778615684 (Saída 0)
Exemplo 3 — Amazing!
ASM
OP_RETURN
OP_PUSHBYTES_8
416d617a696e6721 Hex
6a08416d617a696e6721 Transação: 2cf4f1ab0df25610231a0f4fb7e1e18720a6c555f102b75bb115e99b1ad41241 (Saída 2)
Exemplo 4 — First OPReturn Message I was here :)
ASM
OP_RETURN
OP_PUSHBYTES_36
4669727374204f5052657475726e204d6573736167652049207761732068657265203a29 Hex
6a244669727374204f5052657475726e204d6573736167652049207761732068657265203a29 Transação: b33c1252ddc2fdb5396c7dc3ceed3749c587e3310c6df2f3605a38cc3c129e1f (Saída 1)
Exemplo 5 (Compromisso wTXID)
Desde a atualização Segregated Witness, o script de travamento OP_RETURN é usado dentro da transação coinbase para armazenar o Compromisso wTXID:
ASM
OP_RETURN
OP_PUSHBYTES_36
aa21a9ed6502e8637ba29cd8a820021915339c7341223d571e5e8d66edd83786d387e715 Hex
6a24aa21a9ed6502e8637ba29cd8a820021915339c7341223d571e5e8d66edd83786d387e715 Transação: 2d4cdcd29d0004c762790b579bc2541da788f042031fa87fc27e402244080394 (Saída 1)
Este empilhamento de dados não é texto codificado em ASCII. É apenas um monte de bytes, então não há nada interessante a ser encontrado convertendo-o para ASCII.
Se você quiser encontrar scripts OP_RETURN na blockchain, procure por saídas com valores de quantia zero. Isso porque os scripts OP_RETURN são não gastáveis, então quase sempre são colocados em saídas "vazias".
Propósito
Por que temos scripts OP_RETURN?
O OP_RETURN foi introduzido como um script de travamento padrão no Bitcoin 0.9.0 como um compromisso para permitir que as pessoas incluíssem dados arbitrários dentro de transações.
Veja bem: antes de o OP_RETURN estar disponível, as pessoas adicionavam dados às transações usando os scripts de travamento padrão já existentes. Por exemplo, veja como eu poderia armazenar a string de texto "learnmeabitcoin" no lugar onde iria o hash de chave pública em um script de travamento P2PKH padrão:
ASM
OP_DUP
OP_HASH160
OP_PUSHBYTES_20
00000000006c6561726e6d6561626974636f696e
OP_EQUALVERIFY
OP_CHECKSIG Hex
76a91400000000006c6561726e6d6561626974636f696e88ac
ASCII
Isso funciona, mas o problema dessa abordagem é que não há como um nó do Bitcoin saber que a saída é não gastável, então ela seria armazenada no banco de dados de UTXOs para sempre (o que é um desperdício permanente de RAM).
É aqui que entra o script de travamento OP_RETURN:
ASM
OP_RETURN
OP_PUSHBYTES_15
6c6561726e6d6561626974636f696e Hex
6a0f6c6561726e6d6561626974636f696e Este script contém OP_RETURN, o que significa que ele é comprovadamente não gastável e, portanto, não precisa ser armazenado no banco de dados de UTXOs (o que economiza espaço precioso de RAM enquanto o Bitcoin está em execução).
Usar a blockchain para armazenamento de dados não é o ideal, mas você não consegue impedir as pessoas de fazê-lo. Portanto, o script OP_RETURN funciona como uma alternativa mais razoável para o armazenamento de dados do que os métodos anteriores.
Houve alguma confusão e mal-entendido na comunidade a respeito do recurso OP_RETURN na 0.9 e dos dados na blockchain. Essa mudança não é um endosso ao armazenamento de dados na blockchain. A mudança do OP_RETURN cria uma saída comprovadamente podável (prunable), para evitar esquemas de armazenamento de dados — alguns dos quais já estavam implantados — que estavam armazenando dados arbitrários, como imagens, em saídas de transação eternamente não gastáveis, inchando o banco de dados de UTXOs do bitcoin.
Notas
O OP_RETURN precisa ser avaliado para que um script falhe.
A presença do opcode OP_RETURN em um script não o torna automaticamente inválido.
Por exemplo, no script abaixo o OP_RETURN está em um ramo que nunca será avaliado, e por isso o script é válido:
OP_1 OP_IF OP_1 OP_ELSE OP_RETURN OP_ENDIF Você pode ver um exemplo desse script em ação (embrulhado dentro de um P2SH) aqui.
Obrigado ao Vincenzo Iovino por apontar isso para mim.