exec.zk 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. k = 11;
  2. field = "pallas";
  3. constant "Exec" {
  4. EcFixedPointShort VALUE_COMMIT_VALUE,
  5. EcFixedPoint VALUE_COMMIT_RANDOM,
  6. EcFixedPointBase NULLIFIER_K,
  7. }
  8. witness "Exec" {
  9. # Proposal parameters
  10. Base proposal_auth_calls_commit,
  11. Base proposal_current_day,
  12. Base proposal_duration_days,
  13. Base proposal_user_data,
  14. Base proposal_blind,
  15. # DAO parameters
  16. Base dao_proposer_limit,
  17. Base dao_quorum,
  18. Base dao_approval_ratio_quot,
  19. Base dao_approval_ratio_base,
  20. Base dao_gov_token_id,
  21. Base dao_public_x,
  22. Base dao_public_y,
  23. Base dao_bulla_blind,
  24. # Votes
  25. Base yes_vote_value,
  26. Base all_vote_value,
  27. Scalar yes_vote_blind,
  28. Scalar all_vote_blind,
  29. # Signature secret
  30. Base signature_secret,
  31. }
  32. circuit "Exec" {
  33. dao_bulla = poseidon_hash(
  34. dao_proposer_limit,
  35. dao_quorum,
  36. dao_approval_ratio_quot,
  37. dao_approval_ratio_base,
  38. dao_gov_token_id,
  39. dao_public_x,
  40. dao_public_y,
  41. dao_bulla_blind,
  42. );
  43. # Proposal bulla being valid means DAO bulla is also valid because
  44. # dao-propose-main.zk already checks that when we first create the
  45. # proposal - so it is redundant to check DAO bulla exists here.
  46. proposal_bulla = poseidon_hash(
  47. proposal_auth_calls_commit,
  48. proposal_current_day,
  49. proposal_duration_days,
  50. proposal_user_data,
  51. dao_bulla,
  52. proposal_blind,
  53. );
  54. constrain_instance(proposal_bulla);
  55. constrain_instance(proposal_auth_calls_commit);
  56. # Create Pedersen commitments for win_votes and total_votes, and
  57. # constrain the commitments' coordinates.
  58. yes_vote_value_c = ec_mul_short(yes_vote_value, VALUE_COMMIT_VALUE);
  59. yes_vote_blind_c = ec_mul(yes_vote_blind, VALUE_COMMIT_RANDOM);
  60. yes_vote_commit = ec_add(yes_vote_value_c, yes_vote_blind_c);
  61. constrain_instance(ec_get_x(yes_vote_commit));
  62. constrain_instance(ec_get_y(yes_vote_commit));
  63. all_vote_value_c = ec_mul_short(all_vote_value, VALUE_COMMIT_VALUE);
  64. all_vote_blind_c = ec_mul(all_vote_blind, VALUE_COMMIT_RANDOM);
  65. all_vote_commit = ec_add(all_vote_value_c, all_vote_blind_c);
  66. constrain_instance(ec_get_x(all_vote_commit));
  67. constrain_instance(ec_get_y(all_vote_commit));
  68. # Check that dao_quorum is less than or equal to all_vote_value
  69. one = witness_base(1);
  70. all_vote_value_1 = base_add(all_vote_value, one);
  71. less_than_strict(dao_quorum, all_vote_value_1);
  72. # approval_ratio_quot / approval_ratio_base <= yes_vote / all_vote
  73. #
  74. # The above is also equivalent to this:
  75. #
  76. # all_vote * approval_ratio_quot <= yes_vote * approval_ratio_base
  77. lhs = base_mul(all_vote_value, dao_approval_ratio_quot);
  78. rhs = base_mul(yes_vote_value, dao_approval_ratio_base);
  79. rhs_1 = base_add(rhs, one);
  80. less_than_strict(lhs, rhs_1);
  81. # Derive a public key for the signature and constrain its coordinates
  82. signature_public = ec_mul_base(signature_secret, NULLIFIER_K);
  83. constrain_instance(ec_get_x(signature_public));
  84. constrain_instance(ec_get_y(signature_public));
  85. }