ニュートリノ:ライトニングの明るい側面

posted in: Bitcoin, Lightning | 0 |
Reading Time: 2 minutes

まえがき

本投稿も前回に引き続き、Lightning LabsのメンバーBryan Vu氏によるライトニングブログ(投稿日:2018-10-17)を翻訳しました。モバイル用ビットコインアプリをより良いものにするために提案されているニュートリノの概念と技術的概略についてご紹介します。


image
本シリーズの以前の2つの投稿では、将来のライトニングユーザーを想定したキャロルが主人公でした。本投稿では、現在に時間を戻して、標準的なモバイル用ビットコインアプリを使っているアリスについてお話したいと思います。アリスが住んでいる現世界では、コンピュータプラットフォームとしてスマートフォンが大多数を占める状況になっていますが、現在のビットコインアプリは様々な問題を抱えています。それはセキュリティ、プライバシーおよび使いやすさの欠陥です。

現在のモバイル用ビットコインウォレットは中央集権サービスをベースとして作成されており、重大なセキュリティ問題を抱えています。「あなたが鍵を管理していないなら、それはあなたのビットコインではない」と幾度も言われ続けているように、中央集権サービスはユーザーのファイナンシャル情報(例えば、取引履歴)を漏洩するリスクがあります。一方で、中央集権サービスは、速く、使いやすく、少額のビットコイン保有者に対しては便利なサービスです。しかし、長くビットコインに浸かっているアリスとその友達は中央集権サービスに預けていたコインを失う経験をしており、彼女は自分で鍵管理ができるウォレットを探そうと決めました。

Goblet

そんなアリスのようなユーザーにとっての選択肢としてSPVウォレト(BIP37対応)があります。SPVウォレットは上記で述べたような中央集権サービスが抱えるリスクはありませんが、プライバシー問題のリスクを抱えています。さらに、現状のSPVウォレットは遅く、使いにくい傾向があります。アリスは遅いアプリが好きでなく、またプライバシーも重要視しているので、これらのウォレットでは満足できていません。

驚くことに、急激なビットコインの浸透とモバイルデバイスの増加にも関わらず、モバイルアプリ用の改善案が提唱されてか6年が立ちます。上記で述べた様々な問題を解決するべく、Lightning LabsのOlaoluwa Osuntokun (roasbeef) とAlex AkselrodはJim Posen (前Coinbase)と共同でニュートリノプロトコル(BIP157, BIP158)の提案をしました。


ニュートリノのメリット

分散化されたビットコイン用モバイルアプリにとっての挑戦は、全トランザクション履歴(現時点で約200GB)の中から瞬時に個々のユーザーに関係のあるトランザクションのみを取り出すことです。さらに、モバイルアプリが成功するためには、セキュリティ、プライバシーそして質の高いユーザー体験を提供する必要があります。ニュートリノプロトコルは、低電力プロセッサー、限られたストレージ容量とデータ通信量、断続的な電力および不安定なネットワーク接続性に縛られたデバイス上でこれらの必須要件を助長するためにデザインされたプロトコルです。

セキュリティ – 上記で述べたように、中央集権サービスには落とし穴(ハッキング対象箇所)が存在するため、アリスのような上級者または多くのビットコイン保有者は、通常彼ら自身で鍵管理をするのを好みます。ニュートリノは、ユーザーによる鍵管理ができるアプリをより速く、使いやすく、そして魅力的にするためにデザインされています。さらに、ニュートリノは競合したトランザクション情報*1を解決するための新しいセーフガードを含んでいます(これは特にライトニングネットワークを使うユーザーにとって役に立ちます)。

プライバシー – ファイナンシャルソフトウェアの必須要件の1つにプライがシー保護があります。ユーザーの残高や取引履歴はユーザーの同意なしで公開されてはいけません。BIP37のSPVクライアントは確率的アドレスリスト(これからおおよその取引履歴を追うことができます)を含むユーザー情報の多くを漏らしています。また、中央集権サービスもこの情報をすべて保有しておりプライバシー保護の保証はありません。ニュートリノはこれらの情報を第3者に漏らしたくないモバイルユーザーの為に改良されたプロトコルです。*2

スケーラビリティと非中央集権 – ニュートリノプロトコルはビットコインフルノードの計算パワーが少なくて済みます。これはニュートリノクライアントに送信されるフィルターの計算は1度だけでよく、そのフィルターは全クライアントに対して同じものです。BIP37のSPVプロトコルにおいては、フルノードは各クライアントに対して異なったアウトプットを計算し送信する必要があります。もし1台のフルノードが多くのモバイルクライアントにそれぞれのデータを提供する場合、ものすごい計算パワーが必要となり重荷となるでしょう。

検閲耐性 – ニュートリノクライアントはそれ自身が鍵を保持し、自身のトランザクションをブロードキャストするので、ビットコインのパーミションレスかつ検閲耐性な特徴をさらに拡張できるでしょう。


技術的詳細

より技術的に関心のある読者のために、次の章ではニュートリノプロトコルの概要についてお話します。さらに詳細な情報はBIP157BIP158を参照してください。

GCS filters(Golomb-Coded Set filters)

大雑把に言うと、ニュートリノはビットコインブロックチェーンのそれぞれのブロックに対応する“フィルター”と言うことができるでしょう。このフィルターは1つのブロックに含まれるそれぞれのビットコインアドレスを識別するためにゴロム符号(Golomb-Rice coding)を使用しています。ニュートリノフィルター(所謂、ゴロム符号におけるGCS filters)は、1つのブロックをよりいっそう圧縮することができ、15KB以下のサイズに収めることができます。ちなみに、元の1ブロックはその250倍以上の大きさで4MB(Segwitにより実質1MBから4MBへ拡大)以下となります。

この圧縮によってネットワーク帯域幅の狭いデバイスでもブロックチェーンを確認し、新しくマイニングされたブロックがユーザーのウォレットに関係あるかを確認することができます。このプロセスに関するステップは以下の通りです。


ステップ1 フィルター作成:新しいブロックがマイニングされるごとに、フルノードはGCS filtersを作ります。このフィルターはニュートリノクライアントに提供されます。

ステップ2 フィルターの観測と比較:約10分間隔でニュートリノクライアントはこのフィルターを受信します。そして、そのフィルターからユーザーに関する新しいトランザクションデータが存在するかを確認します。

ステップ3 関係のあるブロックのダウンロード:もしフィルターがユーザーが必要とするトランザクションデータが含まれていると指し示したら、ニュートリノクライアントは「切り取った」ブロック*3をフルノードに対して要求します。このブロックは署名データ(または“witness data”とも言う)を除くすべてのトランザクションデータが含まれています。ブロックのダウンロードをし、関係あるトランザクションを取り出します。

ステップ4 ウォレットの残高の更新:取り出したトランザクションデータからウォレットの残高を更新します。

この方法では、ユーザーのアドレスを特定する情報はネットワークへいっさい送信されません。また、ユーザーのウォレットとブロックチェーンのトランザクションデータの比較検証作業はユーザーのウォレット内で行われます。これはBIP37による信頼できないリモートノードによる検証との違いです。


同期(Syncing)

ニュートリノノードの仕組みは上記で説明しましたが、アリスが彼女自身のニュートリノ搭載ウォレットを最初に立ち上げる時、最新のブロックチェーンの状態になるまで同期をする必要があります。また、ウォレットがオフライン状態で一時的にこの処理が中断していた場合も、最新のブロック状態になるためにそこまでキャッチアップする必要があります。この同期は以下の4つのステップからなります。


ステップ1 通常のビットコインクライアントやSPVクライアントのように、ニュートリノクライアントはブロックヘッダのチェーンをダウンロードし検証します。これは、ブロックチェーンの各ブロックの位置を特定し、プルーフオブワーク(PoW)を検証するためです。各ヘッダーは80バイトで、ビットコインブロックチェーンの合計ヘッダーサイズは約40MBです。

image

ステップ2 ニュートリノクライアントは上記で述べたブロックヘッダーに対応する「フィルターヘッダー」をダウンロードします。ニュートリノプロトコルでは、各ブロックはGCSフィルターを含んでいます。フィルターヘッダーは、ニュートリノクライアントに各ブロックに対応するGCSフィルターと連動するための情報です。この詳細はBIP157に記載されています。

各フィルターヘッダーは32バイトで、このヘッダーに必要なデータ通信量の合計は約20MBです。ウォレットを初期セットアップする以前までのブロックチェーンのヘッダーは、一度検証が終わると捨てるため、ストレージ容量の節約になります。各ヘッダーのダウンロードの検証は1度限りで良いのです。

ステップ3 ウォレットのセットアップが完了して以降の処理は、各ブロックのGCSフィルターのダウンロードをします。このフィルターのダウンロード容量は月に70MBですが、このフィルターは保存する必要はありません。

ステップ4 ニュートリノクライアントは、フィルターをチェックすることで、そのウォレットに関係のあるトランザクションかを判定します。そして関係があれば、「ストリップドブロック」をダウンロードし、必要なトランザクションを抜き取ります。


初期同期のプロセスは典型的なモバイルデバイスでは数分間かかるでしょう。ニュートリノクライアントが保存する合計ブロックーチェーンデータは約数十MBです(ブロックチェーンフルノードは約200GB)。初回の同期後は、GCSフィルターのおかげで通信データ量はかなり少なくて済みます。ただし、ニュートリノクライアントはフルノードよりもデータ通信量は少ないですが、BIP37のSPVクライアントに比べると多くのデータ通信が必要になります。必要なデータ通信量は多くのモバイルデバイスにとっては許容範囲であり、プライバシーとセキュリティー向上のためのトレードオフは十分に価値あるものだと思います。さらに、ニュートリノはフィルターとブロックデータを考慮しバッチ処理と並行処理を可能とする設計になっており、たとえより多くのデータ通信が必要になったとしても、ユーザー体感はより滑らかで応答性のあるものになるでしょう。


今後の開発

処理性能

上記で述べたように、ニュートリノプロトコルは断続的なネットワークと電力に縛られたデバイス上で動くように設計されています。しかし、lndに実装されている現状のニュートリノはまだ完全に最適化がされておらず、さらなる改良が現在進行中です。

Block retrieval

ニュートリノクライアントは、ブロックやフィルターを(P2Pのビットコインネットワーク外も含め)どこからでもダウンロードするこができます。さらなるプライバシー向上が見込まれるブロック検索の方法として「プライバシー情報検索」があります。現状では、トーアがプライバシー保護として適当な手段ではあります。

Neutrino serving neutrino

(BIP37で使われるフィルターと違って)ニュートリノで使われるフィルターは全ノードに対して同じなので、ニュートリノノードは、他のニュートリノノードにそのフィルターを提供するように設定することができます。これはニュートリノクライアントがネットワークへ貢献することを可能にするでしょうし、またフルノードの処理コストを軽減できるかもしれません。

Filter commitments

ソフトフォークによって、マイナーによってGCSフィルターのハッシュ値がブロックヘッダーに直接追加されることが可能になり、これによりフィルターヘッダーのチェーンデータが不要になったり、フルノードがニュートリノクライアントに不適切なフィルターを送りつけるような悪意ある行為を除外できるようになります。また、ニュートリノフィルターはブロックチェーンのスキャンや探索を瞬時にする必要があるアプリケーションにも使用できるでしょう。

Developer tools

通常のブロックチェーンデータの検索のために、開発者がニュートリノを使えるようにするためのAPIの開発に取り掛かっています。


結論

BIP157/158に準拠したニュートリノクライアントであるlnd0.5Lightning App alphaをリリースできたことを大変光栄に思っています。これらはまだテストネット版ではありますが、メインネット版ニュートリノも開発中です。ニュートリノはbtcdにもサポートされ、またBIP158のサポートもbitcoind(BItcoin Core)にマージされました*4。長期的には、多くのノードオペレータやビットコイン開発者によってニュートリノがサポートされ、ユーザーがプライバシーの保護やセキュリティリスクを低く保ちながら、よりよりユーザー体験ができるようになることを望んでいます。ニュートリノが次世代モバイルウォレットのためにより改良された基礎技術を提供できることと信じています。


脚注

*1.軽量クライアントが特定の資金(例えば、特定のUTXO)が使用されたかをフルノードへ確認した場合、フルノードは故意に間違った情報(この場合、まだ未使用であること)を返す可能性があります。この攻撃は、通常の支払い場面では、その支払いに関係する当事者は再支払いを要求するか、支払いが完了するまで商品を購入者へ渡さない、ということができるので殆どありえない攻撃です。しかし、ライトニングネットワークの場合、ノードは常に「不正なチャネル閉鎖をするトランザクション」がないか監視する必要があり、もしそのトランザクションを見つけられなかった場合、その資金を失う結果になります。

ニュートリノにおいては、異なるピアから競合するフィルターが送られてきた場合、その競合したブロックを見つけ、その1ブロック全体をダウンロードします。そのブロックからどちらのピアが正しいのかを自動的に判断することができます。BIP37のSPVクライアントではユーザーに対してこのアラートは出せますが、自動的に競合を解決することはできません。


*2.ニュートリノを実装したクライアントでもウォレットの情報の幾分かの漏洩を防ぐことはできません。これは、悪意あるノードが、モバイルウォレットがどのブロックをダウンロードし、ブロックにまたがってどのアドレスが再利用されたかを観測できるからです。これを緩和するには、上記ブログで述べた「プライベート情報検索」の活用を模索しています。それでも、ニュートリノは他のどのモバイルクライアントよりもユーザープライバシーは高いと信じています。


*3.Segwitの採用によって、ビットコインの取引署名(witnessデータ)は既存のデータ構造から分離されました。ニュートリノクライアントはこの分離されたwitnessデータは不要で、「切り取った」ブロックのみのダウンロードで済み、結果的に多くの帯域帯の節約に繋がります(潜在的に50%以上の節約)。


*4.BIP158がbitcoindにマージされましたが、一方でまだBIP157はマージされていません。そのためニュートリノのフィルターをまだbitcoindではサポートできない状況です。今後数ヶ月にわたってニュートリノの完全なサポートを追加する作業が進行中です。


コメントを残す