「これは、ブロックチェーンのスケーラビリティとファンジビリティの呪文だ」

ビットコインの開発者が集まるIRCに突如あらわれ、「mimblewimble」（むにゃむにゃ）を唱えたトム・エルビス・ジュダソーは、フランス語版ハリー・ポッターにおいて暗黒卿の本名として知られる仮の名前だった。そこには、ブロックチェーンをオンチェーンで1000倍スケールさせるアイデアと、その手法が記されている。

なぜ、それが可能なのか。そして、それをどのように活用すればいいのかーーー。

※本稿は、10月8日から9日にかけてミラノで開かれたScaling Bitcoin 2016において、Andrew Poelstra氏が行なったプレゼンテーションの翻訳です。一部、読みやすさのために改変を加えていますので、原文を参照したい場合はスケーリングビットコイン公式サイトから研究論文、プレゼンテーション、書き起こしをご覧になれます。

Presenter: Andrew Poelstra (andytoshi)Link: Transcript, Youtube

こんにちは。BlockstreamのAndrew Poelstraです。今日はMimblewimbleの話をしにきました。Mimblewimbleは私の発明ではありません。暗黒卿が発明しました。今日話す内容はMimblewimbleのトランザクション構造について、ブロック構造について。そして、そのトラストモデルについて概説し、いかにビットコインと同等の強度を持つかについてお話します。ビットコインとは比べ物にならないほど、検証するデータは少なくなります。そして時間があれば、Mimblewimbleのスケーラビリティをさらに拡張するためのプロトコルについても話す予定です。

まず初めに、このペーパーの歴史について話しましょう。これは、少し前のニュースでした。

Mimblewimbleの歴史

ことが起こったのは8月2日、およそ2ヶ月前のことです。IRCに”majorplayer”のニックネームを付けた誰かが、「.onion」リンク（訳注：Torを経由しなければアクセスできないディープウェブ）を添えて「私がこのペーパーを書いた」とだけ書き退出しました。私とブライアン・ビショップは、そのリンクから”mimblewimble.txt”というテキストファイルを取得しました。

署名者は”Tom Elvis Jedusor”。これは、ハリーポッターに登場するヴォルデモート卿のフランス語版本名として知られる名前です。実名と考えるのは難しいでしょう。

私がMimblewimbleに出会った時、非常に驚きました。それは私が取り組んできたこと（Elements; Blockstream社のOSSで、サイドチェーンの実装)そのものであり、さらにパワフルでした。その後一週間は、Mimblewimbleを私の取り組みと比較し、理解することに努めました。私が思うに、これは私がElementsでやろうとしていたことと同じです。

2ヶ月以上、私はペーパーで提起された課題 — よりスケーラビリティを高めること — について考察をしてきました。私はヴォルデモート卿ではありません。誰がやったかも知りません。最近も、彼は誰なのかと何度も聞かれましたが、私は何も知りません。

Mimblewimbleとは何か？

Mimblewimbleは、秘密を漏らすことを防ぐためのハリー・ポッターの沈黙呪文です。要するに、これはファンジビリティ（代替性）の呪文といえます。私はMimblewimbleが「それ」を説明するための用語だとは思いませんが、少なくとも、ヴォルデモート卿のペーパーはブロックチェーンのためにデザインされています。ブロックチェーンの分割は、ブロックの拡張またはその他の方法でソフトフォークすることで、互換性があるように設計することができます。当然、ビットコインにもこれは当てはまり、Mimblewimbleをサイドチェーンとして追加することで、オリジナルチェーンの上でスケーラビリティとファンジビリティを向上させることができます。

ビットコインにおいてトランザクションは、入力のリストと出力のリストを持ちます。入力は前のトランザクションの出力であり、すべての入力はトランザクション全体に署名する必要があります。署名は入力が所有者のものであることを証明し、トランザクションを送信するために用いられます。Mimblewimbleでは、任意のスクリプトを許可したり、複雑なスクリプトシステムを組み込む代わりにEC Keys（楕円曲線鍵）だけを持ちます。

任意の２つのEC Keysは加算・減算することで、他の新しいEC Keyを得ることができます。もし私がいくつかの鍵に紐付いたコインを所有していて、他の誰かが私の鍵から彼らの鍵へとコインを動かしたいならば、我々はそれら２つの鍵の差分を取り、差分のマルチシグを作成することができます。そして、すべての入力の鍵とすべての出力の鍵を合計し、ただ１つの鍵を得ることができます。この鍵は、署名に使うことができます。したがって、Mimblewimbleは鍵の運用に関する手法だということです。

さて、これをビットコインに直接適用しスクリプトを無くすことはできるのでしょうか？ 答えはノーです。設計が根本から違います。

ですが、私たちにはマルチシグネチャとlocktimeがあります。単方向のペイメントチャネルを構築すれば、Mimblewimbleを利用することができます。理論上では、Mimblewimbleの上にライトニングを構築することができます。もっとも、これはエレガントな方法ではありません。しかし、非常にクールなアイデアです。（編注：ライトニング＝ライトニングネットワークのこと）

秘匿トランザクション

Mimblewimbleのトランザクションは、ビットコイン同様に入力を持っています。しかしビットコインとは異なり、入力は準同型暗号の値による秘匿トランザクションです。秘匿トランザクションを使うことで、楕円曲線の点のようにすべての入力の値を加算し、すべての出力を減算することができます。そして、合計がゼロの値になることを確認できます。他には何も確認できません。楕円曲線の郡における特別なゼロ値だけで、その他のどれもが不規則でランダムな楕円曲線の点のように見えます。

秘匿トランザクションの性質として面倒なのは、理論上において負の値も暗号化できてしまうことです。つまり -100万BTC と +100万BTC のどちらの出力も作れてしまう。この解決策はグレッグ・マクスウェルが開発したレンジプルーフ（範囲のプルーフ）を利用することです。2^256以内であれば、どんな値でもレンジ内であることが保証されます。これは、出力の鍵を隠蔽する知識証明です。

秘匿トランザクションは準同型暗号を利用しています。Mimblewimbleにおいては、鍵の署名と隠蔽に利用します。そして、鍵が既知であることを証明するためにレンジプルーフを利用します。秘匿トランザクションでは、点を合計するとゼロになります。そして、すべての入力値とすべての出力値はイコールになることも示します。つまり、あなたが行うことは楕円曲線上のランダムな点を合計することです。楕円曲線の点は、ゼロの値をとる暗号であることを証明する鍵です。したがって、Mimblewimbleでは受信者が送信者の鍵を知らずに鍵を受け渡すことができます。入力と出力の差分に署名することで、鍵を受け渡す。Mimblewimbleはこれを実現しました。

Mimblewimbleトランザクションの仕組み

[caption id="attachment_9993" align="alignnone" width="480"]

credit&source: Andrew Poelstra (andytoshi)[/caption]

さて、ここからは画像で説明してみようと思います。ここに２つのMimblewimbleトランザクションがありますね。２つのトランザクションが正しいことを検証する方法は、入力から古い楕円曲線の点を参照することです。減算し、エクセス値（Excess values）を取得すると、レンジ内の署名を確認できます。よって、トランザクションを検証することができます。有効性のチェックは、それぞれ異なる署名による署名データのリストではなく、署名の合計です。ネットワークを監視しているマイナーは、トランザクションを結合し、別の有効なトランザクションを得ることができます。これが、少し奇妙なエクセス値（Excess value）という存在です。このエクセス値は、最終的にまた別の署名となります。もはや、どの入力とどの出力が関連しているのかわからなくなります。これは、非対話型コインジョイン（Non-Interactive Coinjoin）、または一方向集約署名（One-Way Aggregatable Signature; OWAS）といいます。

つまるところ、これが何をもたらしたのでしょうか？ そう、ファンジビリティです。非対話型コインジョインです。これらのトランザクションのうちの１つは、他の出力を消費しています。

その入力を足して、もう一方の出力を引いてやると？ 逆も然りで、同じものが両サイドに存在していたら？ そう、切り捨てることができます。これらのトランザクションは、１つが有効なら他も有効なのです。非対話型でできるこの手法のことを、トランザクション・カットスルーといいます。要するには、私がいいたいのはスケーリングとプライバシー、そしてファンジビリティのベネフィットすべてをすぐに享受できるということです。エクセス値に関連性はないため、どの出力も追跡できません。

こうして、ブロックは単に１つのトランザクションになります。ヘッダーと１つのトランザクション、つまり入力のリスト、出力のリスト、エクセス値のリストです。

トランザクションの圧縮

[caption id="attachment_9998" align="alignnone" width="480"]

credit&source: Andrew Poelstra (andytoshi)[/caption]

この図は、Mimblewimbleの連続したブロックを表しています。白い四角はコインベースの入力となります。サイドチェーンでないと仮定すると、どのブロックにも50 mimblewimble coinsのようなコインベースを持ちます。これらはどこにも書き留める必要がありません。単に50コインのコミットメントを行うだけです。あなたは今Mimblewimbleチェーンを持っており、数人のユーザーがチェーンの中身を見てステータスを確認したいとします。ビットコインでは、すべてのブロックチェーンをダウンロードし、そのすべてを検証する必要があります、それら一連のUTXOが消去されない、あるいは無効にならず、有効であることを確認するためにすべてをリプレイする必要があります。できることは、すべてのブロックを送信することです。トランザクションは単にマージされているだけです。ブロックは個々のコミットメントにコミットします。

どの入力も、おそらくは異なるブロックによってコミットされています。あなたはこれら大量の入力が実際にトランザクションの出力になっていることを確認できます。コインベースを除いたすべての入力が、すべてのトランザクションの出力です。つまり、符号化される必要のないコインベース入力があるだけです。私たちが送るのはブロックヘッダーのリスト、UTXOのリスト、それらのレンジプルーフ、そしてエクセス値です。これらを何らかの方法で集約できれば…。しかし、各トランザクションのために公開鍵が100bytesほどの署名を追加しているのです。

ヴォルデモート卿のペーパーで提示されている方法でなら、なんの拡張をしなくても、すべて100bytesに圧縮することができます。ビットコインでは、1億5千万のトランザクションと過去のブロックチェーンデータ、そしてUTXOとレンジプルーフがあります。もしビットコインで秘匿トランザクションをやろうとすると、そのサイズは今のチェーンよりも遥かに大きくなります。具体的には、ビットコインのすべてのデータを秘匿トランザクションに変更すれば、およそ1テラバイトまで膨れ上がることになります。（編注：参考までに、ビットコインの取引履歴は現在およそ80GB）

検証のためにダウンロードするには、大きすぎるデータです。Mimblewimbleはそうではありません。あなたが必要とするのは、未使用出力のレンジプルーフだけです。つまり、データがブロック数とトランザクションの線形的な成長と共にスケールするということになります。とても小さなデータ量です。バルクデータは、圧縮可能なUTXOになります。なぜなら、全UTXOを圧縮したトランザクションを作成できるからです。そして、Mimblewimbleチェーンにおいては、対DoS攻撃のためのリソース制限に加えて、あなたは全UTXOサイズの制限を行うことができます。これにより、UTXOサイズが圧縮されたとしても、手数料市場が破壊されることはありません。Mimblewimbleチェーンは線形的に、無制限に膨張しますが、その膨張は極めて極めて遅いものになります。象の歩みよりも遅く、たとえ数十年経ったとしてもそれほど変わりません。エキサイティングでしょう？

トラストモデル

トランザクションのトラストモデル

次にMimblewimbleのトラストモデルについて説明しましょう。トランザクションは、あなたがコインを勝手に破棄したり発行したりできない非インフレ性があれば、有効と見なされます。「出力 - 入力 = エクセス値」です。また、トランザクションの所有者は、そのエクセス値で署名することになります。マルチシグは、常に当事者がこれを署名するのを検証し続けます。したがって、エクセス値になんらかの手を加えても問題ありません。つまり、信用の強度はビットコインとほぼ同じです。ビットコインでは、入力の所有者が署名した特定のトランザクションとデータがあります。あなたはこの画像から、これが何をもたらしたかが理解できると思います。

ブロックチェーンのトラストモデル

そして、ブロックチェーンについて。新たな検証者がチェーンデータをダウンロードすることについて考察してみたいと思います。検証者は何を伝えることができるでしょうか？ トランザクションが一度、ブロックに表示されたことです。すべてのブロックに、エクセス値がコミットされたことをチェックすることができます。検証者は、その暗号の存在と、暗号がなくならないことを知っています。トランザクションは事後に計算されることはありません。コインの総量も増えません。未使用の出力から現存する大量のコインを差し引いたら、正味はゼロになるはずです。

また、正確なトランザクションの順序も知りえません。私は、検証者に対してブロックチェーンが誤りであり、膨大なインフレを起こし、あるいは私がコインを盗んだことを伝えることもできます。ですが、私はこのような偽装工作から何かを得ることは出来ません（笑）。すべて私だけでプルーフオブワークをして、嘘をつき、検証者に作業をさせない限り。これは攻撃ではありませんが、もう１つのトラストモデルです。

ファンジブルな通貨である限り、ビットコインのトラストモデルとちょうど同じくらい高い強度を持ちます。そして、強大なスケーラビリティの向上がもたらされます。

Sinking Signature

[caption id="attachment_10001" align="alignnone" width="483"]

credit&source: Andrew Poelstra (andytoshi)[/caption]

ブロックのエクセス値を集約することはできるのでしょうか？ これは普通には難しいことですが、BLS署名を変形したトリッキーな方法を採ることで実現します。この方法を使うと、ブロックの中身を集約しますが、出力と入力をスワップして、頭にマイナスを付けてトランザクションを反転できる可能性があります。そして、エクセス値が署名しなければ…あなたにとってそれは無価値です。なので、これは問題です。過去のトランザクションをブロックの書き換えなしに反転させることはできませんが、突然これが当てはまらなくなります。つまり、すべてのトランザクションで現在のブロック高に署名し、反転したトランザクションをブロックに出現することができます。なので、同じブロックにおけるトランザクションの反転は些細なことであり、あまり重要ではありません。こうすることで、20gigabytesのデータ履歴を20megabytesにまで圧縮できます。1000倍節約できるわけです。多くのペアリングを行うことになるため、検証は少し遅くなります。

もっといいやり方があります。コンパクトSPVプルーフ（Compact SPV proofs）、またはプルーフオブプルーフオブワーク（Proof-of-proof-of-work）を利用するのです。これはサイドチェーンのホワイトペーパーに書かれています。すると、ヘッダーの多くをスキップできます。これで、あなたはビットコインのオリジナルチェーンと同じだけのディフィカルティで、同じだけのPoWを行えば300ブロックだけで検証できます。オリジナルのチェーンでは、仕事量に応じてブロックを数え、コンパクトチェーンでは、ブロックがターゲットを超えればブロックが持つすべてのエクセスを信用します。Sinking Signatureを使うと、これらのエクセスが前のブロック高と同じようにブロック高に署名することができ、署名上のすべてのエクセス値を集約できます。そして今、22 megabytesは1 megabyteに圧縮されました。最適化されていないコードでも、私のラップトップで20秒あれば検証できるようになります。検証のためのリソース負荷としては、かなり良いと思います。

編注：Sinking Signature[Poelstra, Kulkarni 2016]は、そのまま"沈む署名"を意味する。その由来は高さHの署名Sは、鋳造者により高さH'の署名S'(H'≦H)によって置き換えられうるという事実による。

[caption id="attachment_10002" align="alignnone" width="483"]

credit&source: Andrew Poelstra (andytoshi)[/caption]

これはトラストモデルの変更が少しだけ必要です。変更する方法は、圧縮の際に圧縮されたチェーンがオリジナルチェーンと同じだけの作業量を持つことです。ですが、あまりに違いが大きい。ビットコインでは、攻撃者がブロックを生成するチャンスはありません。

これを形式化してみましょう。ビットコインの40万ブロックがあったとして、この場合39.5万ブロックが証明された作業とします。もし40万ブロックよりも遥かに小さい仕事量なら、攻撃のチャンスはゼロです。コンパクトチェーンではその限りではありません。つまり、PoWで完全に5000ブロックを検証する必要があるということです。これにより、偶然ではない故意のブロック生成が起こらないことが保証できます。

そして、ジェネシスブロックから5000ブロックまでのコンパクトチェーンを与えます。つまりこれは、鋳造を動機づけるものです。そして、鋳造者がオリジナルのチェーンと同じくらい熱心にはたらくことを期待します。サトシが、鋳造のために努力することで結果メインチェーンを伸ばすことにつながることを提起している理由です。もう一点、過去のブロックを捨てることにも言及しておきましょう。かけら（tip）だけを検証するというものです。この問題点は、過去のデータを捨てることが崖を作るのと同義なことです。なぜなら、彼らは充分に働くことでチェーンの一部を鋳造することができるためです。

今後のロードマップ

Development, development, development!

現在、私はMimblewimbleのためのコンセンサスライブラリの開発を行なっています。楕円曲線のペアリングで詰まっており、まずはここを解決しなければなりません。コントリビュートやピアレビューのためにも、ソースコードはどんどん公開していく予定です。非常におもしろいプロジェクトです。コンセンサスライブラリが書き終われば、次はP2Pレイヤーやウォレットなどに取り掛かります。今よりもわかりやすいコードで、簡単に書けるようになると思います。もっと自由になります。ソースコードに何か加えるのにコンセンサスは必要ありません。

私達が作っているのは、サイドチェーンです。そう、サイドチェーンとしてのMimblewimbleです。未使用出力(UTXO)に加えて、ペグイン（peg-in）、ペグアウト（peg-out）にコミットできれば、次はすべてのペグイン、ペグアウトのエクセス署名に取り掛かれます。

以上です。ちょっと時間を過ぎてしまったので、ここらへんで。ありがとう。

Q&A

質問：使用予定の楕円曲線について。ed25519を使う予定か？

解答：良い質問です。トランザクションを作成する時、入力の合計は出力の合計と等しくなければなりません。したがって、どの手数料も明示的な非隠蔽出力として公開されているべきです。ネットワークに漂うように、マイナーは手数料の数量にコミットするでしょう。そして、マイナーは自身の出力を集約されたトランザクションに加算します。ブロックチェーン上には明示的な手数料があります。だから、楕円曲線暗号については secp256k1 は使えませんし、 ed25519 も使えません。スィンキング署名では、ペアリングの運用が必要です。私は自作の 341bit楕円曲線を使う予定です。でも、おそらくは将来的に置換することになると思います。

Scaling Bitcoin in Milan