Segwit

せぐうぃっと(英:Segregated witness)

Segwit(セグウィット)とは「Segregated Witness(Witness=隔離された署名領域)」の略語です。Segwitはトランザクション情報をコンパクトに圧縮することで、ビットコインの抱えていたスケーラビリティ問題の解決が期待される技術です。2017年8月にビットコインに実装されました。

取引データ(トランザクション)の中には、各取引データを識別するためのトランザクションIDがあります。トランザクションIDは、取引データの中にある「scriptPubKey」および「scriptSig」という署名データを「ハッシュ関数」という計算方法で暗号化(=ハッシュ化)することで求められます。Segwitとは、scriptSigを取引データの中ではなく、取引データから隔離された「Witness」という署名領域へ移行させる仕様変更となります。

Segwitによって、トランザクション展性(transaction malleability、別名マリアビリティ問題)と呼ばれるブロックチェーンの脆弱性が解消されると考えられています。ブロックチェーンの仕様上scriptSigは書き換えが可能となっていました。scriptSigが変わると、ハッシュ化された際のトランザクションIDも変わります。トランザクションIDは取引データを一意に特定するための大事なキーですから、結果として同じ取引データなのにトランザクションIDだけ異なるブロックを生成できてしまいます。悪意のある攻撃者が繰り返し送金を求めることが可能となり、二重取引が行われるという課題があったということです。

Segwitを実装すると、このscriptSigが取引データの中から削除されてWitnessに移行し、書き換えができなくなります。そのため、トランザクション展性が起こらなくなると考えられているのです。

Segwitは、もうひとつの「スケーラビリティ問題」の解決策になりえるともみなされています。

Segwitの浸透率について
2017年8月に実装されたSegwitですが、2018年5月現在の浸透率(普及率)は30%程度にとどまっています。これは、未だに仮想通貨交換業者やビットコインのウォレット、あるいはブロックチェーンを活用している企業などの多くがSegwitに対応していないからと推測されています。

Segwitの普及が遅れているのは、主にビットコインから枝分かれ(フォーク)して生成されたアルトコインであるビットコインキャッシュが原因と考えられています。ビットコインキャッシュを送金したければ、当然ビットコインキャッシュの受入アドレスに送らなければいけません。しかし、時折間違ってビットコインの受入アドレスに送ってしまう人がいます。

しかし、仮にビットコインのSegwit対応済の受入アドレスに送金してしまうと、その資金を仮想通貨交換業者側で取り出せなくなる(他のユーザーが勝手に取り出せてしまう)という事故が発生する可能性があります。ビットコインキャッシュでは、Segwitが実装されておらず、Witnessの中に置かれた署名が検証されないためです。

また、ユーザーがSegwit対応のウォレットを購入し、Segwit対応のアドレスにビットコインを移し替えるのも面倒であるため、普及を阻害する一因になっているとも考えられます。

ただし、2018年の初めまでは15%前後の普及率で低迷していたのが、2018年3月になって世界最大の仮想通貨交換業者であるCoinbaseがSegwit導入を決定したこともあり、30%にまで上昇したという経緯があります。今後の浸透率向上が期待されます。

Segwitの対応方式について
Segwitに対応した送金方法には、取引データに不正がないか検証するトランザクションスクリプトのエンコード方式を変える方法と、この変更されたアドレスを従来フォーマットのアドレスでネストする(=入れ子にする)方法の2通りがあります。

エンコード方式の変え方には、さらにP2WPKH(Pay to Witness Public Key Hash)とP2WSH(Pay to Witness Script Hash)の2つがあります。それぞれ、P2PKH(Pay To Public Key Hash)とP2SH(Pay To Script Hash)をSegwit対応させた(=Witnessを活用させた)ものです。

P2PKHとは、相手の公開鍵(Public Key)のハッシュ値を使用するトランザクションスクリプトで、最も一般的なタイプです。アドレスの頭は「1」から始まります。これに対しP2SHは、スクリプトそのものをハッシュ化して使用します。2012年頃から登場した、比較的新しいタイプです。アドレスの頭は「3」から始まります。

Segwitの実装によって、P2PKHとP2SHはP2WPKHとP2WSHへ変更する必要があります。頭文字は1でも3でもなくなり、最初の3文字が「bc1」となる「Bech32」というアドレスフォーマットになります。このアドレスフォーマットには、Segwit未対応のウォレットからは送金できないようになっています。

Segwitに対応するには、以上のようにスクリプトを変更する方法があります。もう一つの方法は、P2WPKHやP2WSHをP2SHでネストする(=入れ子にする)やり方です。これなら、Segwit未対応のウォレットからでも送金できます。

Segwitはスケーラビリティ問題の解決策のひとつ
スケーラビリティ問題とは、ブロック容量が1MBに制限されている一方で取引データが増加したことで、承認作業の遅延や手数料の高騰が発生したことを指しています。

取引データが増えると、当然ながら承認されるまでに時間がかかります。2017年から2018年の初頭には、ビットコインの送金に数日かかるような事態まで発生し、ビットコインネットワークの利便性を大きく押し下げる結果となりました。また、承認は手数料の高い取引データから行われるため、おのずと手数料も高騰することになりました。

Segwitによって取引データ自体からscriptSigが削除されることで、1MBのブロック内部に格納できる取引データ量が増えます。トランザクション展性の防止だけではなく、スケーラビリティ問題の解決にもつながるとされるのはこれが理由です。


DMMビットコイン 用語集 2019/1/23 転載