用語集 / プロトコルとアップグレード
SegWit
別名はSegregated Witness、BIP141、セグウィットです。
- SegWitとは?
- SegWitは、txidがコミットするトランザクションの部分から署名データを切り出したもので、トランザクションの展性を修正し、1メガバイトという基本上限を変えずにブロックの容量を高めました。
BIP-141で規定されています。
この変更は見た目ではなく構造に関わるものでした。署名は、古いノードが決してダウンロードしないウィットネス(witness)セクションに移され、これにより容量の増加をソフトフォークとして導入できるようになりました。また、ウィットネス内のバイトは4ではなく1のweight unitとして計算されます。そのため、bc1qアドレスから使用する場合のコストは、レガシー入力のおよそ半分になります。
仕組み
Segregated Witnessはトランザクションを2つの部分に分割し、それぞれを別々にハッシュします。
ベース部分にはバージョン、入力、出力、ロックタイムが含まれます。ウィットネス部分には、各入力について、その入力を承認する項目のスタック(通常は署名と公開鍵)が含まれます。トランザクション識別子はベース部分のみから計算されるため、ウィットネス内のいかなるデータもそれを変更できません。2つ目の識別子であるwtxidは両方を対象とし、ブロック内のすべてのwtxidのマークルルートがコインベーストランザクション内にコミットされるため、ウィットネスデータも改ざんできません。
容量は上限の変更ではなく、計上の変更から導かれます。ウィットネス外の各バイトは4 weight unit、ウィットネス内の各バイトは1 weight unitとして計算され、1ブロックには4,000,000 weight unitまで含めることができます。したがって、ウィットネス以外のデータは以前とまったく同じく1,000,000バイトを超えることができず、その一方で署名は余剰の予算内に収まります。旧方式で計測する2017年以前のノードは、正当なブロックと見なして異議を唱えないのであり、このアップグレードにハードフォークが不要だったのはまさにこのためです。
BIP-143はウィットネス入力の署名方法を書き換え、その実用的な利点は見た目以上に大きいものです。旧署名ハッシュアルゴリズムは、入力ごとにトランザクションの一部を再ハッシュしていたため、入力の多いトランザクションの署名にかかる負荷は二次関数的に増大しました。新しい方式は事前に計算されたハッシュを再利用し、さらに重要な点として、使用する金額をコミットします。それ以前は、ハードウェアウォレットにその入力の価値について嘘の情報を与え、巨額の手数料を承認させることができました。
SegWitは出力タイプにも番号を付けました。ウィットネスバージョン0はP2WPKHとP2WSHを対象とし、ウィットネスバージョン1は空のまま残され、後にTaprootによって埋められました。これにより、新しい出力タイプを追加するたびに新しいアドレス形式の議論を必要とせずに追加できるようになりました。
ビットコインを購入する際にこれが重要な理由
ビットコインを実際に使う場面の3つの点が、このアップグレードに直接関係しています。
1つ目は、コインを移動する際に支払う金額です。ネイティブSegWit入力は約68vbytesで、レガシー入力の約148vbytesに対して小さいため、20sat/vBの手数料率で3つの入力を使用するウォレットは、1回のトランザクションで数千サトシを節約できます。この節約は受け取るときではなく使用するときに生じるため、重要なのは取引所が出金するアドレスタイプではなく、ご自身のウォレットが使用するアドレスタイプです。
2つ目は、ハードウェアウォレットが安全に通知できる内容です。BIP-143が入力額をコミットするため、TrezorやLedgerの画面に表示される手数料は、接続されたコンピューターが主張するデータではなく、デバイスが検証できるデータから導かれます。これにより実際の攻撃が塞がれ、レガシー入力の署名に依然としてデバイスへ以前のトランザクション全体を渡して金額を自身で確認させる必要があるのはこのためです。
3つ目はライトニングネットワークであり、したがってその上に構築されたあらゆる取引所です。Strikeはデフォルトでライトニングネットワーク上で価値を移動し、ライトニングネットワークのチャネルはSegWit出力へ資金が入れられます。これはプロトコルが安定したtxidなしでは機能できないためです。SegWitがなければチャネルもなく、その上に構築された即時決済製品もありません。
先に解消すべき展性(malleability)のバグ
トランザクションの展性は特殊な事例のように聞こえますが、ビットコインの上に何かを構築する上での最大の障害でした。
ECDSA署名には複数の有効なエンコードが存在します。SegWit以前は、メモリプールを監視する第三者が未確認のトランザクションを取得し、署名を無効にせずに再エンコードして再ブロードキャストできました。コインは同じ金額で同じ場所に移動しましたが、変更されたのはトランザクション識別子だけであり、元の識別子を記録していたソフトウェアは支払いが消えたと考えるようになりました。Mt. Goxは2014年2月の出金停止の原因は展性にあると公に主張しましたが、これは当時他の開発者が異議を唱えた主張であり、根底にある欠陥は現実のものでした。
支払いチャネルは、これを煩わしい問題から致命的な問題へと変えました。チャネルは、ファンディングトランザクションがブロードキャストされる前に、そのtxidで識別されるファンディング出力を使用する署名済みの返金トランザクションを保持することで機能します。txidが変わると返金は使用できなくなり、一方の当事者が他方の資金を人質に取れる状態になります。Joseph PoonとThaddeus Dryjaによる2015年のライトニングネットワークの論文は、その本文の中で展性の修正を前提条件として挙げていました。
SegWitは署名を識別子のプリイメージから外すことで、この問題を根本から取り除きました。ウィットネス出力を使用する入力のtxidは第三者が変更できなくなり、チャネルプロトコルはようやく設計どおりに構築できるようになりました。
SegWit vsウィットネスデータ
SegWitはアップグレードであり、ウィットネスデータはそれが生み出した構造です。一方は2017年8月24日という日付とBIP-141という仕様を持つ出来事です。もう一方は、今日のネットワーク上のほとんどのトランザクションに存在するフィールドであり、署名とスクリプトを運び、独自のシリアライゼーションと割引された独自のweightを持ちます。トランザクションが「SegWitを使用する」と言うのは、そのフィールドに承認が存在する入力を使用するという略式の表現です。
SegWit vs Taproot
4年離れた2つのソフトフォークで、どちらもウィットネスに関するものです。SegWitはウィットネス構造を作成し、バージョン0の出力タイプ(アドレスがbc1qで始まるもの)を定義しました。Taprootはバージョン1を埋め、Schnorr署名を追加し、ウィットネス内のスクリプトの評価方法を変更して、bc1pで始まるアドレスを生み出しました。Taprootがこれほど低コストで展開できたのは、SegWitがすでにバージョン管理の仕組みを構築していたからであり、そのため両者は段階的に実施された1つの設計として読むのが最適です。