masquerade(熟議と投票のための匿名化セッション)

1. entryMasquerade

sender=実名アドレス
2 commit, 0 proof, 0 verify, 0 transfer

1-1. identifiedAddressの秘密鍵bの生成(公開鍵bG)
1-2. identifiedAddressをCRKYCがdao4nに登録し、MerkleTreeWithHistoryを構成する。
1-3. ステルスアドレスを用意するために乱数 r を秘密鍵としての用意(ステルスアドレス公開鍵rG)
1-4. goMasqueradeLeafHash=Hash(identifiedAddress)を生成
1-5. keysellingDetectionHash=Hash(rbG)を生成。
1-6. entryMasqueradeコントラクトを叩く
1-7. コントラクト側でidentifiedAddress(=ecrecover(sig))がlatestMerkleTreeにあることを確かめる。
1-8. rate limitとして過去x週間(自治体依存)に提案/審議をしていないかチェックする
1-9. goMasqueradeLeafHash および keysellingDetectionHash をpublic inputとしてストレージにMerkleTree形式で保管。このMerkleTreeの深さは全員分保存し続けると log(2,組織の人数)になってしまうので、verifyMasqueraded後に削除するストレージとして扱うことで回路内で使用せねばならない深さを減らす。
1-10. keysellingDetectionHash は鍵販売対策で恒久的に使用するので、別のmerkleTreeとしてストレージに保存。


2. goMasquerade

sender=匿名アドレス
1 commit, 1 proof, 1 verify, 0 transfer

2-1. Stealth Addressの保有者である(1)の参加者は、(1)のアドレスとの関連がRelayerに知られうるCookieやIPを隠蔽する。
2-2. 参加証明乱数 sを用いて verifyMasqueradedLeafHash=Hash(s) を用意する。これは(3)のためのcommitmentである。
2-3. genProofに用いる entryHash=Hash(identifiedRoot+stealthAddress+entryRoot+recipient+fee)を計算しておく。
2-4. StealthAddressは、SDKが(1-10)のcommitmentから得た情報で proof(identifiedAddress, identifiedPathElements, identifiedPathIndices, identifiedRoot, stealthAddress, entryPathElements, entryPathIndices, entryRoot, recipient, fee, rbG, pub entryHash) を作成する。(entryHash以外はすべてprivate input扱いになっているか、真の秘匿情報はidentifiedAddressとrbGである)
2-5. proofとverifyMasqueradedLeafHash commitmentと、entryHashとentryHashのpreImagesをinputとするtxをRelayer Networkにbroadcastする。いち早く goMasquerade を叩いたRelayerはガス代よりやや多い報酬を得られる。(proofの解説:  +hashじゃなくmerkleProofである背景
2-6. verifyMasqueradedLeafHash のcommitに伴いコントラクト内部では左詰めbinary Merkle treeが作成され、そのときのtreeのrootが masqueradedRoot であり、これは(3)で使用する。
2-7. proofに使用したもろもろのinputをコントラクトの引数として用い、 verify(proof, [entryHash]) でできる。検証が通ればstealthAddressに抽選券が付与され、senderである先着1名のRelayerにgas fee * 1.2 ほどが付与される。

3. verifyMasqueraded

sender=実名アドレス
0 commit, 1 proof, 1 verify, 1 transfer

3-1. 実名アドレスは、(2-7)のcommitmentを用いて proof(s, masqueradedPathElements, masqueradedPathIndices, masqueradedRoot, recipient, pub entryHash) を生成する。entryHashは(2)のように生成する。
3-2. proofに用いたもろもろをinputに加え、 verifyMasqueraded を叩く.
3-3. コントラクト内部で verify(proof, [entryHash])が検証される。
3-4. 実名アドレスは参加リワードを確認する。

補足1. プロトタイピング

  • ※ ptauはプロトでは忘れる

補足2. 鍵販売対策

  • もし審議員の鍵rの販売が起きた際はkeysellingDetectionHash=Hash(rbG)を用いて対応する販売者を特定する。