ビットコインのSPVとは?フルノードって何?

ビットコインのSPVとは?フルノードとの違いは?

SPV(Simplified Payment Verification)とはビットコインのトランザクション(取引)の検証を行う方式であり、satoshi nakamotoのホワイトペーパーにて言及されています。

SPVはマークルルートを使うことでブロックチェーンのデータ全てをダウンロードせずに検証を行うことが出来ます。小容量なスマホでも利用出来るため簡易ノードや軽量ノードとも呼ばれています。

マークルルートとは公開鍵暗号の開発者、Ralph C Merkle氏が1979年に発明したマークルツリー(データ要約技術)によって得られる頂点のハッシュ値であり、トップハッシュやマスターハッシュとも呼ばれます。

公開鍵暗号とは公開鍵と秘密鍵からなるデータの暗号方式です。一方ハッシュとはデータを変換して得られる文字列で、これを得る関数をハッシュ関数と言います。暗号は復号可能ですがハッシュの復号は不可能です。

ノードとはネットワークに参加する端末を指し、マイニング主体とウォレット主体の2種類に分類が出来ます。前者はコイン採掘、後者はコインを保管する財布を意味します。

一方SPVとは反対に容量は必要としますがデータを全てダウンロードするノードをフルノードと呼びます。フルノードは検証だけでなくシステム自体の管理・監視も行ってネットワークに貢献しています。

フルノードはBitcoin Core 0.11.0へのバージョンアップによってアーカイブノードと剪定ノードに分類される形となりました。前者はバージョンアップ以前同様、全てダウンロードして全て保存します。

Bitcoin Coreとはビットコインを利用する際必要なオープンソースファイルです。ホワイトペーパーを基に開発され、BIP(Bitcoin Improve Proposals)により誰でも改善の提案が行えます。

一方剪定ノードは文字通り剪定するフルノードです。最初は全てのデータをダウンロードしますが、不要なものを削除(剪定)し、全てのUTXOと直近のブロックのみを保存することで負担を削減します。

UTXO(Unspent Transaction Output)とは日本語で未使用トランザクションアウトプット、つまり送金されてからまだ使っていないトランザクション(取引データ)を意味します。

トランザクションには送金されたビットコインの確認をインプットと送金のアウトプットがあります。そのインプットをする中でまだアウトプットせずにウォレットに保管されるデータをUTXOといいます。

ブロックチェーンのサイズは150GBを越えるほど(2018年2月現在)でありフルノードの運用は大きな負担が掛かります。そのため、必要なデータのみで検証を行ってネットワークに参加できるSPVが普及しています。

スケーラビリティ問題について

1MBが容量のブロックはおよそ10分で1つ生成されます。しかしその生成(マイニング)が取引に間に合わないと送金処理が遅れてしまいます。この処理能力問題をスケーラビリティ問題と言います。

処理が遅いと時間が掛かるのはもちろんですが、処理を優先して貰いたい場合は高い手数料を支払う必要も出てきます。

クレジットカードの処理速度が平均2000tps(Transaction per Secondの略。秒間の取引数)に対しビットコインは7tpsほどしかありません。

この処理速度を高めるため、ブロックサイズを引き上げる案がありますがこの場合、フルノードの負担をさらに増やしてしまいます。

スケーラビリティの解決策

このスケーラビリティの解決方法としてSegwitとライトニングネットワークが提唱されています。それぞれ見ていきましょう。

Segwit

前述したようにブロックサイズとフルノードの負担は比例します。そのためBitcoin Coreが提唱したSegwit(Segregated Witness)というサイズ圧縮が2017年8月24日に実装されました。

SegwitはscriptSig(署名)をトランザクションから分離させて管理することで取引データの改ざん防止と縮小を可能にします。サイズ縮小でスケーラビリティ、改ざん防止はトランザクション展性を解決します。

トランザクション展性(マリアビリティ問題)とは、トランザクションIDだけを変更出来るビットコインの脆弱性であり、二重支払いやデータの不整合を引き起こします。Mt.Gox事件もこれによるものです。

Mt.Gox事件とは、2014年に東京のビットコイン取引所Mt.Gox(マウント・ゴックス)が約115億円相当のビットコイン(当時レート)をトランザクション展性を突いたサイバー攻撃によって消失した事件です。

しかし真相は社長のマルク・カルプレスの着服によるものでした。当時は仮想通貨がほとんど知れ渡っていなかったため、仮想通貨に対する不信感が高まってしまった事件であったと言えます。

また、Segwitには新たな段階としてSegwit2xという計画も存在します。これはSegwitによるデータに加えてさらに容量を1MBから2MB変更(ハードフォーク)するものでしたが延期が発表されています。

ハードフォークとは、システムの仕様を新しくして旧仕様との互換性をなくすものであり仮想通貨の分裂(旧仕様と新仕様)が発生します。

DAO事件によるイーサリアムの分裂(ETHとETC)やBTCから分裂した、ブロックサイズが最大8MBであるビットコインキャッシュ(BCH)がこれに当たります。

ハードフォークとは別にソフトフォークという仕様変更も存在します。こちらは新仕様を旧仕様にも適用させるため仮想通貨の分裂は起こります。前述したSegwitはこれに当たります。

ライトニングネットワーク

もう1つの解決策としてライトニングネットワークが挙げられます。これは取引を中継所を通じてライトニングネットワーク、つまりブロックの外(オフチェーン)でも行えるようにするものです。

Segwitはこの為の準備として実装されましたが、ライトニングネットワークも2017年12月にリリースが実現しました。イーサリアムにも同様にライデンネットワークがありますがこちらはまだ実装されていません。

さらにはPlasma(プラズマ)というプロジェクトが2017年8月にイーサリアム創始者のVitalik Buterin氏とライトニングネットワークの共同開発車のJoseph Poon氏によって発表されました。

基本的にはライデンの構造と同じですがこちらはオフチェーンではなく実際にプラズマネットワークを利用して処理を行います。こちらも実装は未定ですがライデンとの共存でイーサリアムの能力向上が期待されています。

簡易的システムSPV。セキュリティは大丈夫?

これまでビットコインが抱える問題、スケーラビリティを紹介してきましたがここでSPVに話を戻しましょう。Mt.Goxやコインチェックの事件があったため仮想通貨を扱うセキュリティが気になるかと思います。

特にSPVは簡易的なノードであるためセキュリティも簡易的でフルノードに劣るのではないか?という意見が少なくありません。しかしフルノードがいてくれることでSPVはセキュリティを保つことが出来ます。

フルノードは全てのブロックデータをダウンロードするため、単体での検証と共に取引の不正確認も行っています。SPVはこれを信頼することでマークルルートによるデータのみで検証を行うことが出来るのです。

SPVウォレットについて

コインチェックやMt.Goxは取引所でありコインを保管する場所ではありません。コインの保管にはウォレットが推奨されています。

ウォレットには大きく分けてフルノードによる「フル(完全)クライアント」、サーバーを介する「サーバークライアント」、そして簡易ノードの「SPVクライアント」の3種類に分類できます。

フルクライアント

フルクライアントは先ほども紹介したBitcoin Coreが代表的です。公式ウォレットなので安心感はかなりありますがインストールには数10GBの容量が必要かつ数日掛かってしまうことが難点です。

サーバークライアント

サーバークライアントはElectrumが代表されます。SPVによる軽量クライアントですがP2P(ユーザー同士の非集権的)システムではありません。代わりにElectrumサーバーを通して情報を受け取ります。

その性質からElectrumはWEBウォレットであると思われますが基本的にはオフラインで使用可能ですし秘密鍵はサーバーに預けません。そのためWEBウォレットに比べかなり安全であると言えます。

SPVクライアント

最後にSPVウォレットですが、代表的だったMultiBitが2017年7月にサービスを終了しています。そこで今回はスマホ(iOS)対応のSPVクライアント、bread walletを紹介していきます。

bread walletはiPhone4s以降のiOS対応SPVクライアントです。秘密鍵などのセキュリティは本体のパスワードやTouchIDで暗号化され、ユーザー以外は読み取り不可能な構造となっています。

さらにApple基準のアプリなのでサンドボックス環境も安心です。サンドボックスとは外部からの影響を抑えることでバグなどから保護するものです。

やはりSPVはスマホ対応ということで始めやすいかと思います。コインは取引所ではなくウォレットに保管し、コインチェックのような事件をユーザー側からも防いでいきましょう。