Bitcoin OP_RETURNとは:データキャリア、nulldata、使用できない出力
OP_RETURN出力が公開データを記録する仕組み、使用できない理由、Bitcoin Core 31.1の中継ポリシーとコンセンサスの違い、witnessインスクリプションとの違いを解説します。
このガイドの内容OP_RETURN出力はロックスクリプトにデータを含める
短い要約
OP_RETURNは、ビットコイン取引の出力スクリプトに公開データを付ける方法です。Bitcoin CoreはOP_RETURNで始まる出力を証明可能に使用できないものとして扱い、UTXOセットから除外します。現在の中継サイズ制限はノードのポリシーであり、すべてのノードに適用されるコンセンサス上のpayload上限ではありません。
OP_RETURN出力はロックスクリプトにデータを含める
ビットコインの取引出力には金額とロックスクリプトscriptPubKeyが含まれます。nulldataとも呼ばれるOP_RETURN出力はOP_RETURN opcodeで始まり、その後にバイト列をpushできます。取引がブロックに入ると、そのバイト列は出力の一部として公開記録されます。OP_RETURNの後にデータをpushする形式は説明用の模式であり、独立したデータ層やトークン残高、非公開メッセージを作るものではありません。
なぜ出力を再び使用できないのか
OP_RETURNは実行されると失敗するopcodeです。OP_RETURNで始まるロックスクリプトを使おうとしても、スクリプトを満たせません。そのためBitcoin Coreはその出力を使用不能として分類し、永遠に使えないコインをUTXOセットに保持せず、すぐに除外できます。詳細はBitcoin Core 31.1のスクリプト実装を参照してください。 Bitcoin Core script implementation.
スクリプトサイズはpayloadより大きい
データキャリアのサイズ制限が適用される場合、測定対象はアプリケーションデータだけではありません。生の出力スクリプトにはOP_RETURN opcode、データpush命令と長さの符号化、payloadが含まれます。80バイトのpayloadには83バイトのスクリプトが必要になることがあります。opcodeが1バイト、80バイトをpushするOP_PUSHDATA1のヘッダーが2バイト、データが80バイトだからです。古い案内の「80バイト」はpayloadを指すことが多く、新しい設定ではスクリプト全体を数える場合があります。
Bitcoin Core 31.1のデータキャリア既定ポリシー
Core 31.1では-datacarrierが既定で有効で、-datacarriersizeの既定値は100,000バイトです。この値は同じ取引にあるすべてのデータキャリア出力の生のscriptPubKeyサイズを合算します。NULL_DATA出力が複数あれば同じ枠を共有し、opcodeやpushの符号化も含みます。Core 30.0で以前の83バイトのスクリプト枠が100,000バイトの集計枠に変更され、複数のデータ出力も認められました。Core 31.1もこの既定値を維持しています。Core 31.1の設定、ポリシー実装、30.0のリリースノートを参照してください。

中継ポリシーとコンセンサスは別の判断
ノードはデータキャリアの中継を無効にしたり、ローカルのサイズ制限を下げたりできます。他のノードやソフトウェア版では異なる設定を使うことがあります。あるノードがmempoolへの受け入れを拒んでも、それはローカルポリシーで中継しないという意味かもしれず、コンセンサス違反とは限りません。Bitcoin Coreは標準性の確認でデータキャリア枠を適用し、ブロック検証では別に取引とブロックのコンセンサス条件を確認します。 Core consensus transaction checks. See Bitcoin Core 31.1 mempool standardness implementation.
出力に割り当てた額は失われ、手数料は別に計算される
OP_RETURN出力に金額を割り当てることはできますが、取り戻せないため、その価値は永久に使用不能です。通常、ウォレットはデータ出力をゼロにします。割り当てた1,000 satが自動的にマイナー手数料になるわけではありません。手数料は入力の合計からすべての出力の合計を引いて計算されます。データを含むスクリプトも取引重量を使うため、同じsat/vBなら手数料を増やす場合があります。ビットコイン取引手数料ガイドも参照してください。
複数のデータ出力でも合算枠は増えない
Bitcoin Core 31.1は標準的なNULL_DATA出力を複数認めますが、生のスクリプトサイズは取引ごとの同じ枠に合算されます。payloadを分割しても上限は増えず、出力を追加すると取引データとブロック重量も増えます。中継されるかどうかは、ノードの取引重量、手数料など他の標準性ポリシーにも左右されます。あるウォレットやブロックエクスプローラーで受理されたことは、ネットワーク全体への伝播を保証しません。
OP_RETURNとTaprootのwitnessインスクリプションは異なる
OP_RETURNデータは取引作成時の出力scriptPubKeyにあります。SegWitのwitnessデータは入力ごとに別途シリアライズされ、BIP 141では入力ごとのスタックデータとされています。Taprootのスクリプトパスで使用すると、スクリプトとコントロールブロックが入力witnessに公開されます。Ordinalsソフトウェアは公開されたスクリプト内の形式を独自のアプリケーション規約でインスクリプションと解釈しますが、nulldata出力とは仕組みが異なります。BIP 141とBIP 341、[Bitcoin Ordinalsガイド](/learn/bitcoin-ordinals-inscriptions-satoshi-numbering-witness-data-explained)を参照してください。
データキャリアを使う前に設定、価値、公開性を確認する
利用するBitcoin Coreの版とローカル設定を確認し、生の出力スクリプト長、取引全体の重量、使用不能な出力に割り当てる価値、マイナー手数料を別々に計算してください。コンセンサスは任意のpayloadに意味を与えません。プロトコルや受信サービスがその形式を認識するかも確認が必要です。チェーンに書き込む内容は公開されるので、秘密や個人情報を含めないでください。出力やお釣りの価値の仕組みはビットコインUTXOとコインコントロールのガイドで確認できます。
よくある質問
Q1ビットコインのコンセンサスはOP_RETURNを80データバイトに制限する?
いいえ。80バイトは古い標準性ポリシーの例で使われたpayloadの値であり、普遍的なコンセンサス上限ではありません。Bitcoin Core 31.1の既定は生スクリプト合計100,000バイトですが、各ノードは変更できます。
Q2大きいOP_RETURNは取引手数料を増やす?
増えることがあります。スクリプトのバイトが取引重量を増やすため、同じsat/vBなら手数料が高くなる場合があります。出力に割り当てたsatも別途失われ、マイナー手数料ではありません。
Q3OP_RETURNとOrdinalsインスクリプションは同じ?
違います。OP_RETURNは出力スクリプトにあり、その出力を使用不能にします。一般的なTaprootインスクリプションは入力witnessのスクリプトパスデータに内容を置き、Ordinalsソフトウェアが独自の規約で解釈します。
出典
問題を報告
この記事のリンクを含むメールを準備します。送信すると Mark に報告が届きます
クイックチェック
記事を読み終えたら、3問で確認しましょう
問題 01
Bitcoin Core 31.1の既定-datacarriersizeは何を測る?
答えを選ぶと解説を確認できます