本文へスキップ
buybitcoinsmart

用語集 / 開発者向けリファレンス

オペコード(Opcode)

別名はオペコード、Opcode、データプッシュオペコード、非データプッシュオペコードです。

オペコード(Opcode)とは?
オペコード(Opcode)とは、Bitcoin Scriptの1バイトの命令で、検証ノードに対して次に何を行うか、データをスタックに積むのか、すでにスタックにあるデータに対して1つの操作を行うのかを指示するものです。

ビットコインのScriptには256個の取り得るバイト値からなる固定の語彙があり、リテラルデータをプッシュするオペコードと、すでにプッシュされたデータに作用するオペコードに分かれています。レガシーScriptが実行できる作用オペコードは最大201個で、10,000バイトを超えることはできません。ビットコインを購入する人にとって、この小さな語彙は、ウォレットがブロードキャスト前に手数料を見積もれる理由であり、ビットコインに暴走するコントラクトのバグが入り込む余地がない理由でもあります。

仕組み

検証ノードはScriptを1バイトずつ読み、各バイトを固定の表で照合します。0x01から0x4bまでの値は命令ではなく、それぞれは、続くNバイトがリテラルデータでありスタックに置かれることを示します。そのため33バイトの圧縮公開鍵は、Script内で0x21に続けて鍵そのものが現れる形になります。さらに3つのプッシュコードOP_PUSHDATA1、OP_PUSHDATA2、OP_PUSHDATA4がより長い項目を扱い、0x51から0x60までの値は、定足数のカウントに現れる1から16までの小さな整数をプッシュします。

0x60を超えるものはすべてデータを運ぶのではなく処理を行い、ビットコインが数えるのはこちらです。Taproot以前のScriptは、そうした処理オペコードを最大201個まで含むことができ、520バイトを超えるスタック要素を持たず、スタック上の項目を1,000個以下に保ち、全体で10,000バイトを超えてはなりません。4つの数値はいずれもBitcoin Coreのscript.hに由来し、いずれもコンセンサスルールであって、ノード運営者が緩められる設定ではありません。

15個のオペコードは表に載っていますが、無効です。OP_CAT、OP_MUL、OP_LSHIFTと他の12個は、クラッシュを引き起こすバグの後、2010年に無効化され、それらの1つを含むだけのScriptは、決して実行されない分岐の中にあっても失敗します。再有効化されたものは1つもありません。この1つの決定が、ビットコインのScriptが「プログラマブル」という言葉から期待されるより狭い最大の理由です。

TapscriptはTaprootの支払いの管理方法を書き換えました。2021年11月のブロック709,632から有効なBIP-342は、201命令の上限と10,000バイトのサイズ上限の両方を廃止し、代わりに署名の予算を導入しました。Scriptが検証する署名ごとに、トランザクションは50ウェイト単位を負担しなければなりません。また、未定義のバイト値の範囲をOP_SUCCESSコードに変えたため、それらを含むScriptは実行されなくても有効です。これは将来のアップグレードのために意図的に残された余地です。

ビットコインを購入するときにこれが重要な理由

オペコードは出金のコストを決めます。レガシー出力は20バイトのハッシュを囲む4つの処理命令を25バイトで表し、ネイティブSegWitの同等物はバージョンバイトとプッシュで22バイト、Taproot出力は34バイトです。SegWitはロック解除側をウェイトの4分の1のウィットネスに移したため、bech32出力の使用はおよそ68仮想バイト、同じ支払いのレガシー版はおよそ148仮想バイトになります。取引所が対応している場合に、出金時にbech32またはbech32mを選ぶことは、この用語集でほぼ最も安価な判断です。

オペコードは、署名デバイスが実際に何を扱えるかも決めます。標準的な単一鍵のテンプレートしか認識しないハードウェアウォレットは、タイムロック付きの金庫や通常とは異なるポリシーに連署できません。相続計画やマルチシグが計画に少しでも含まれるなら、ビットコインをすでにそのデバイスに保管した後ではなく、デバイスを購入する前にレビューでScriptの対応状況を確認してください。

この狭さは安全性の特性であり、欠点ではありません。ループも、他のトランザクションを読む方法も、支払いをまたいで持続する状態もないため、プログラマブルなチェーンから数十億ドルを流出させてきた障害のパターン、つまり作者が想定しなかった入力に対してコントラクトが正しく動作してしまう事態は、起こりようがありません。ビットコインの損失は取引所、フィッシング、失われたバックアップから生じるものであり、Scriptエンジンの誤動作からではありません。

実例:OP_NOP2が効力を持った日

OP_NOP2はバイト0xb1で、まったく何もしませんでした。後に使うために表に残された、番号付きの10個のno-opの1つです。BIP-65がそれに役割を与えました。トランザクションのlocktimeが過ぎていることを確認し、過ぎていなければScriptを失敗させるという役割です。適用は2015年12月14日のブロック388,381から始まり、それ以来このオペコードはOP_CHECKLOCKTIMEVERIFYと呼ばれています。

仕掛けは、古いソフトウェアが依然として何もしないバイトを見ていたため、新しいトランザクションも有効として受け入れ続けたことです。タイムロックを適用したのはアップグレード済みのノードだけでした。この非対称性がソフトフォークをソフトたらしめるものであり、同じ経路でOP_NOP3は2016年7月のブロック419,328でOP_CHECKSEQUENCEVERIFYになりました。予約されたno-opの枠は8つ残っており、これはTaproot以前のルールにおけるビットコインの残されたアップグレード余地の大部分であり、設計上の関心の多くがTapscriptが生み出したOP_SUCCESS値へ移った大きな理由の1つです。

オペコードvsビットコインのScript

ビットコインのScriptは言語であり、オペコードはその語彙の1語です。この区別は、ビットコインに何ができて何ができないかについての主張を読むときに重要です。過去10年間のほぼすべての真剣な提案は、言語そのものを変えるのではなく、新しいオペコードを1つ定義する提案でした。OP_CHECKTEMPLATEVERIFY、OP_CAT、OP_CHECKSIGADDはいずれも1つの仕事を持つ1バイトであり、コベナンツや金庫に関する公開の論争は、特定の1バイトに意味を持たせることを許すべきかどうかの論争です。新しいオペコードが加わっても、スタック、上限、ループの不在はまったくそのままです。

混同しやすい用語

よくある質問

ビットコインはEthereumのようにスマートコントラクトを実行できますか?

いいえ、それは設計上の意図によるものです。Bitcoin Scriptにはループがなく、トランザクション間で保持される永続的なストレージもなく、算術および文字列に関する15個のオペコードは2010年以来無効にされているため、スクリプトは固定された支出条件に対してイエスかノーかを答えることしかできません。

ビットコインを購入したり保有したりするためにオペコードを理解する必要はありますか?

いいえ。ウォレットがスクリプトを組み立ててくれます。オペコードを知っておく価値が生じるのは、出金時にアドレス形式を選択するときやマルチシグを設定するときだけです。というのも、そのどちらの判断も、実行されるオペコードと支出にかかる手数料を変えるからです。

ビットコインはチェーンを分裂させずに新しいオペコードをどのように追加するのですか?

古いノードがすでに無視しているバイトを再定義することによって追加します。OP_NOP2とOP_NOP3は、この方法で2015年と2016年に2つのタイムロック用オペコードになり、Tapscriptは同じ目的で2021年にOP_SUCCESS値の新しい領域を確保しました。

次に読む

関連用語

開発者向けリファレンスのその他の用語

このページを英語で読む