🪙

Zcash概要

2025/01/21に公開

アップグレードについて

  • Overwinter: 最初のアップグレードで、2018年6月26日に実施。
  • Sapling: 2018年10月28日に実施。​
  • Blossom: 2019年12月11日に実施。
  • Heartwood: 2020年7月16日に実施。
  • Canopy: 2020年11月18日に実施。
  • NU5: 2022年5月31日に実施。

本資料は、Saplingバージョンについて説明する。

addressの種類について

Transparent Address

  • tから始まるアドレス
  • Bitcoinと同じように、transactionが公開される

Shielded Address

  • zから始まるアドレス
  • zk-SNARKsにより、送信者、受信者、トランザクション金額などの情報が暗号化され、秘匿化される

Shielded Addressにおける鍵の概念について

  • 32バイトのシード値からSpending Key (sk)が生成される。
  • skから鍵導出関数(KDF: Key Derivation Function)を用いて、Spend Authorizing Key (ask)とNullifier Private Key (nsk)とOutgoing Viewing Key (ovk)が生成される。
    • askは、トランザクションで支出を行うための権限を持つ鍵
    • nskは、ヌリファイヤ(Nullifier)を生成するための鍵
    • ovkは、トランザクションの出力を監視するための鍵
  • nskから生成されるnk(Nullifier Deriving Key)、askから生成されるak(Proof Authorizing Key)、ovkからFull Viewing Key (fvk)が生成される。
    • fvkを用いると、自分に関する全てのトランザクション情報を閲覧できる
    • 具体的には、受信したトランザクションの金額や、その他ブロック情報(タイムスタンプやメモフィールドの値)がわかる。
    • ただし、受信したトランザクションの送金元のアドレスと、送信したトランザクションに関する情報は閲覧できない
  • akとnkからIncoming Viewing Key(ivk)が生成できる
    • ivkを用いると、送信されたノートを検出することができる

fvkで選択的開示ができる仕組みについて

  • 暗号化されたノートの情報をivkを用いて、復号できる。
  • ノートとは、以下の構成要素からなる送金に関するデータ群
    • d: 受取人のアドレスに関する情報
    • pkd: 受取人のアドレスに関する情報
    • v: ノートの値
    • rcm: ランダム値

Transactoin作成から検証のフローについて

送信者がzk-SNARKsで証明すること

  • 送信者が支出する権限があること
  • ヌリファイア(nullifier)が正しく計算されていること
  • 入力と出力のそれぞれの価値の合計が同じであること

送信者がネットワークにbroadcastする情報(公開データ)

  • ヌリファイア
  • 暗号化された送付先アドレス
  • 出力コミットメント(トランザクションの暗号化されたデータ)

検証者

TBD

回路について

以下の2つの回路がある。それぞれについて説明する。

  • Spend回路
  • Output回路

Spend回路

支出が正当であることをへ検証する回路。具体的には、以下のことを証明できる。

  • 送信者が正当な支出権限があること
  • 送信しようとするノートが実際に存在すること
  • Nullifierが正しく計算され、二重消費がされていないこと
  • 取引の総入力値と総出力値が一致していること

公開入力

  • rt: Merkle Treeのルート
  • cv_old: ノートの値コミットメント
  • nf_old: ヌリファイア
  • rk: ランダム化された公開鍵

秘密入力

公開入力を生成するための秘密情報です。

  • path : Merkle Tree内の特定のノードに到達するためのパス
  • pos: Merkle Tree内のノードの位置
  • g_d, pk_d: 送金先の公開鍵情報
  • v_old: 送金する具体的な値
  • rcv_old, cm_old, rcm_old: 値のコミットメントに関連するデータ
  • α: ランダム性のためのスカラー値
  • ak: 送金権限を持つ秘密鍵に関連する公開鍵
  • nsk: 送金者の秘密鍵

Output回路

受け取りの情報が正しいことを検証する回路。具体的には、以下のことを証明できる。

  • 新しいノートのコミットメントが正しく計算されていること
  • ノートの内容が受信者の公開鍵を用いて正しく暗号化されていること
  • 取引の総入力値と総出力値が一致していること

公開入力

  • cv_new: 新しいノートのための値コミットメント
  • cm_u: 新しいノートの「コミットメント」
  • epk: 新しいノートの一時的な公開鍵

秘密入力

公開入力を生成するための秘密情報です。

  • g_d: Jubjub曲線上の固定点
  • pk_d: 公開鍵の派生値
  • v_new: 新しいノート
  • rcv_new: 新しいノートのためのランダム値
  • rcm_new: 新しいノートのためのランダムスカラー値
  • esk: 一時的な秘密鍵

Discussion