The part of a Bitcoin transaction that can carry your own bytes.
OP_RETURN is an instruction in Bitcoin's scripting language that marks a
transaction output as unspendable. Because nobody will ever need to
spend it, the space after the instruction is free for anything you like — a sentence,
a hash, a receipt, a small picture. The data is not a link and not a fingerprint: the
bytes themselves sit inside a real Bitcoin transaction, in every copy of the
blockchain, for as long as Bitcoin exists.
A transaction output normally says who may spend this money. An
OP_RETURN output says nobody may spend this, and here are some bytes.
It usually carries 0 sats of value — you are paying for the space it takes up in a
block, not putting coins into it.
People wrote data into Bitcoin long before OP_RETURN did, by hiding it in
fake payment addresses. Those outputs look spendable, so every node has to keep them
in memory forever, in the set of unspent outputs it checks against. That set is the
expensive part of running a node, and junk in it never goes away.
OP_RETURN was the answer: a way to say this is data, not money
that a node can recognise and discard. It fails the script immediately, so the output
is provably unspendable and never enters the set a node must keep.
Writing data this way is the polite version of something people were going to do
regardless.
More than most pages on the internet will tell you, because the answer changed recently. The 80-byte figure you will find everywhere was never a rule of Bitcoin itself — it was relay policy, a default each node operator can set, deciding which transactions a node passes on to its peers.
So a message of a few kilobytes is standard today, and a small picture genuinely fits.
What has not changed is that relay policy is a choice: a node running an older
version, or a deliberately stricter configuration, may still refuse to pass on anything
over 83 bytes. A large OP_RETURN is standard, not guaranteed — it needs
nodes that will relay it and a miner willing to include it.
You are buying block space, so the price is the size of the whole transaction multiplied by the fee rate you choose. Every byte of your message is a byte of that size, which makes the cost close to linear in message length. These are real quotes from this service — a single input, a change output, and the flat 2,000-sat SatWire fee included:
| Message | OP_RETURN output | At 2 sat/vB | At 10 sat/vB |
|---|---|---|---|
| 20 bytes — a few words | 31 vB | 2,282 sats | 3,410 sats |
| 80 bytes — the old limit | 92 vB | 2,404 sats | 4,020 sats |
| 200 bytes — a paragraph | 212 vB | 2,644 sats | 5,220 sats |
| 1,000 bytes — a long note | 1,015 vB | 4,250 sats | 13,250 sats |
| 20,000 bytes — a picture | 20,015 vB | 42,250 sats | 203,250 sats |
The fee rate is yours to pick. 2 sat/vByte is the floor this service will sign at; a higher rate buys a place in an earlier block, not a better message.
Open any transaction in a block explorer and look at its outputs. An
OP_RETURN output shows 0 BTC and a script that starts with
OP_RETURN, followed by the payload — usually displayed as hex, with the
readable text beside it if the bytes happen to be text. Nothing is hidden and no tool
of ours is involved: the data is a public part of the transaction, and anyone who
pulls the raw transaction from their own node can decode it.
OP_RETURN shows
that these bytes existed by this block. It says nothing about whether they are
accurate, or who really wrote them.
Yourself. With your own node and a wallet that will build a raw
transaction, you add an output with an OP_RETURN script, fund it, sign it
and broadcast. This is the cheapest route — you pay only the network fee — and it is
fiddly enough that mistakes cost real money: an under-paid fee, a mis-sized push, or a
transaction no node will relay.
Or use SatWire. You type the message, we quote the whole cost up front, you pay a one-off address from any wallet, and we build, sign and broadcast the transaction and hand you the transaction id. No account, no signup, and a flat 2,000-sat fee on top of the network fee. Text up to 1,000 bytes, pictures up to 20,000.
Write a message on the blockchain →
Aiming one at somebody else's address is a slightly different job — it needs a payment alongside the text: how to send a message to a Bitcoin address →