お世話になっています。Osuke(@zoom_zoomzo)です。今回はLayerXのR&Dチームで力を入れて開発しているZerochainというブロックチェーンについて紹介していきます。
Zerochainは秘匿化されたデータを扱うためのブロックチェーンとして設計されています。つまり、本来であればブロックチェーン上に記録されるデータは全て公開され誰でも見ることが可能ですが、Zerochain上に記録されているデータは暗号化されているため第三者が閲覧することはできません。(一方、後述する閲覧専用の鍵(Decryption Key)を利用することで、プライバシーを維持しつつ会計や税務のための監査を実施することも可能になっています。)
要は、ブロックチェーンの代表的な課題の一つである「プライバシー」の問題を暗号学的な手法で解決するために研究開発を行なっています。
このような秘匿化の性質をZerochainがどのように機能させているのかこの記事では解説していきます。
また、当プロジェクトは全てオープンソースで行われていて、すでに実際にブロックチェーンを動かしてトランザクションを送信することができます。以下のGithubのコードも参考にしてください。
Zerochainの特徴
Zerochainのゴールは、さまざまな秘匿化データを利用したアプリケーションを開発するための土台となることです。
「秘匿化データを利用したアプリケーション」の分かりやすい例は秘匿送金です。例えば、イーサリアムのスマートコントラクト上に記録されたコインの残高は公開されており、世界中の誰でも見ることができてしまいます。つまり、これは自身の銀行口座の中身をインターネットを介して世界中に公開しているのと同じことです。
Zerochainではこのようなプライバシーの問題を解決するために下図のように残高は全て暗号化して記録しています。
同様にコインの送金額も暗号化されているので第三者はその額を知ることはできません。
詳しくは後述しますが、送金時の残高更新時も全て暗号化されながら計算されるのでアドレスに紐づく情報が一切外部に漏れることはありません。このようにブロックチェーン上のデータを全て暗号化して保存するという一見シンプルなアプローチがZerochainでのプライバシー保護のベースの仕組みとなっています。
また、秘匿ブロックチェーンとして有名な例はzCashやMonero, Grinなどがあげられます。秘匿化のためのアプローチはそれぞれ異なりますが、Zerochainが既存の秘匿ブロックチェーンと比べて特徴的なのは、これらは全てUTXOベースであるのに対し、Zerochainはアカウントベースのブロックチェーンであるということです。つまり、アカウントに紐づくUTXOを隠すのではなく、Key-Valueのmapping構造でそれらの要素を暗号化しています。
アカウントベースでの秘匿ブロックチェーンはZerochainが世界で初めての実装事例となります。
そして、このアカウントベースでの秘匿化によって得られる代表的なメリットは以下のことがあげられます。
- ゼロ知識証明の計算コストの削減
ゼロ知識証明の計算コストは算術回路の乗算ゲート数(に似た数字)で定量化されることが多く、Zcashでは106,604 constraintsであるのに対し、Zerochainでは18,278 constraintsと83%の削減に成功しています。(アドレス秘匿化除く)
- on-chainストレージコストの削減
UTXOベースだと永遠に増大するUTXOやその他メタデータによりストレージのコストが大きな問題となります。Zerochainではアカウントベースであるのであるアカウントが何回秘匿送金を行なってもそのアカウントに紐づく暗号化残高が書き換えられるだけでストレージのコストが増えることはありません。
- シンプルなペイメント以外のアプリケーション応用への柔軟性
UTXOという枠組みに依存したペイメントの秘匿化だけではなく、秘匿したホワイトリスト付きのアセットや匿名投票、あるいは任意の計算の秘匿化などさまざまな機能をより実装しやすくなります。
一方、アカウントベースでの秘匿化の欠点として、アドレス(mapping構造のKey側)秘匿化実装の複雑性やフロントランニング対策の必要性などがあげられます。
ZerochainとSubstrate
ZerochainはParityによって開発されているSubstrateというブロックチェーン開発のためのフレームワークをベースにして実装されています。より具体的には、Substrateが提供するP2Pネットワークやコンセンサスアルゴリズムの仕組みをそのまま活用し、その上に秘匿化のためのスキームを構築しています。
Substrate上にゼロ知識証明を適用し秘匿化を適用したブロックチェーンはZerochainが世界で初めてです。そして、将来的にはPolkadotに接続する秘匿化のためのブロックチェーンとして機能させることが可能です。
Substrateのより詳しい解説は以下をご覧ください。
Zerochainの詳しい仕組み
ここでは、Zerochainですでに実装されている送金額と残高の秘匿化のスキームについて解説していきます。大きく分けて、Zerochainで使われている鍵のコンポーネント、暗号アルゴリズム、ゼロ知識証明について見ていきます。
鍵コンポーネント
Zerochainでは秘匿化の性質と多様な機能を提供するために複数の鍵ペアが用いられ、それらの利用用途に合わせて権限を分けることができるようにコンポーネント化されています。
上図の上から下にいくにつれて権限が弱い鍵になっていきます。
- Origin Key: 通常のブロックチェーンでの秘密鍵に相当
- Proof Generation Key: 後述するゼロ知識証明に用いられる鍵
- Signing Key: 秘匿性を考慮して抽出されるワンタイム署名鍵
- Verification Key: 秘匿性を考慮して抽出されるワンタイム署名検証鍵
- Decryption Key: アドレスに紐づく残高や送金額を復号化できる鍵
- Encryption Key: 残高や送金額の暗号化に用いられる鍵(アドレスに相当)
このように権限が分けられていることにより、それぞれの鍵が持つ機能を特定化することができます。例えば、Decryption Keyを第三者に渡しただけではそのアドレスに紐づく残高を奪うことはできません。その残高を復号化して見ることができるだけです。つまり、あるアカウントに対する監査用の鍵として機能させることができるのです 。
加法準同型暗号
上述したようにZerochainで扱われる送金額や残高のデータはすでに全て暗号化されています。しかし、秘匿化の性質を得るためには送金時の残高計算の時も暗号化されたまま送金額が加えられたり引かれたりする必要があります。
そこで、Zerochainでは加法準同型暗号という特別な性質を持つ暗号アルゴリズムを利用し、これを実現しています。名称から分かるように足し算(や引き算)を暗号化したまま行うことができる暗号手法です。より具体的にはLifted-ElGamal暗号という暗号化と加減が効率的なアルゴリズムを用いています。
- 暗号化
送金額をv、擬似乱数をr、楕円曲線上の生成元をG、秘密鍵をsとして以下のような暗号文を計算します。(秘密鍵に対応する公開鍵はsGと表すことができます。)
暗号文:
- 復号化
復号化は与えられた上記の暗号文と対応する秘密鍵sを用いて以下のように復号化することができます。
復号化された値はvGという形で得られるのでvを得るためには離散対数問題を解く必要があります。そのため、実務的にはvは32bit程度の整数(10進数で43億弱程度)であらかじめvG(v=1,2…)に相当する値を計算しておく必要があります。(一方、”s” や ”r” は32bytesの巨大な数になるので現実的な計算時間で離散対数問題を解くことはできません。)
このようにLifted-ElGamalは復号化は非効率ですが暗号化やゼロ知識証明との相性の良さを理由に暗号アルゴリズムとして採用しました。ちなみに、暗号化したままの加法は以下のように計算できます。
- 加法性
暗号化された10コインを残高として持つユーザーに対して、新たに暗号化された5コインが送金された時の状況を考えていきます。つまり、上記のvをv = 10(残高)、v’ = 5(送金額)として暗号文の足し算を行ってみます。
上式において、同じユーザーに対する暗号文の加算なので秘密鍵sは共通である一方、擬似乱数は暗号文ごとに変化するのでrと異なるr’が用いられています。つまり、更新後の残高の擬似乱数部分はr+r’に相当しています。
さらに、これは最初に見た暗号文と同じ形をしており、同じように秘密鍵sを用いて復号化し15という値を得ることが可能です。
以上の暗号アルゴリズムで残高や送金額は暗号化され、暗号化残高と暗号化送金額と足し算、引き算が送金時にオンチェーン上で計算されることになります。
ゼロ知識証明
ゼロ知識証明は、証明者がある値を明らかにせずに計算の結果が正しいことを証明する暗号学的な手法です。少し分かりにくいですが、ブロックチェーンの文脈で言うと、オンチェーンに送信するデータの妥当性をもたらしてくれます。
例えば、アリスがボブに10 coinを秘匿送金する例を考えていきましょう。Zerochainでは送金額は暗号化されているので、64バイトのバイト列が送信されます。
オンチェーンのノード達はこのバイト列を見て、アリスが不当なトランザクションを送信しようとしていないか検証することは可能でしょうか?つまり、アリスは本当に”10coin”を暗号化しているのでしょうか?アリスの暗号化残高は本当に”10coin”以上あるのでしょうか?さらに、それらの暗号文は本当にアリスやボブだけに復号可能な形で暗号化されているのでしょうか?
ただの、64bytesのバイト列を与えられただけではノードはこれらの事象を検証することはできません。つまり、”10coin”という数字をノードに隠しながら以上のような事象の妥当性を証明することができるのがゼロ知識証明になります。
Zerochainでは特にzk-SNARKsというゼロ知識証明のシステムを現在は導入しています。そして、具体的にZerochainの秘匿送金のスキームでは以下のようなことを証明・検証しています。
- 送金額は正しい範囲か?(マイナスの値などを送金しようとしていないか)
- 送金者の残高は正しい範囲か?(送金後にマイナスの残高にならないか)
- 送金者の公開鍵を用いて正しいアルゴリズムで正しい値が暗号化されているか?
- 受け手の公開鍵を用いて正しいアルゴリズムで正しい値が暗号化されているか?(3と同じ値が暗号化されていなければならない)
- 2で証明している残高は本当に現在の送金者の残高と一致しているか?
- 署名検証鍵は正しく計算されているか?
以上のことを証明しているゼロ知識証明が送金額の暗号文とともにトランザクションとして送信され、オンチェーン上でゼロ知識証明の検証が行われます。
より詳しいゼロ知識証明の仕組みについては手前味噌ながら昨年のHiConの僕のスライドが日本語ではよくまとまっているので参考にしてください。
最後にまとめとして以下がZerochainのスキームの全体像です。
より詳細な仕様については実装コードをご覧ください。IssueやPRsも大歓迎です!
What’s coming next?
ZerochainではSubstrateベースでのzk-SNARKsを利用したConfidential transacitionはすでに実装されていますが、まだ多くの機能が欠けています.
- セキュリティ対策
DOS攻撃やFront running攻撃の対策
- ブラウザでのトランザクション生成
現在は署名や復号などの一部がWasm化されブラウザで実行されているが、ゼロ知識証明などもブラウザで実行できるようにしUXを向上
- アドレスの秘匿化
残高・送金額だけでなくアドレスの秘匿化も導入
- 他のゼロ知識証明システムの導入
ゼロ知識証明にはさまざまな種類があり、トラスト性の有無などのトレードオフが存在します。そのトレードオフを考慮して最適なゼロ知識証明システムの導入
- 他ブロックチェーンへの適用
ここで解説してきたZerochainのスキームはSubstrateだけではなく、修正を加えることでEthereumなどの他のブロックチェーンにも適用することが可能です。具体的には、ゼロ知識証明や署名で用いられる楕円曲線の変更などです。
さらに、通常ウォレット、監査用の特殊なウォレットやそれに付随するエクスプローラーなどの開発エコシステムの発展も進めていきます。
以上のように、まだまだ研究開発することが多くあり、これからまさにスタートするプロジェクトです。Zerochainは全てRustで実装されており、安全な暗号実装などの技術が求められます。Zerochainを一緒に作っていける仲間を絶賛募集していますで、ぜひ気軽にランチでも行きましょう!
僕のツイッター(@zoom_zoomzo)にDMか、以下のWantedlyからご連絡お待ちしています。