Loading...
masquerade
(熟議と投票のための匿名化セッション)
リポジトリ:
https://github.com/ShawnAnarchy/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. プロトタイピング
+
masquerade擬似コード
※ ptauはプロトでは忘れる
補足2. 鍵販売対策
もし審議員の鍵rの販売が起きた際は
keysellingDetectionHash=Hash(rbG)
を用いて対応する販売者を特定する。
各攻撃シナリオはここに網羅した
+
key selling攻撃の分析
Please turn on JavaScript to use Paper in all of its awesomeness. ^_^
1. entryMasquerade
2. goMasquerade
3. verifyMasqueraded
補足1. プロトタイピング
補足2. 鍵販売対策