🪙
Zcash概要
アップグレードについて
- 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