OP_DROPProtocol

Carrier comparison

Four ways to put data on Bitcoin

OP_DROP is one of a small number of protocols Bitcoin Universe designed rather than adopted, so it has to earn its place next to the carriers that already work. This page states the trade honestly, including the cases where you should not use it.

Attribution. OP_RETURN is a Bitcoin Core feature, not a protocol of this organisation. Witness envelopes are the construction popularised by the Ordinals project. Bitcoin Stamps originated outside Bitcoin Universe. OP_DROP is a Bitcoin Universe design. Relay and standardness behaviour described below is node policy, which varies by implementation, version, and operator configuration, and is not consensus.

Where the bytes live

Every carrier answers the same question differently: which part of the transaction holds the data, and what does that part cost.

Where each carrier stores its payload inside a Bitcoin transaction Four transaction diagrams side by side. OP_RETURN places the payload in an output script, weighted at four weight units per byte and never entering the UTXO set. A witness envelope places the payload in witness data at one weight unit per byte, inside a branch that is skipped. OP_DROP places the payload in witness data at one weight unit per byte, inside code that runs and then discards it. Stamps places the payload in spendable-looking outputs that stay in the UTXO set permanently. OP_RETURN inputs + witness output script payload here change output 4 weight units per byte Unspendable, so no UTXO entry. One transaction. Witness envelope witness payload inside OP_IF, skipped P2TR output commit tx before 1 weight unit per byte Not in UTXO set, discarded if pruned. Two transactions. OP_DROP witness payload pushed, then dropped P2TR anchor out commit tx before 1 weight unit per byte Anchor output does enter the UTXO set. Two transactions. Stamps inputs + witness many outputs payload here change output 4 weight units per byte Stays in the UTXO set by design. One transaction. Witness bytes are cheaper because segregated witness counts them at one weight unit instead of four.
The four carriers put data in three different places. That single choice determines cost, prunability, and how node relay policy treats the transaction.

Property matrix

Carrier properties
PropertyOP_RETURNWitness envelopeOP_DROPStamps
Data location Output scriptTapscript leaf, unexecuted branchTapscript leaf, executed pushesOutput scripts (bare multisig)
Weight per data byte 4114
Transactions needed 12 (commit, reveal)2 (commit, reveal)1
Enters the UTXO set No No for the data; the reveal output does Anchor output does Yes, permanently
Survives node pruning No No No Yes
Practical payload size Historically 80 bytes by default relay policy Effectively block-sized, chunked into 520-byte pushes 256 bytes per push; one JSON object per leaf Limited by fee tolerance and output count
Data is executed Never, the output is provably unspendable Never, the branch is skipped Yes, pushed then dropped Never in practice
Conditional opcodes used NoneOP_IF / OP_ENDIFNoneNone
Data readable without the spend Yes, visible the moment it confirms No, only after the reveal No, only after the reveal Yes
Ecosystem tooling Universal Broad Bitcoin Universe only Stamps ecosystem

Cost, worked out

Take a 54-byte payload, the exact size of the OP_DROP mint event {"p":"op-drop","op":"mint","tick":"drop","amt":"1000"}, and price it four ways. Assumptions are stated so you can check the arithmetic: one Taproot key-path input, Taproot outputs, one change output where the carrier needs one, no consolidation, and no wallet-specific padding.

Approximate cost for the same 54-byte payload
CarrierTransactionsTotal vsizeRelativeNotes
OP_RETURN1~165 vB1.0x Cheapest for a small payload. The data output carries no value and creates no UTXO.
OP_DROP2~315 vB~1.9x Reveal alone is 160 vB (637 weight units: 94 base bytes, 259 witness bytes). The commit transaction adds roughly 155 vB.
Witness envelope2~310 vB~1.9x Nearly identical to OP_DROP at this size. The envelope wins as payloads grow, because it chunks at 520 bytes per push instead of 256.
Stamps1~230 vB~1.4x Plus a permanent cost every node pays forever: the outputs stay in the UTXO set.

The OP_DROP figures come from the exact leaf scripts on the test vectors page and are reproduced by the builder. The other three are estimates for comparison, not authoritative figures for those protocols.

Against OP_RETURN

OP_RETURN is the carrier Bitcoin Core built on purpose. An output whose script begins with OP_RETURN is provably unspendable, so nodes drop it from the UTXO set immediately. Nothing about OP_DROP beats that property.

OP_RETURN against OP_DROP
DimensionOP_RETURNOP_DROP
Size limitA relay-policy limit, historically 80 bytes of data by default in Bitcoin Core, with one such output per transaction. Bitcoin Core relaxed those defaults in its 2025 release line, and other implementations and older nodes still apply the old limits. Consensus itself does not impose 80 bytes.A protocol limit of 256 bytes per push, enforced by the OP_DROP decoder rather than by any node.
PrunabilityBest available. Never in the UTXO set.Worse. Each event's reveal creates a spendable P2TR anchor output that does enter the UTXO set until spent.
StandardnessExplicitly recognised by node policy, with a dedicated configuration switch.Not recognised by anything. It relies only on ordinary Taproot script-path spending, which is standard, but no node has a concept of OP_DROP.
Cost per byte4 weight units.1 weight unit, so roughly a quarter of the marginal cost, offset by needing a second transaction.
Time to readabilityImmediate. The data is in the transaction that confirms.Delayed. Nothing is readable until the commit output is spent in the reveal.
Payload framingNone. The bytes are whatever you put there.A fixed grammar with a marker, a declared content type, and a digest that must match.

Use OP_RETURN instead when the payload fits comfortably inside your target relay policy, one transaction matters more than marginal fee, and you want the data visible without a second step.

Against witness envelopes

The Ordinals-style envelope wraps content in OP_FALSE OP_IF ... OP_ENDIF inside a Taproot leaf. Execution reaches OP_IF, sees false, and skips everything until OP_ENDIF. The content is committed and provable, and it never touches the stack.

OP_DROP and the envelope live in the same place at the same price. The difference is the mechanism and the shape.

Witness envelope against OP_DROP
DimensionWitness envelopeOP_DROP
MechanismData is skipped by a conditional branch.Data is pushed and removed by an opcode that runs.
Conditional opcodesRequires OP_IF and OP_ENDIF.None. Every element in the leaf executes in order.
Chunk size520 bytes per push, so fewer opcodes per kilobyte.256 bytes per push, so more overhead per kilobyte.
Payload sizePractically unbounded, up to block weight.One JSON object of at most 256 bytes for a token event. An optional image attachment chunks up to 256 KiB, at 256 bytes per chunk.
GrammarFlexible. Fields, metadata, and pointers vary by version and by implementation.Fixed. Five fields, a required order, a required digest, and a byte-exact rebuild check.
EcosystemWidely indexed and widely supported by wallets and marketplaces.Indexed only by Bitcoin Universe.
Content addressingContent hash is derived by indexers; the envelope does not require one in the script.A SHA-256 digest of the payload is a required script field, checked before the payload is accepted.

Use an envelope instead when the payload is larger than a few hundred bytes, when you need arbitrary content types, or when you need an ecosystem of existing indexers and marketplaces to see your data. Those are the majority of cases.

Against Stamps unprunable outputs

Bitcoin Stamps made the opposite trade on purpose. It stores data in outputs that look spendable, so the bytes land in every node's UTXO set and stay there. Pruning a node does not remove them, and no future policy change can make them disappear from the set until someone spends them.

Stamps against OP_DROP
DimensionStampsOP_DROP
Retention guaranteeStrongest of the four. Every validating node keeps the bytes in the UTXO set, whether or not it keeps old blocks.Weaker. A pruned node discards the block, and with it the witness holding the payload. Recovering an old OP_DROP payload needs an archival node or a copy from an indexer.
Externalised costHigh and permanent, paid by every node operator in UTXO set growth.Lower and temporary, except for the one small anchor output per event.
Cost to the creator4 weight units per byte, plus dust value locked into each data output.1 weight unit per byte, plus one anchor output.
ReadabilityImmediate, from the transaction that confirms.Only after the reveal transaction confirms.
Node operator reactionOpenly contested. Some operators consider it abuse of the UTXO set.Untested at scale. It has the same profile as any Taproot script-path spend, but it has no track record.

Use Stamps instead when maximum retention is the requirement and you accept both the cost and the criticism that comes with it.

Where OP_DROP is worse

Collected in one place, so it does not have to be assembled from the tables above.

  1. Nothing outside Bitcoin Universe reads it. No third-party wallet, explorer, marketplace, miner, or indexer recognises an OP_DROP event. This is the largest practical drawback and it is not fixable by documentation.
  2. It costs about twice an OP_RETURN for a small payload, because it needs a commit transaction and a reveal transaction. The witness discount only pays off at sizes larger than a token event.
  3. It adds to the UTXO set. Every event's reveal creates a P2TR anchor output. OP_RETURN adds none.
  4. 256 bytes per push is restrictive. An envelope chunks at 520. For large content OP_DROP needs roughly twice the pushes and twice the per-chunk overhead.
  5. Data is invisible until the reveal. Anyone watching the commit transaction sees only an ordinary Taproot payment. That is fine for privacy and bad for anyone who wants to read intent from the mempool.
  6. Prunability is worse than Stamps and no better than an envelope. The payload lives in witness data that a pruned node throws away.
  7. The ledger profile is narrower than the carrier. Tickers are exactly four characters, self_mint is rejected, and there are no decimals. A leaf can be a valid carrier and still change no balance.
  8. One JSON object per leaf. There is no batching of several token events into a single reveal, so a five-mint batch is five separate inscriptions.
  9. Strict serialization is unforgiving. A single space, a reordered key, or a numeric instead of a string makes the event invalid. That is deliberate, but it means a careless encoder produces confirmed transactions that do nothing.

Choosing

Which carrier fits
If you needUse
A small commitment, one transaction, universal toolingOP_RETURN
Arbitrary content of any size with an existing ecosystemA witness envelope
Data every node keeps regardless of pruningStamps, accepting the cost
A small, strictly framed, self-verifying event with a fixed grammar and no conditional opcodes, inside Bitcoin Universe productsOP_DROP

OP_DROP is not trying to replace the other three. It is a narrow carrier for a narrow job: a compact event with a digest, a fixed shape, a script that is trivial to validate, and a deliberately conservative profile. If your job is wider than that, one of the other three is the better answer.