用語集 / トランザクションと手数料
トランザクションのバージョン番号
- トランザクションのバージョン番号とは?
- トランザクションのバージョン番号とは、トランザクションの先頭4バイトのことで、相対的なタイムロックなど、どのオプションのルールセットがそのトランザクションに適用されるかを検証する側に伝えるものです。
意味を持った値はこれまでに3つだけです。このフィールドはソフトウェアのバージョンではなく、プロトコルのバージョンでもなく、どのアドレスタイプが含まれているかを示すヒントでもありません。しかし、多くの人は初めてこれを見たときにそう思い込みます。コンセンサスはこのフィールドにほとんど関心を持ちませんが、リレーポリシーはそうではなく、この差こそがこのフィールドの話のすべてです。
仕組み
バージョンはシリアライズ形式の1バイト目から4バイト目まで、入力数の前に位置し、Bitcoin Coreはこれを符号付き32ビット整数として読み取ります。
バージョン1は元々の値で、チェーン初期の数年間のすべてのトランザクションで使われました。バージョン2が存在するのは、BIP68が古いトランザクションを無効にせずにシーケンス番号を相対的なタイムロックとして再解釈する方法を必要としたためで、新しい意味をバージョンの引き上げに結び付けました。2016年7月のブロック419,328以降、バージョン2を宣言するトランザクションはシーケンス番号が待機期間として検査され、バージョン1を宣言するトランザクションは検査されません。現代のウォレットはタイムロックを使うかどうかにかかわらず既定でバージョン2を設定するため、エクスプローラーで調べるほぼすべてのトランザクションが2と表示されます。
バージョン3は2024年10月にBitcoin Core 28.0とともに、topology restricted transactions、略してTRUCという名称で登場しました。バージョン3を宣言することは、より厳格な扱いを選択することです。そのトランザクションは常に置き換え可能として扱われ、未承認の親を最大1つ、未承認の子を最大1つしか持てず、子は1,000仮想バイト、トランザクション自体は10,000に制限されます。これらの制限は後退のように聞こえますが、ピン留めを経験するまではそう思えるだけです。ピン留めとは、取引相手が未承認のあなたのトランザクションに大きくて安価な子孫を付けて、手数料の引き上げが手の届かないものになるようにすることを指します。ライトニングの実装がバージョン3を採用したのは、まさにそのためです。
コンセンサスルールのどこにも、バージョン7やバージョン0であるという理由でトランザクションを拒否するものはありません。標準性のルールは拒否します。Bitcoin Coreは受け入れられる集合の外にあるバージョンをリレーもマイニングもしないため、通常と異なるバージョンは、何か別の方法でマイナーに届けなければならないトランザクションになります。
表示される場所
すべてのブロックエクスプローラーはトランザクションの詳細ページの上部付近にバージョンを表示し、Bitcoin Coreのdecoderawtransactionは最初のフィールドとしてこれを返します。
ビットコインを購入したり保有したりする人にとって、これは判断の材料ではなく診断の材料です。バージョンを選ぶことはなく、ウォレットが選びます。その実用的な価値は、見慣れないソフトウェアを読み解くことにあります。相対的なタイムロックが存在する世界でなおバージョン1のトランザクションを生成しているウォレットは古く、バージョン3を宣言する支払いは、ほぼ確実に人が送信ボタンを押したのではなく、ライトニングノードのチャネルの仕組みから出てきたものです。
トランザクションのバージョン番号vsブロックのバージョン番号
トランザクションとブロックはどちらも4バイトのバージョンフィールドを持ちますが、互いに何の関係もありません。
ブロックのバージョンはコンセンサスのアップグレードを追跡します。バージョン2のブロックは2013年3月のブロック227,931で必須となり、そのときBIP34がコインベース入力内にブロック高を要求しました。バージョン3はBIP66のもとで厳格なDER署名エンコーディングを強制し、バージョン4はCHECKLOCKTIMEVERIFYの展開とともに登場しました。2015年以降、このフィールドはBIP9のもとで再びシグナリングビットの集合として用途を変えられ、マイナーがそのビットを1つ切り替えることでソフトフォークに投票できるようになりました。トランザクションのバージョンはそのどれも行いません。シグナリングすることも、アップグレードのたびに増加することもなく、ネットワーク全体のルールセットではなく1つのトランザクションに適用されます。