OP_RETURN

Armazenando dados na blockchain

Diagrama mostrando a estrutura de um script de travamento OP_RETURN usado para armazenar dados.

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).

Ícone Ferramenta ASCII

ASCII

Converta entre bytes (em hexadecimal) e caracteres ASCII.

0 bytes
Bytes
0 caracteres
  • Os bytes hex entre 0x20 e 0x7f contêm os caracteres imprimíveis.
  • Qualquer valor 0x1f ou abaixo é um caractere de controle (não será exibido, ou exibirá um caractere estranho).
  • Qualquer valor 0x80 ou acima não exibirá nada.

Veja o padrão de codificação ISO 646 para detalhes.

  • 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.

Diagrama mostrando uma saída de transação com um script de travamento OP_RETURN como sendo não gastável.

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:

Diagrama mostrando uma saída de transação com um script de travamento OP_RETURN armazenando alguns dados de texto.

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.

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:

Ícone Ferramenta ASCII

ASCII

Converta entre bytes (em hexadecimal) e caracteres ASCII.

0 bytes
Bytes
0 caracteres
  • Os bytes hex entre 0x20 e 0x7f contêm os caracteres imprimíveis.
  • Qualquer valor 0x1f ou abaixo é um caractere de controle (não será exibido, ou exibirá um caractere estranho).
  • Qualquer valor 0x80 ou acima não exibirá nada.

Veja o padrão de codificação ISO 646 para detalhes.

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
Ícone Ferramenta ASCII

ASCII

Converta entre bytes (em hexadecimal) e caracteres ASCII.

0 bytes
Bytes
0 caracteres
  • Os bytes hex entre 0x20 e 0x7f contêm os caracteres imprimíveis.
  • Qualquer valor 0x1f ou abaixo é um caractere de controle (não será exibido, ou exibirá um caractere estranho).
  • Qualquer valor 0x80 ou acima não exibirá nada.

Veja o padrão de codificação ISO 646 para detalhes.

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 de lançamento do Bitcoin 0.9.0

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.

Recursos