lead.zk 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. k = 13;
  2. field = "pallas";
  3. constant "Lead" {
  4. EcFixedPointShort VALUE_COMMIT_VALUE,
  5. EcFixedPoint VALUE_COMMIT_RANDOM,
  6. EcFixedPointBase NULLIFIER_K,
  7. }
  8. witness "Lead" {
  9. MerklePath c1_cm_path,
  10. Uint32 c1_cm_pos,
  11. Uint32 c1_sk_pos,
  12. Base c1_sk,
  13. Base c1_sk_root,
  14. MerklePath c1_sk_path,
  15. Base c1_slot,
  16. Base c1_rho,
  17. Scalar c1_opening,
  18. Base value,
  19. Scalar c2_opening,
  20. Base mu_rho,
  21. Base mu_y,
  22. Base sigma1,
  23. Base sigma2,
  24. Base headstart,
  25. }
  26. circuit "Lead" {
  27. ZERO = witness_base(0);
  28. ONE = witness_base(1);
  29. REWARD = witness_base(1);
  30. PREFIX_EVL = witness_base(2);
  31. PREFIX_SEED = witness_base(3);
  32. PREFIX_CM = witness_base(4);
  33. PREFIX_PK = witness_base(5);
  34. PREFIX_SN = witness_base(6);
  35. # coin (1) pk
  36. pk = poseidon_hash(PREFIX_PK, c1_sk_root, c1_slot, ZERO);
  37. constrain_instance(pk);
  38. # coin (1) cm/commitment
  39. c1_cm_msg = poseidon_hash(PREFIX_CM, pk, value, c1_rho);
  40. c1_cm_v = ec_mul_base(c1_cm_msg, NULLIFIER_K);
  41. c1_cm_r = ec_mul(c1_opening, VALUE_COMMIT_RANDOM);
  42. c1_cm = ec_add(c1_cm_v, c1_cm_r);
  43. c1_cm_x = ec_get_x(c1_cm);
  44. c1_cm_y = ec_get_y(c1_cm);
  45. c1_cm_hash = poseidon_hash(c1_cm_x, c1_cm_y);
  46. constrain_instance(c1_cm_x);
  47. constrain_instance(c1_cm_y);
  48. # coin (2) rho/nonce
  49. c2_rho = poseidon_hash(PREFIX_EVL, c1_sk_root, c1_rho, ZERO);
  50. # coin (2) cm/commitment
  51. # reward
  52. c2_value = base_add(value, REWARD);
  53. c2_cm_msg = poseidon_hash(PREFIX_CM, pk, c2_value, c2_rho);
  54. c2_cm_v = ec_mul_base(c2_cm_msg, NULLIFIER_K);
  55. c2_cm_r = ec_mul(c2_opening, VALUE_COMMIT_RANDOM);
  56. c2_cm = ec_add(c2_cm_v, c2_cm_r);
  57. c2_cm_x = ec_get_x(c2_cm);
  58. c2_cm_y = ec_get_y(c2_cm);
  59. constrain_instance(c2_cm_x);
  60. constrain_instance(c2_cm_y);
  61. # root of path to burnt coin commitment at given pos
  62. root = merkle_root(c1_cm_pos, c1_cm_path, c1_cm_hash);
  63. constrain_instance(root);
  64. # root of path at c1_sk_pos
  65. root_sk = merkle_root(c1_sk_pos, c1_sk_path, c1_sk);
  66. constrain_instance(root_sk);
  67. # coin (1) sn/nullifier
  68. sn = poseidon_hash(PREFIX_SN, c1_sk_root, c1_rho, ZERO);
  69. constrain_instance(sn);
  70. # lottery seed
  71. seed = poseidon_hash(PREFIX_SEED, c1_sk_root, c1_rho, ZERO);
  72. # y
  73. y = poseidon_hash(seed, mu_y);
  74. ###
  75. constrain_instance(mu_y);
  76. constrain_instance(y);
  77. # rho
  78. rho = poseidon_hash(seed, mu_rho);
  79. constrain_instance(mu_rho);
  80. constrain_instance(rho);
  81. # target
  82. term1 = base_mul(sigma1, value);
  83. term2_1 = base_mul(sigma2, value);
  84. term2 = base_mul(term2_1, value);
  85. target = base_add(term1, term2);
  86. shifted_target = base_add(target, headstart);
  87. #lottery
  88. #constrain public value sigma1
  89. constrain_instance(sigma1);
  90. # constrain public value sigma2
  91. constrain_instance(sigma2);
  92. less_than_loose(y, shifted_target);
  93. }