前回の記事で解説したように、ビットコインの抱える大きな問題のうち、トランザクション展性（Transaction Malleability）とスケーラビリティ（Scalability）という２つの問題があります。SegWitは元々、トランザクション展性の解決案としてBicoin Core開発者のPieter Wuilleによって提案され（BIP141）、これら2つの問題両方を改善すると言われています。

スケーラビリティ問題

ビットコインのスケーラビリティ問題とは、簡単にいうと、ビットコインのトランザクション（取引）が増加し、ビットコインネットワークの処理が追いつかなくなることです。歴史的経緯もあり、ブロックチェーンの構成要素であるブロックのサイズが上限1MBと定められており、ブロックは10分毎に１つしか作成されません。そのため、単位時間あたりに承認できるトランザクションの数も限られます。すると、マイナーは高い手数料を支払うユーザーのトランザクションを優先してブロックに取り込むため、手数料も高騰します。

ビットコインのトランザクション量も年々増加しており、将来的にはさらに増加することが予想されるため、このままではビットコインというネットワークそのものが成り立たなくなります。

SegWitのシンプルな説明

前回の記事でも解説したように、トランザクションの構造は以下の図のようになっています。TxIdはトランザクション全体のハッシュ値のことでした。SegWitとは、トランザクションインプットから、改竄可能である署名部分（前回記事参照）を取り除いた部分のハッシュ値を取ってTxIdを導き、トランザクション展性を防ごうという提案です。さらに、これはスケーラビリティ問題も改善すると言われています。

SegWit は Segregated Witness（分離されたwitness）の略で、witnessが署名を含む witness dataと呼ばれる部分になります。witnessとは元々目撃者を意味する英単語ですが、Signatureはトランザクションに含まれデータ量の60%以上を占めるにも関わらず、トランザクションの検証の際には不要であることから、「検証作業をただ見ている目撃者」という意味で witnessという単語が使われているそうです。

SegWit の詳しい説明

さて、「SegWitはトランザクションの署名部分を分離する」と書きましたが、どういうことでしょうか？ なぜSegWitがスケーラビリティ問題を改善するのでしょうか？

ソフトフォーク

Pieter WuilleがScaling BitcoinでSegWitについて発表したとき、それはソフトフォークとして提案されました。ソフトフォークとは、ハードフォークと異なり後方互換性のあるプロトコル変更のことです。後方互換性があるとは、従来のプロトコルで動いているノードでも正常に動作するということです。

スケーラビリティを解決するための方法として、すぐに思いつくのはブロックサイズの拡張です。現在のブロックサイズは1MBを上限に定められていますが、例えば、ブロックサイズを2MBに拡張すれば、単純計算で1ブロックごとに取り込むことのできるトランザクション数が２倍になり、スケーラビリティの問題も解決するかに思えます。しかし、これはハードフォークになってしまうので後方互換性が失われ、マイニングの中央集権化が進む恐れがあるなど、さまざまな危険性が指摘されています。

そこで、SegWitではトランザクションの大部分を占めるscriptSigと呼ばれる署名のデータをwitness dataと名付け、トランザクションインプットの外に移動させました。SegWitトランザクションが従来（SegWit 未実装）のノードに送信されブロックに取り込まれる時、witness dataは切り離されます。SegWitでは、witness dataが切り離されたトランザクションであっても有効なトランザクションとするので、witness data分の容量を節約することができ、従来の1MB分以上のトランザクションを1ブロックに含めることができるのです。つまり、従来のノードは witness dataを無視します。

一方、SegWitノードはwitness dataを含めたデータをブロックに取り込みます。SegWit ノードのブロックは1MBを超えてもよいようなプロトコルになっています。

このように、従来のノードでもSegWitノードでも同じ形式のトランザクションを扱うことができることから、SegWit はソフトフォークで済むのです。

ブロックサイズとブロックウェイト

さて、SegWitの説明では、「ブロックサイズが大きくなる」や、「データを圧縮する」などと説明されたりすることがありますが、それらは少し正確ではありません。従来のノードでは「ブロックサイズを1MB以下」というように制限していましたが、SegWit からは新しい「ブロックウェイト」（Block Weight）と呼ばれる概念を用いて制限を行います。ブロックウェイトは、以下の式で定義されます。

[code lang="text"]Block Weight = ( Block Size without Witness data ) * 3 + ( Block Size )[/code]

ブロックウェイトとは、ブロックからそれぞれのトランザクションのwitness dataを除いたものに3を掛け、それにブロックサイズを足したものです。

例えばSegWit以前のブロックの場合、単純にブロックサイズの4倍がブロックウェイトとなります。その一方で、SegWitトランザクションの場合witness dataを含むため、ブロックウェイトはその分だけ小さくなります。

つまり、今までは「1MBのブロックサイズ」と制限していたものを、SegWit実装以後では「4MBのブロックウェイト」で制限するということです。この値は、すべて非SegWit トランザクションで１ブロックを構成した場合、ブロックサイズを1MBに制限したことと等価であることがわかります。

SegWitトランザクションの場合は、もし1,000バイトのトランザクションのうち300バイトがwitness dataの場合、

[code lang="html"]Transaction Weight = (1000-300) * 3 + 1000= 3100[/code]

となり、一般的にはwitness dataが大きいほどトランザクションのウェイトは軽くなると言えます。このことから、SegWitは１ブロックでより多くのトランザクションを含むことができるため、スケーラビリティ問題の改善につながります。

メリット

Sighash オペレーションの線型スケール

従来のブロックでは、トランザクションサイズが２倍になるとsighashと呼ばれる検証作業の手順が２倍になり、検証すべきデータも２倍になるため検証時間が４倍になります。すなわち２次関数的に検証時間が増えます。SegWitにおいてはこれが線型的にスケールするため、DDoS攻撃などの危険性を減らすことができます。

トランザクション展性の解決とLightning Network

SegWitがアクティベートされトランザクション展性の問題が解決することで、Lightning Networkの実装が複雑なものではなくなります。SegWitによってスケーラビリティが改善に近づくという場合は、このような技術を見据えて説明している場合もあります。Lightning Networkについては、詳しくは次回の記事で解説します。

デメリット

もてはやされているSegWit にも、もちろんデメリットはあります。その証拠に、提案されてから長い間マイナーの95%以上の賛成を得られませんでした。まず、１ブロックに含めることのできるトランザクション数は多くなりますが、ブロックサイズが大きくなることから、マイニングに必要なコンピュータのスペックが上がり、したがってマイニングの中央集権化が起こりうることが危惧されています。また、ネットワークの混雑緩和による手数料の減少から、マイニングのインセンティブが減少する、あるいはソフトフォークすることでネットワークに不具合が発生する可能性などが考えられます。

次回は、いよいよSegWit実装によって実装が容易になったオフ・チェーンの技術である、Lightning Networkについて解説します！