ビットコインのブロックチェーンにはいくつかの問題点がありますが、その幾つかを解決するものがこの「Segwit」と呼ばれる方法です。ここでは、ビットコイン以外のブロックチェーンおいて先行して取り込まれた事例も含め、Segwitについて紹介します。
scriptSigとscriptPubKey
Segwitを理解するために、まずはビットコインのトランザクションに関する知識がある程度必要です。そこでscriptSigとscriptPubKeyを抑えておく必要があります。
ビットコインのブロックチェーン上に記録されるトランザクション(取引データ)は、インプット(入力)とアウトプット(出力)の二つから構成されています。コインを送るときのトランザクションがインプットであり送信元の情報が含まれています。一方でコインを受け取るときのトランザクションがアウトプットであり送信先の情報が含まれています。インプットやアウトプットに関しては以下の記事にも記載されています。
ブロックチェーンの取引データをひとつなぎにする仕組み「UTXO」
それではインプットとアウトプットにはどのような情報が書かれているのでしょうか。まずインプットにはscriptSigと呼ばれるトランザクション(取引)に関する送信元のデジタル署名と公開鍵などの情報がコードとして含まれています。署名とはコインを受け取る際のアドレス所有権を証明するものです。他方、アウトプットにはscriptPubKeyと呼ばれる送信先(受取側)アドレスなどの情報が含まれているスクリプトが存在します。
scriptSigとscriputPubKeyはどちらもトランザクションスクリプトとよばれるビットコイン専用の言語で作られたプログラムです。scriptSigは秘密鍵所有者のみがscriptSig内に署名データを書き込んでビットコインのロックを解除できるという性質から「ロック解除スクリプト」とも呼ばれています。一方でscriptPubKeyは秘密鍵所有者以外は署名してビットコインを使用できないようにデータをロックすることから「ロックスクリプト」と呼ばれています。
Segwitでは、これらのスクリプトに登場してくる「署名」に着目します。
Segwitとは
Segwitとは「Segregated Witness」の略であり、直訳すれば「署名の分離」です。つまりSegwitとはビットコインのscriptSig内に含まれている署名を分離して別の領域に格納するというものです。
Segwitは開発者のPeter Wuille氏により提案された画期的な方法であり、過去全てのデータと互換性を保ちながら単純にソフトウェアを一部変更しアップデートする(ソフトフォーク)によって実現できます。
署名(Witness)に関するデータはもちろん必要なデータですが、これまでそれを検証するタイミングは限られた時にのみフルノードが行うのみでした。すなわち多くのウォレットなどでは署名データへのアクセスや検証を行っていないのです。しかしそれにも関わらず、署名データはビットコインブロックチェーンの約60%を占めており、データ容量の観点からスケーラビリティを阻害してしまっていました。
そこでPeter氏はこの署名データをトランザクションデータ本体から分離(Segragate)し、必要なノードだけが参照できるようにする仕組みにしようとしたのです。
Segwitのメリット
Segwitを行うことによるメリットとは何なのでしょうか。主なメリットとして2点考えてみましょう。
ブロックサイズの上昇
Segwitにより頻繁に議論されている大きなメリットとして、ブロックサイズが大きくなるという点があります。署名データを分離することで軽量版ブロックが作成されます。これは従来のブロックより軽量でデータサイズも小さいので、この仕様に変更することで1MBのブロックサイズに最大4倍もの情報が入るようになります。従ってブロックサイズを拡張せずに、4倍のスケーラビリティの確保ができるのです。
具体的には、Segwitではブロックの大きさに関する制限を緩和します。Segwitによって以下の式で表される新たなブロックサイズ式が導入されます。
witness以外のデータ + witness/4 ≦ 1MB (witness:署名に関するデータ量)
従来のようにブロックサイズ ≦ 1MBという制限を変更することなく、上式のように署名と署名以外の部分を分離します。これにより、データ内の情報が全て署名であれば、理論的には最大4MBのトランザクションデータが格納できることになります。しかしトランザクションデータのすべてが署名データであることは現実的にはないため、実際にはブロックの平均の大きさは1.7MB程度になるだろうと予想されています。
トランザクション展性の解決
ビットコインには「トランザクション展性(トランザクションマリアビリティ)」と呼ばれる脆弱性があります。ビットコインでは各トランザクションを識別するために、トランザクションIDと呼ばれるトランザクションデータ全体のハッシュ値が使われます。Blockchain.infoなどで送金の内容をチェックすると記載されているハッシュ値です。
しかし実はこのトランザクションIDは、悪意のあるノードによって、変更されてしまいます。送信先や金額・アドレスなどの取引内容を変更することなく、このトランザクションIDだけを変更できる脆弱性をトランザクション展性と呼びます。
トランザクション展性があることによって、例えばハッカーがトランザクションハッシュ値を書き換えたとしたら、取引が無効になったりすることはなく、正常な送金としてマイニングされてしまいます。なぜならば、ハッカーは送金先アドレスや送金額などを変えずに、トランザクションIDのハッシュ値だけを変えることが可能だからです。
この脆弱性をSegwitによって解決できます。Segwitでは署名の部分だけではなく、展性を起こす原因であるインプットスクリプト全体を隔離します。その代わりに新しいスクリプト領域をつくり、そちらを今までのインプットスクリプトの代わりに参照することにします。
Segwitではインプットスクリプトには何も書かなくて良いので、トランザクションIDのハッシュ値の計算において、ハッカーが改変できる部分が取り除かれた形になります。アドレスや金額などの他の部分は変更しようとしても無効なトランザクションとして却下されるので、トランザクション展性問題は完全に解決されます。
Segwitに関する情勢
日本初のアルトコインであるモナコイン(Monacoin)が世界で初めてSegwitを採用し有効化(アクティベート)に成功しました。
モナコインは2017年3月よりSegwitのシグナリングが開始されていました。モナコインは日本国産ですが、マイナーは海外にも分散しています。日本を中心としたコミュニティーの努力により、今回の採決でアクティベートに至ったと考えられます。モナコインの今後に注目が集まっています。
画像:MONA COIN
また2017年5月11日には他のアルトコインであるLitecoin(ライトコイン)においても、Segwitが正式にアクティベートされています。
画像:Litecoin
このようにアルトコインでは、先行してSegwitなどのアクティベーションを実施することで知見が集まり、本流であるビットコインに応用するという使い方ができます。
多くのブロックチェーン技術はまだ発展途上であり、Segwitも発展のために議論されている新たな方法論の一つです。将来的にSegwitが常識になっているかどうかはまだ分かりませんが、今後のブロックチェーン情勢を正しく理解するために頭に入れておきたい知識であると考えられます。