Zerochainの進捗を隔週で簡単なレポートとしてお伝えしていきます。今回は7/1~7/12のアップデートレポートです。
今回のアップデートは主に以下の通りです。
- polkadot.rsでイベントのサブスクライブ対応
- ZFaceの基本機能実装およびCLI操作が可能に
- Zerochain Bookの公開
- 秘匿化アセットMint機能の追加
Zerochain自体の仕様概要については以下の記事でまとまっています。簡単に言うと、zk-SNARKsをベースにしたSubstrate上のアカウントベースブロックチェーンです
polkadot.rsでのイベントウォッチ機能追加
Zerochainとは独立的にpolkadot.rsというライブラリの開発も行なっています。polkadot.rsはSubstrate/Polkadotとやり取りをするRPCクライアントのRust実装です。
Zerochainのトランザクション送信はこのpolkadot.rsを介して行われます。実装的にはまだ初期段階で荒いですが、トランザクションの送信やSubstrateストレージデータの取得などの一連の基本的な操作は行うことができます。そして、今回のアップデートでイベントのサブスクライブ機能が追加されました。
Substrateのruntimeではpanicを起こさず、Errorを返すようなトランザクションはステートの変化を起こさずトランザクション自体はブロックに含まれます。つまり、オンチェーンロジックのバリデーションでなんらかのErrorを返しているのか、あるいは正常にOKを返しているのかは、イベントをウォッチしない限り分かりません。
例えば、オンチェーン上で行われるゼロ知識証明の検証で失敗したかどうかをブロックチェーンネットワーク外から知るためには、その検証のエラーハンドリングでイベントを発行する必要があります。
今回のアップデートによりトランザクションの送信時に、全て処理が正常に行われ、ステートの変化が起きたのかイベントをウォッチすることが可能になりました。Substrate RPC クライアントのRust実装は需要も多いのでZerochain以外でもスムーズに扱えるように引き続き実装を進めていきます。(ドキュメントまだ一切なくてすいません、)
ZFace / CLIの基本機能実装
ZFaceはZerochainとやり取りするためのツールキットです。具体的には、Zerochain用のウォレット機能やゼロ知識証明・暗号化・復号化などの暗号ツールも含みます。上述のpolkadot.rsと組み合わせて、全体スキームとしてはざっくりと以下のようになります。
今回のアップデートにより、ZFaceをベースにしたCLI Walletの基本機能が一通り実装されました。鍵ファイル管理、子鍵導出関数、鍵ファイルからのトランザクション生成、暗号化残高の復号化などを含みます。
また、将来的にはDesktop/mobile walletの実装もZFaceをベースに行われていきます。ユースケースによっては、サーバーサイドでも利用されることになるでしょう。
今回実装されたCLIの使い方は後述するZerochain Bookに記載してあります。
Zerochain Bookの公開
Zerochainの使い方や基本となるテクノロジーの内容をまとめたZerochain Bookを公開しました。まだ全ての章がかけていない、かつ英語のみですが、こちらのチュートリアルページにしたがって、Zerochain上の秘匿送金をZfaceを用いてCLIから行うことができます。
秘匿化アセットMint機能の追加
現時点で、Zerochainが提供しているSubstrateモジュールはEncrypted-balancesモジュールとEncrypted-assetsモジュールです。
Encrypted-balancesモジュールでは、ベースとなる秘匿送金の機能を提供しています。今回のアップデートで新しく追加されたEncrypted-assetsでは、プリミティブな秘匿化アセット機能を提供しています。それぞれの秘匿化アセットはAsset IDによって識別され、MintableかつBurnableです。
今回のアップデートでは、秘匿化アセットのMintが可能になりました。
Mintを行うときもゼロ知識証明による検証を行なっており、
- 正しいワンタイム署名鍵を使っているか
- 発行するコインは正常な範囲内か(マイナスの量などを発行しようとしていないか)
- 発行するコインは発行者の公開鍵で正しく暗号化されているか
などの検証を行います。
ただし、ここでの検証事項は通常の送金時の検証事項よりも緩く、具体的には「送金額が残高を超えていないか」などの検証は行なっていません(新規発行なのでそもそも残高はないので)。Circuit自体は統一したいので、相当するbalanceなどはStatementを満たすDummy変数をInputするように工夫しています。
次回以降のアップデートでTranferやBurn機能を追加していく予定です。
また、先日発表されたWeb3 Foundation GrantのWave twoに採択されていて、5つあるマイルストーンのうち、2つまでがAcceptされ、現在3つ目(Encrypted-assetsモジュール実装)に取り組んでいます。