| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- k = 11;
- field = "pallas";
- constant "Exec" {
- EcFixedPointShort VALUE_COMMIT_VALUE,
- EcFixedPoint VALUE_COMMIT_RANDOM,
- EcFixedPointBase NULLIFIER_K,
- }
- witness "Exec" {
- # Proposal parameters
- Base proposal_auth_calls_commit,
- Base proposal_current_day,
- Base proposal_duration_days,
- Base proposal_user_data,
- Base proposal_blind,
- # DAO parameters
- Base dao_proposer_limit,
- Base dao_quorum,
- Base dao_approval_ratio_quot,
- Base dao_approval_ratio_base,
- Base dao_gov_token_id,
- Base dao_public_x,
- Base dao_public_y,
- Base dao_bulla_blind,
- # Votes
- Base yes_vote_value,
- Base all_vote_value,
- Scalar yes_vote_blind,
- Scalar all_vote_blind,
- # Signature secret
- Base signature_secret,
- }
- circuit "Exec" {
- dao_bulla = poseidon_hash(
- dao_proposer_limit,
- dao_quorum,
- dao_approval_ratio_quot,
- dao_approval_ratio_base,
- dao_gov_token_id,
- dao_public_x,
- dao_public_y,
- dao_bulla_blind,
- );
- # Proposal bulla being valid means DAO bulla is also valid because
- # dao-propose-main.zk already checks that when we first create the
- # proposal - so it is redundant to check DAO bulla exists here.
- proposal_bulla = poseidon_hash(
- proposal_auth_calls_commit,
- proposal_current_day,
- proposal_duration_days,
- proposal_user_data,
- dao_bulla,
- proposal_blind,
- );
- constrain_instance(proposal_bulla);
- constrain_instance(proposal_auth_calls_commit);
- # Create Pedersen commitments for win_votes and total_votes, and
- # constrain the commitments' coordinates.
- yes_vote_value_c = ec_mul_short(yes_vote_value, VALUE_COMMIT_VALUE);
- yes_vote_blind_c = ec_mul(yes_vote_blind, VALUE_COMMIT_RANDOM);
- yes_vote_commit = ec_add(yes_vote_value_c, yes_vote_blind_c);
- constrain_instance(ec_get_x(yes_vote_commit));
- constrain_instance(ec_get_y(yes_vote_commit));
- all_vote_value_c = ec_mul_short(all_vote_value, VALUE_COMMIT_VALUE);
- all_vote_blind_c = ec_mul(all_vote_blind, VALUE_COMMIT_RANDOM);
- all_vote_commit = ec_add(all_vote_value_c, all_vote_blind_c);
- constrain_instance(ec_get_x(all_vote_commit));
- constrain_instance(ec_get_y(all_vote_commit));
- # Check that dao_quorum is less than or equal to all_vote_value
- one = witness_base(1);
- all_vote_value_1 = base_add(all_vote_value, one);
- less_than_strict(dao_quorum, all_vote_value_1);
- # approval_ratio_quot / approval_ratio_base <= yes_vote / all_vote
- #
- # The above is also equivalent to this:
- #
- # all_vote * approval_ratio_quot <= yes_vote * approval_ratio_base
- lhs = base_mul(all_vote_value, dao_approval_ratio_quot);
- rhs = base_mul(yes_vote_value, dao_approval_ratio_base);
- rhs_1 = base_add(rhs, one);
- less_than_strict(lhs, rhs_1);
- # Derive a public key for the signature and constrain its coordinates
- signature_public = ec_mul_base(signature_secret, NULLIFIER_K);
- constrain_instance(ec_get_x(signature_public));
- constrain_instance(ec_get_y(signature_public));
- }
|