working.pism 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. # :set syntax=pism
  2. # :source ../scripts/pism.vim
  3. constant G_VCV FixedGenerator
  4. constant G_VCR FixedGenerator
  5. constant G_SPEND FixedGenerator
  6. constant G_PROOF FixedGenerator
  7. constant G_NOTE_COMMIT_R FixedGenerator
  8. constant G_NULL FixedGenerator
  9. constant CRH_IVK BlakePersonalization
  10. constant NOTE_COMMIT PedersenPersonalization
  11. constant MERKLE_0 PedersenPersonalization
  12. constant MERKLE_1 PedersenPersonalization
  13. constant MERKLE_2 PedersenPersonalization
  14. constant MERKLE_3 PedersenPersonalization
  15. # ...
  16. constant PRF_NF BlakePersonalization
  17. constant JUBJUB_FR_CAPACITY ByteSize
  18. contract input_spend
  19. param secret Fr
  20. #param value U64
  21. #param randomness Fr
  22. #param ak Point
  23. #param ar Fr
  24. #param nsk Fr
  25. #param g_d Point
  26. #param commitment_randomness Fr
  27. #param auth_path_0_0 Scalar
  28. #param auth_path_0_1 Bool
  29. #param auth_path_1_0 Scalar
  30. #param auth_path_1_1 Bool
  31. ## ...
  32. #param anchor Scalar
  33. start
  34. fr_as_binary_le secret param:secret
  35. ec_mul_const public secret G_SPEND
  36. emit_ec public
  37. # let rk: Point = ak + ar * G_SPEND
  38. #witness ak param:ak
  39. #assert_not_small_order ak
  40. #fr_as_binary_le ar param:ar
  41. #ec_mul_const ar ar G_SPEND
  42. #ec_add rk ak ar
  43. ## emit rk
  44. #emit_ec rk
  45. #
  46. ## let nk: Point = nsk * G_PROOF
  47. #fr_as_binary_le nsk param:nsk
  48. #ec_mul_const nk nsk G_PROOF
  49. #
  50. ## let mut ivk_preimage: BinaryNumber = []
  51. #alloc_binary ivk_preimage
  52. ## ivk_preimage.put(ak)
  53. #ec_repr repr_ak ak
  54. #binary_extend ivk_preimage repr_ak
  55. #
  56. ## let mut nf_preimage: BinaryNumber = []
  57. #alloc_binary nf_preimage
  58. #ec_repr repr_nk nk
  59. #binary_clone repr_nk repr_nk2
  60. ## ivk_preimage.put(nk)
  61. #binary_extend ivk_preimage repr_nk
  62. ## nf_preimage.put(nk)
  63. #binary_extend ivk_preimage repr_nk2
  64. #
  65. ## assert ivk_preimage.len() == 512
  66. #static_assert_binary_size ivk_preimage 512
  67. ## assert nf_preimage.len() == 256
  68. #static_assert_binary_size nf_preimage 256
  69. #
  70. ## let mut ivk = blake2s(ivk_preimage, CRH_IVK)
  71. #blake2s ivk ivk_preimage CRH_IVK
  72. ## ivk.truncate(JUBJUB_FR_CAPACITY)
  73. #binary_truncate ivk JUBJUB_FR_CAPACITY
  74. #
  75. ## let pk_d: Point = ivk * g_d
  76. #witness g_d param:g_d
  77. #assert_not_small_order g_d
  78. #ec_mul pk_d ivk g_d
  79. #
  80. ## let cv: Point = value * G_VCV + rcv * G_VCR
  81. #u64_as_binary_le value_bits param:value
  82. #ec_mul_const value value_bits G_VCV
  83. #fr_as_binary_le rcv param:randomness
  84. #ec_mul_const rcv rcv G_VCR
  85. #ec_add cv value rcv
  86. ## emit cv
  87. #emit_ec cv
  88. #
  89. ## let mut note_contents: BinaryNumber = []
  90. #alloc_binary note_contents
  91. #
  92. ## note_contents.put(value)
  93. #binary_extend note_contents value
  94. ## note_contents.put(g_d)
  95. #ec_repr repr_g_d g_d
  96. #binary_extend note_contents repr_g_d
  97. ## note_contents.put(p_k)
  98. #ec_repr repr_p_k p_k
  99. #binary_extend note_contents repr_p_k
  100. ## assert note_contents.len() == 64 + 256 + 256
  101. #static_assert_binary_size ivk_preimage 576
  102. #
  103. ## let mut cm = pedersen_hash(note_contents, NOTE_COMMIT)
  104. #pedersen_hash cm note_contents NOTE_COMMIT
  105. ## cm += commitment_randomness * G_NOTE_COMMIT_R
  106. #fr_as_binary_le rcm param:commitment_randomness
  107. #ec_mul_const cm1 rcm G_NOTE_COMMIT_R
  108. #ec_add cm cm cm1
  109. #
  110. ## let mut position = []
  111. #alloc_binary position
  112. ## let mut cur: Scalar = cm.u
  113. #ec_get_u cur cm
  114. #
  115. ## There are no loops in this language.
  116. ## ZK proofs must have a fixed size.
  117. ## So in this assembly we UNROLL all loops.
  118. ## for i in range(auth_path.size()):
  119. ##
  120. ## Here we give the example of loop 0.
  121. ## Replace the indexes with the value i
  122. ## Below line is auth_path[0].1
  123. #
  124. ## let (node: Scalar, is_right: Bool) = auth_path[i]
  125. ## position.push(is_right)
  126. #alloc_bit cur_is_right param:auth_path_0_1
  127. #clone_bit cur_is_right2 cur_is_right
  128. #binary_push position cur_is_right2
  129. #alloc_num path_element param:auth_path_0_0
  130. ## let (left: Scalar, right: Scalar) = swap_if(is_right, cur, node)
  131. #conditionally_reverse ulur cur path_element is_right
  132. #get_0 ul ulur
  133. #get_1 ur ulur
  134. ## let mut preimage: BinaryNumber = []
  135. #alloc_binary preimage
  136. ## preimage.put(left)
  137. #num_to_binary ul_bits ul
  138. #binary_extend preimage ul_bits
  139. ## preimage.put(right)
  140. #num_to_binary ur_bits ur
  141. #binary_extend preimage ur_bits
  142. ## cur = pedersen_hash(MERKLE_TREE[i], preimage).u
  143. #pedersen_hash curhash preimage MERKLE_0
  144. #ec_get_u cur curhash
  145. ## ... repeat the above N times
  146. #
  147. ## enforce cur == rt
  148. #alloc_num rt param:anchor
  149. #num_enforce_equal cur rt
  150. ## emit rt
  151. #emit_num rt
  152. #
  153. ## let rho: Point = rho + position * G_NULL
  154. #ec_mul_const position position_bits G_NULL
  155. #ec_add rho rho position
  156. ## nf_preimage.put(rho)
  157. #ec_repr repr_rho rho
  158. #binary_extend nf_preimage repr_rho
  159. ## assert nf_preimage.len() == 512
  160. #static_assert_binary_size nf_preimage 512
  161. #
  162. ## let nf: BinaryNumber = blake2s(nf_preimage, PRF_NF)
  163. #blake2s nf nf_preimage PRF_NF
  164. #emit_binary nf
  165. end