Zerochain monthlyアップデートレポート#2

Osuke
LayerX-jp
Published in
7 min readAug 13, 2019

今回のZerochainアップデートを配信していきます!今回の主なアップデートは以下の通りです。

  • 秘匿アセットのTransfer & Burn機能追加
  • Nonceロジックの変更
  • 範囲証明のバグ修正

ちなみにしれっとbi-weeklyからmonthlyに変更していますmm。開発は毎日頑張っています。

秘匿アセットのTransfer & Burn機能追加

前回のアップデートで秘匿アセットのMint機能が追加されましたが、今回のアップデートでTransfer & Burn機能も追加され基本的な秘匿アセットのオペレーションを行うことが可能になりました。

秘匿アセットは以下のような形式でそれぞれにAsset IDが割り当てられていてそれぞれ個別のアセットとして扱うことが可能です。

通常のトークンとは異なりそれらの送金額や残高は全て暗号化され処理されますので、Zerochain上で秘匿化し送金することが可能になっています。

この秘匿アセットの操作はCLI Walletを介して行うことができます。以下のページに簡単なチュートリアルを記載していますのでぜひ試してみてください。

例えば、送金部分のコマンドを紹介すると以下のようになります。

zface tx asset-transfer -a 20 -i 0 -t 5DC4kJ84b4KfVyddcFMYfy5skTJWVtxtWRETZo2i4nh8Ao1i

  • zface: ウォレットやゼロ知識証明・暗号処理を行えるように配布しているツール
  • tx asset-transfer: 秘匿アセットの送金のためのサブコマンド
  • -a 20: 送金額の指定
  • -i 0: 送金するAsset IDの指定
  • -t <TARGET ADDRESS>: 送金先のアドレスを指定(SS58形式でエンコード)

以上のようなコマンドによりZerochainに秘匿送金のためのトランザクションが送信され、一連のオンチェーン処理が行われ、イベントとして結果が返ってきます。

また、この秘匿アセットの一連の実装が先日発表されたWeb3 Foundation Grantの5ステップのMilestoneにおける3番目のMilestoneで、無事アクセプトされました。

Nonceロジックの変更

秘匿性、匿名性の仕様により、ZerochainのNonceのロジックは大きく変更する必要があります。通常のEthereumなどのNonceはアカウントごとにトランザクションのNonceパラメータを1ずつIncrementしていくことでトランザクションをユニークにし、Replay attackなどを防いでいます。

このアカウントごとのNonce情報は通常オンチェーンで記録していますが、Zerochainにおけるトランザクションの匿名性を考慮するとこの通常の方式では適していないことが分かります。なぜなら、匿名処理を施していても、オンチェーンでNonceがIncrement処理されることでトランザクションの送り手アカウントが明らかになってしまうからです。

これを防ぐためには、アカウントに紐づかないようにNonce情報を管理する必要があります。詳細は省略しますが、ZerochainでのNonce管理はMoneroと似たような戦略でゼロ知識証明と離散対数問題を利用して以下の数式で生成され、Nonce poolで管理しています。

Nonce = (Decryption Key) * G_epoch

Decryption key(復号鍵)はゼロ知識証明を介してPrivateにしつつ、アカウントごとにユニークなNonceを生成し、Nonce poolに入れ、その際に同じNonceの重複がないか検証しています。Zerochainではアップデートレポート#0で紹介しているようにフロントランニング攻撃を防ぐためにブロック高で決まるグローバルなEpochを持っており、Nonce poolはEpochごとに初期化され、上記のG_epochもEpochごとに異なる楕円曲線上の点となっています。

このようなブロックチェーンのNonceデータの仕様変更はスマートコントラクト上だけでは行うことができず、Substrateの抽象的なフレームワークのおかげで実現できています。

範囲証明のバグ修正

新しい機能の追加だけではなく、プロダクション環境で使うことができるようにバグFix・安全性の向上にも力を入れています。特に、Zerochainではzk-SNARKsをはじめ複雑な暗号システムを利用しているので暗号部分の実装を中心にレビューをしています。

Zerochainでは、秘匿送金のために「送金額を明らかにしないで送金する」処理がありますが、この送金額が例えば負の値を送っていないかゼロ知識証明を行う必要があります。この範囲証明部分で、証明が不十分であったことが今回の大きなバグ修正になります。

ちなみに範囲証明のバグ修正のPRは以下です。

また、暗号学的な攻撃(特に実装面で熟慮しなければならない手法)やRust実装の安全性などは以下のScrapboxのページに随時まとめていますので参考にしてください。

BUIDL ASIA 2019での登壇資料

先日、韓国のブロックチェーンイベントBUIDL ASIA 2019で登壇してきましたのでその際のZerochain資料を共有しておきます。

  • スライド
  • 動画

次回のアップデートレポートではアドレスの秘匿化実装を目標にしていきます!

Backnumber

--

--