ビットコインの認知度が上がるにつれ、トランザクションの量も増えスケーラビリティに対する問題がますます深刻化してきています。
このスケーラビリティ問題に対する解決策はさまざまな方法が提案されていますが、その中でもすでに実際に有効化されているのがSegwitです。Segwitとはトランザクション中にあるデータサイズの大きい署名データを新しい領域に移動させるで、実質的なブロックサイズを増やそうという仕組みです。
しかし、segwitには特にマイナーにとって不都合な部分もありビットコインコミュニティの分裂を引き起こしているという見方もできます。当記事ではこのsegwitの仕組みについて解説しメリットやデメリットについても見ていきたいと思います。
Segwitが導入される理由
どうしてビットコインにおいてsegwitの導入が進められているのでしょうか。それは、ブロックチェーンを用いた仮想通貨の全てが必ず直面するスケーラビリティ問題への対策とビットコインの仕様上の脆弱性であるトランザクション展性への耐性を高めるためです。
ここではスケーラビリティ問題とトランザクション展性の紹介をしていきます。
スケーラビリティ問題
Segwitの導入が進めれられているひとつの理由は、スケーラビリティ問題に対してある程度の効果があるからです。ビットコインのブロックチェーンを使用するユーザーが急増していることで、それに伴いトランザクションも急増しています。
しかし、ブロックに記録できるトランザクションの量は限られているので、未検証のトランザクション(ブロックに記録される前のトランザクション)が溜まり、送金に時間がかかったり、送金手数料を多く支払う必要性などスケーラビリティ問題が課題となっています。
下図を見ると、ビットコインにおいて1ブロックあたりのトランザクション数が現在は2500くらいまで増えてきていることが分かります。
(source: blockchain.info)
また、以下のようにブロックサイズも上限である1MBに達してしまっています。
(source: blockchain.info)
ブロックのサイズが限られていることが原因なら、ブロックのサイズ自体を大きくしてしまえばいいのではないかと考えられますが、ブロックのサイズを大きくすることによりセキュリティ面での問題やマイニングプールの寡占化促進など引き起こされてしまうと考えられているのです。
こういったビットコインにおけるスケーラビリティ問題を解決するためのひとつの方法として、Segwitの導入が行われています。Segwitでは、ブロックサイズを大きくするのではなく、ひとつひとつのトランザクションのサイズを小さくすることでこの問題を解決しようとしているのです。
しかし、このSegwitの提案によりビットコインのコミュニティがビッグブロック派とスモールブロック派に分断され、次々とハードフォークを引き起こすなど大きな問題に発展しています。
トランザクション展性
トランザクション展性(transaction malleability)とは、各トランザクションを識別するためのトランザクションID(txid)が変更されてしまう脆弱性のことを言います。
トランザクションIDはトランザクションのハッシュ値が使われますが、トランザクションに含まれるアドレスやビットコイン量を変更せずにトランザクションIDだけを変更してしまうのです。このトランザクション展性を利用することで、トランザクションIDだけをトランザクションの識別に用いているウォレットで二重支払いを発生させることができます。
1BTCがアリス→ボブ(攻撃者)→チャーリーと送金される状況を考えてみましょう。まず、攻撃者であるボブがアリスから1BTCを受け取ります。そして、ボブはすぐにチャーリーの店でその1BTCを使って買い物をします。チャーリーの店は利便性向上のため約10分間かかるブロックの承認を待たずにビットコインの送金を完了させています。
攻撃者ボブはチャーリーの店で1BTCの買い物をした後、アリス→ボブでのトランザクションIDを変更します。
すると、アリス→ボブのトランザクションを参照しているボブ→チャーリーのトランザクションが送られなくなってしまうのです。(親トランザクションの変更により有効なUTXOが見つからなくなるからです。参考:ビットコインのトランザクションにおける「UTXO」を分かりやすく解説してみた)
これにより、攻撃者ボブはチャーリーに1BTCを支払うことなく、チャーリー店の商品を手に入れることができてしまいました。
segwitを導入すると、このようなトランザクション展性を利用した攻撃ができなくなります。なぜなら、Segwitにより署名データなどのトランザクションID算出に使用されるデータを別の領域に保存するので、トランザクションIDの変更ができなくなるのです。つまり、segwitの導入によりトランザクション展性への耐性が強くなります。
さらに、取引所やウォレットにおいてトランザクションの識別もトランザクションIDを用いることができるので開発がら楽になります。また、ライトニングネットワーク(ligitning network)やシュノア署名の実装が行えるようになります。
参考:ビットコインにおけるライトニングネットワークの仕組みを分かりやすく解説
参考:シュノア署名がビットコインのスケーラビリティ問題に与える衝撃
Segwitの仕組み
segwit(Segregated Witness)とは、トランザクションに含まれる署名データをwitnessというそのトランザクション内の新しい領域に保存するアイデアです。
署名データはトランザクション構造を見ると以下のようにインプットの中のscriptSigとして存在します。
(scriptSigやscriptPubKeyはトランザクションスクリプトです。参考:ビットコインおけるトランザクションスクリプトの仕組みとその種類)
scriptSigはデータ量が大きいので、これをwitnessに移動することでトランザクション全体のサイズを削減することができます。
以下にブロックの構造を示していますが、このブロックに含まれるひとつひとつのトランザクションに含まれるscriptSig(署名データ)をwitnessに移動させるのです。
すると、トランザクションひとつひとつのサイズが減るので実質的なブロックサイズが向上し、segwit導入後はより多くのトランザクションをブロックに含めることができるようになります。
また、それぞれのトランザクションはマークル木という形式でコンパクトにまとめられてブロックのヘッダーに保存されています。マークル木は以下のように2つのデータのハッシュ値を組み合わせていくことでルートハッシュにまとめる方法です。
しかし、witness内に保存されたデータはこのブロックヘッダーにあるトランザクションのマークル木を構成するトランザクションのハッシュ値に含まれていないのです。これによりマリアビリティ(トランザクション展性)を不可能にしています。
そして、「本当にトランザクションに署名がされているのか」ということを確認するために、ブロック内のwitnessデータをマークル木形式でまとめてコインベーストランザクションにコミットメントデータとして保存します。
コインベーストランザクションとは、各ブロックの最初にある特別なトランザクションになります。(コミットメントデータもブロックヘッダーにあるマークル木に含めます。)
このコミットメントデータを確認することでそれぞれのトランザクションがしっかりと署名されているかチェックできるようになっているのです。
また、segwitにより署名データをwitness領域に移動させることで、トランザクション展性(マリアビリティ)が解決されることでライトニングネットワークが安全に動作するようになります。
これにより、現在ではブロックは1MBまでに制限されていますが、segwit導入後は以下のようなブロックサイズの制限に変更されます。
要するに、署名データは1/4のサイズでトランザクションに含まれていると計算します。これにより、2倍程度のトランザクション数をひとつのブロックに入れられると考えられています。
Segwitの歴史とコミュニティへの影響
segwitの具体的な仕組みは上記の通りですが、segwitを導入するまでにさまざまな紆余曲折があり現在でもビットコインコミュニティに大きな混乱が起きています。
署名データをトランザクションから分離して保存するというアイデア自体は2012年には存在し、実際にBlockstreamの創業者であるAdam Back氏やGregory Maxwell氏を中心にその開発が進められていました。しかし、Segwitを実装するためにはどうしてもハードフォークが必要となりなかなか実装が行われませんでした。
このような状況の中、2015年に上述したように署名データをマークル木の形式でブロックの最初のトランザクション(coinbaseトランザクション)に保存するアイデアが提案されたのです。これによりソフトフォークでsegwitを導入することができるようになり、ビットコインに関わる人はみんなハッピーになるはずでした。しかし、一部のマイナーにとっては不都合なことがあったのです。
なぜならsegwitを導入するとより多くのトランザクションをブロックに含められるようになるので、高い手数料を払って早くトランザクションを承認させようとするユーザーが少なくなります。つまり、マイナーが得る取引手数料が減少してしまう可能性があるのです。
マイナーとしては、segwitのような一時的な解決策ではなく、ブロックサイズを増やしような根本的なスケーラビリティ問題への解決策を望んでいたのです。そこで、2017年5月に開かれたニューヨークでのカンファレンスでNYA(New York Agreement, Segwit2x, BIP91)がビットコインコミュニティが提案されました。
NYAとは80%以上のマイナーの同意でsegwit導入され、その後6ヶ月以内でブロックサイズを2倍の2MBに拡張するハードフォークを実行する計画です。つまり、両方の案を取り込むことでコミュニティ内での対立を緩和させることが狙いでした。
実際に2017年7月にsegwitはアクティベートされ、2MBへの拡張も2017年11月にハードフォークが行われる予定でしたがエラーにより行われることはありませんでした。
このような対立はその後も続き、ビットコインコミュニティの中でいわゆるビッグブロック派とスモールブロック派に分裂してしまっているのです。
結果的に2017年8月にビットコインキャッシュ、2017年10月にビットコインゴールドなどのコインが誕生し混乱は続いている状態です。
Segwitのメリット
segwitのまとめとして、segwit導入のメリットとデメリットについて見ていきましょう。
- ブロックの実質的なサイズが増える
- トランザクション展性に対しての耐性がつく
- 取引所やウォレットでのトランザクション識別にトランザクションIDが使えるようになる
- 取引手数料が減る
- トランザクションの承認時間が早くなる
- ブロックに含まられるトランザクションの数が増えるということは結果的に1ブロックのマイニングあたりにマイナーが得られる取引手数料も増える
- ライトニングネットワークを導入しやすくなる
- ブロックサイズを拡張に伴う署名データの指数関数的な増加を防ぐことができる(quadratic-hashing問題)
Segwitのデメリット
- ひとつひとつのトランザクションに対してマイナーが得られる取引手数料が減る
- 実装が複雑でそれに伴い全てのウォレットがsegwitに対応しなければならない
- ブロックあたりのトランザクションや通信の急増に伴いリソースの使用量も増える
- ビットコインコミュニティの分裂につながる