- ユーザ作成 / ウォレットアドレスの接続(Auro Wallet)
- 投票機能 (まずはYES / NOだけでその後に複数個の回答を用意する、選択式)
- Private Params -> ユーザ情報 / 回答 / 2重投票の結果?
- バッチ処理(まとめてユーザトランザクションをオンチェーンに刻む)
- 有人投票結果に加えて無人投票結果を織り交ぜてオンチェーンに刻む。それにより、有人の結果の秘匿性を高めることができる
- この場合、無人投票結果をYes / Noまたは複数回答を用意して1つの回答に傾かないようにする。理由は、1つに傾くと有人投票結果がバレてしまうか
- 無人投票結果はランダム生成であり、プロバイダーはそれらを特定することはできない
- 有人投票結果に加えて無人投票結果を織り交ぜてオンチェーンに刻む。それにより、有人の結果の秘匿性を高めることができる
- オンチェーンに刻まれる情報は「最終の投票結果」「ウォレットアドレス」のみ
- yes: Yesの合計数
- no: noの合計数
- public key: 1ユーザを特定であることを示すkey(emailを暗号化?)****
- ユーザ作成
- 投票もしくは題目作成
- バッチ処理(キューにZKPが蓄積される。有人無人は問わない)
- スマートコントラクトでバッチ処理で送信されたZKPが改竄されていないかをsnarkjsでverifyする
- verify完了後にオンチェーンに刻まれる
- 2重投票をどのような仕組みで防止するのか
- ゼロ知識証明を利用してユーザが本人であることを第三者に証明する
- 暗号化された投票履歴を証明する
https://minaprotocol.com/blog/10-zkapps-use-cases-on-mina-protocol