SegWitについて簡単にまとめます。あまり分かりやすくはないです。随時追記していきます。
背景
Bitcoin にはScalabilityの問題があります。これは、ブロックサイズの上限が1MBと決められていることから、将来ビットコインのトランザクションが増えた際にビットコインネットワークの処理が追いつかない(ちょっと前も追いついていなかった)ことが予想されるという問題です。ネットワークの混雑によって、いつまでたってもトランザクションが承認されなかったり、手数料が安いことが1つの売りであるビットコインの手数料が馬鹿みたいに高くなってしまったり(1000円とか)して、ビットコインが存在意義を失ってしまうほどの大きな問題です。
このScalabilityの問題に対する解決方法として(もともとはトランザクション展性の解決法として提案されたそうです)Bitcoin Coreの開発者Peter Wuilleによって提案されたのが、Segregated Witness(SegWit)です。
簡単な説明
BitcoinのTransactionは input と output から成り立ちます。inputはtxidとsignatureから成り、outputは送金する量とscriptPubkeyが含まれています。そのうち、inputにあるsignatureはvalidationの時のみに使われるのにも関わらず、Transactionの60%をも占めるデータ量を持つそうです。さらに、signatureはtransactionが行う処理について書かれているわけではなく、ただそのUTXOをredeemする権限を持っていることを証明するためのものです。
したがって、PeterさんはSignatureをtransactionから取り除いて他の場所に置こうと考えました。これがSegregated Wittness(分離された署名)です。
ここで、Witnessとはsignatureの事で、signatureは実際にはトランザクションにおいて何も処理を行わずただ見ている(witness)だけだということからこの名前がつけられたそうです。
実装方法
でもsignatureってtransactionの一部なのに、それを分離して成り立つんでしょうか? 成り立たない。
じゃあどうしよう。=> Bitcoinの仕組みを根底から変えちゃおう。
下の図のように、従来はトランザクション全体のハッシュを取ってtxidとしていましたが、witnessを除いたデータのハッシュを取ることで、トランザクション展性が解決されます。
Lightning Network と SegWit
BIPの1つで、Lightning Network(以下LN)というものがあります。これは、簡単に言うとペイメントチャネルを1対1から多対多にしたものです(ペイメントチャネルについてはこちら(英語))。これによってオフチェーンで少額取引を(ほぼ無限に)行うことができ、スケーラビリティ問題を緩和してくれます。
トランザクション展性(Transaction Malleability)について
SegWitは当初、Scalabilityではなくtransaction malleabilityの問題を解決するために発案されたらしいです。トランザクション展性についてのメモも書いておきます。
トランザクション展性とは
展性、malleabilityという言葉はもともと金属の板を叩いたときに薄く広がる性質を指す言葉です。すなわち、変化しやすいという意味でいいと思います。
トランザクション展性とは、トランザクションID(txid)をマイナーや悪意のある第三者が自由に書き換えられるというビットコインの脆弱性といってもいいものです。
なぜtxidを書き換えられるかというと、txidはトランザクション全体のハッシュして64桁の16進数にしたものですが、トランザクションの構成要素には、必ずしも重要ではないものが含まれるます。したがって、違うトランザクションで同じ意味を持つものを作れてしまうということです。これによって同じトランザクションでも違うハッシュ値をもつものが作れてしまいます。これによって、txidによってトランザクションをチェックしているウォレットでは残高の整合性がなくなるなどの問題があります。