mint_contract.rs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #![allow(unused_imports)]
  2. #![allow(unused_mut)]
  3. use crate::crypto::merkle_node::SAPLING_COMMITMENT_TREE_DEPTH;
  4. use bellman::{
  5. gadgets::{
  6. blake2s, boolean,
  7. boolean::{AllocatedBit, Boolean},
  8. multipack, num, Assignment,
  9. },
  10. groth16, Circuit, ConstraintSystem, SynthesisError,
  11. };
  12. use bls12_381::Bls12;
  13. use ff::{Field, PrimeField};
  14. use group::Curve;
  15. use zcash_proofs::circuit::{ecc, pedersen_hash};
  16. pub struct MintContract {
  17. pub value: Option<u64>,
  18. pub asset_id: Option<jubjub::Fr>,
  19. pub randomness_value: Option<jubjub::Fr>,
  20. pub randomness_asset: Option<jubjub::Fr>,
  21. pub serial: Option<jubjub::Fr>,
  22. pub randomness_coin: Option<jubjub::Fr>,
  23. pub public: Option<jubjub::SubgroupPoint>,
  24. }
  25. impl Circuit<bls12_381::Scalar> for MintContract {
  26. fn synthesize<CS: ConstraintSystem<bls12_381::Scalar>>(
  27. self,
  28. cs: &mut CS,
  29. ) -> Result<(), SynthesisError> {
  30. // Line 20: u64_as_binary_le value param:value
  31. let value = boolean::u64_into_boolean_vec_le(
  32. cs.namespace(|| "Line 20: u64_as_binary_le value param:value"),
  33. self.value,
  34. )?;
  35. // Line 21: fr_as_binary_le asset_id param:asset_id
  36. let asset_id = boolean::field_into_boolean_vec_le(
  37. cs.namespace(|| "Line 21: fr_as_binary_le asset_id param:asset_id"),
  38. self.asset_id,
  39. )?;
  40. // Line 22: fr_as_binary_le randomness_value param:randomness_value
  41. let randomness_value = boolean::field_into_boolean_vec_le(
  42. cs.namespace(|| "Line 22: fr_as_binary_le randomness_value param:randomness_value"),
  43. self.randomness_value,
  44. )?;
  45. // Line 23: fr_as_binary_le randomness_asset param:randomness_asset
  46. let randomness_asset = boolean::field_into_boolean_vec_le(
  47. cs.namespace(|| "Line 23: fr_as_binary_le randomness_asset param:randomness_asset"),
  48. self.randomness_asset,
  49. )?;
  50. // Line 24: fr_as_binary_le serial param:serial
  51. let serial = boolean::field_into_boolean_vec_le(
  52. cs.namespace(|| "Line 24: fr_as_binary_le serial param:serial"),
  53. self.serial,
  54. )?;
  55. // Line 25: fr_as_binary_le randomness_coin param:randomness_coin
  56. let randomness_coin = boolean::field_into_boolean_vec_le(
  57. cs.namespace(|| "Line 25: fr_as_binary_le randomness_coin param:randomness_coin"),
  58. self.randomness_coin,
  59. )?;
  60. // Line 27: witness public param:public
  61. let public = ecc::EdwardsPoint::witness(
  62. cs.namespace(|| "Line 27: witness public param:public"),
  63. self.public.map(jubjub::ExtendedPoint::from),
  64. )?;
  65. // Line 28: assert_not_small_order public
  66. public.assert_not_small_order(cs.namespace(|| "Line 28: assert_not_small_order public"))?;
  67. // Line 33: ec_mul_const vcv value G_VCV
  68. let vcv = ecc::fixed_base_multiplication(
  69. cs.namespace(|| "Line 33: ec_mul_const vcv value G_VCV"),
  70. &zcash_proofs::constants::VALUE_COMMITMENT_VALUE_GENERATOR,
  71. &value,
  72. )?;
  73. // Line 34: ec_mul_const rcv randomness_value G_VCR
  74. let rcv = ecc::fixed_base_multiplication(
  75. cs.namespace(|| "Line 34: ec_mul_const rcv randomness_value G_VCR"),
  76. &zcash_proofs::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR,
  77. &randomness_value,
  78. )?;
  79. // Line 35: ec_add cv vcv rcv
  80. let cv = vcv.add(cs.namespace(|| "Line 35: ec_add cv vcv rcv"), &rcv)?;
  81. // Line 37: emit_ec cv
  82. cv.inputize(cs.namespace(|| "Line 37: emit_ec cv"))?;
  83. // Line 42: ec_mul_const vca asset_id G_VCV
  84. let vca = ecc::fixed_base_multiplication(
  85. cs.namespace(|| "Line 42: ec_mul_const vca asset_id G_VCV"),
  86. &zcash_proofs::constants::VALUE_COMMITMENT_VALUE_GENERATOR,
  87. &asset_id,
  88. )?;
  89. // Line 43: ec_mul_const rca randomness_asset G_VCR
  90. let rca = ecc::fixed_base_multiplication(
  91. cs.namespace(|| "Line 43: ec_mul_const rca randomness_asset G_VCR"),
  92. &zcash_proofs::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR,
  93. &randomness_asset,
  94. )?;
  95. // Line 44: ec_add ca vca rca
  96. let ca = vca.add(cs.namespace(|| "Line 44: ec_add ca vca rca"), &rca)?;
  97. // Line 46: emit_ec ca
  98. ca.inputize(cs.namespace(|| "Line 46: emit_ec ca"))?;
  99. // Line 53: alloc_binary preimage
  100. let mut preimage = vec![];
  101. // Line 56: ec_repr repr_public public
  102. let repr_public = public.repr(cs.namespace(|| "Line 56: ec_repr repr_public public"))?;
  103. // Line 57: binary_extend preimage repr_public
  104. preimage.extend(repr_public);
  105. // Line 60: binary_extend preimage value
  106. preimage.extend(value);
  107. // Line 67: binary_extend preimage serial
  108. preimage.extend(serial);
  109. // Line 69: alloc_const_bit zero_bit false
  110. let zero_bit = Boolean::constant(false);
  111. // Line 70: binary_push preimage zero_bit
  112. preimage.push(zero_bit);
  113. // Line 72: alloc_const_bit zero_bit false
  114. let zero_bit = Boolean::constant(false);
  115. // Line 73: binary_push preimage zero_bit
  116. preimage.push(zero_bit);
  117. // Line 75: alloc_const_bit zero_bit false
  118. let zero_bit = Boolean::constant(false);
  119. // Line 76: binary_push preimage zero_bit
  120. preimage.push(zero_bit);
  121. // Line 78: alloc_const_bit zero_bit false
  122. let zero_bit = Boolean::constant(false);
  123. // Line 79: binary_push preimage zero_bit
  124. preimage.push(zero_bit);
  125. // Line 83: binary_extend preimage randomness_coin
  126. preimage.extend(randomness_coin);
  127. // Line 85: alloc_const_bit zero_bit false
  128. let zero_bit = Boolean::constant(false);
  129. // Line 86: binary_push preimage zero_bit
  130. preimage.push(zero_bit);
  131. // Line 88: alloc_const_bit zero_bit false
  132. let zero_bit = Boolean::constant(false);
  133. // Line 89: binary_push preimage zero_bit
  134. preimage.push(zero_bit);
  135. // Line 91: alloc_const_bit zero_bit false
  136. let zero_bit = Boolean::constant(false);
  137. // Line 92: binary_push preimage zero_bit
  138. preimage.push(zero_bit);
  139. // Line 94: alloc_const_bit zero_bit false
  140. let zero_bit = Boolean::constant(false);
  141. // Line 95: binary_push preimage zero_bit
  142. preimage.push(zero_bit);
  143. // Line 99: binary_extend preimage asset_id
  144. preimage.extend(asset_id);
  145. // Line 101: alloc_const_bit zero_bit false
  146. let zero_bit = Boolean::constant(false);
  147. // Line 102: binary_push preimage zero_bit
  148. preimage.push(zero_bit);
  149. // Line 104: alloc_const_bit zero_bit false
  150. let zero_bit = Boolean::constant(false);
  151. // Line 105: binary_push preimage zero_bit
  152. preimage.push(zero_bit);
  153. // Line 107: alloc_const_bit zero_bit false
  154. let zero_bit = Boolean::constant(false);
  155. // Line 108: binary_push preimage zero_bit
  156. preimage.push(zero_bit);
  157. // Line 110: alloc_const_bit zero_bit false
  158. let zero_bit = Boolean::constant(false);
  159. // Line 111: binary_push preimage zero_bit
  160. preimage.push(zero_bit);
  161. // Line 120: static_assert_binary_size preimage 1088
  162. assert_eq!(preimage.len(), 1088);
  163. // Line 121: blake2s coin preimage CRH_IVK
  164. let mut coin = blake2s::blake2s(
  165. cs.namespace(|| "Line 121: blake2s coin preimage CRH_IVK"),
  166. &preimage,
  167. zcash_primitives::constants::CRH_IVK_PERSONALIZATION,
  168. )?;
  169. // Line 122: emit_binary coin
  170. multipack::pack_into_inputs(cs.namespace(|| "Line 122: emit_binary coin"), &coin)?;
  171. Ok(())
  172. }
  173. }