working.pism 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. # let rk: Point = ak + ar * G_SPEND
  35. witness ak param:ak
  36. assert_not_small_order ak
  37. fr_as_binary_le ar param:ar
  38. ec_mul_const ar ar G_SPEND
  39. ec_add rk ak ar
  40. # emit rk
  41. emit_ec rk
  42. # let nk: Point = nsk * G_PROOF
  43. fr_as_binary_le nsk param:nsk
  44. ec_mul_const nk nsk G_PROOF
  45. # let mut ivk_preimage: BinaryNumber = []
  46. alloc_binary ivk_preimage
  47. # ivk_preimage.put(ak)
  48. ec_repr repr_ak ak
  49. binary_extend ivk_preimage repr_ak
  50. # let mut nf_preimage: BinaryNumber = []
  51. alloc_binary nf_preimage
  52. ec_repr repr_nk nk
  53. binary_clone repr_nk2 repr_nk
  54. # ivk_preimage.put(nk)
  55. binary_extend ivk_preimage repr_nk
  56. # nf_preimage.put(nk)
  57. binary_extend ivk_preimage repr_nk2
  58. # assert ivk_preimage.len() == 512
  59. static_assert_binary_size ivk_preimage 512
  60. # assert nf_preimage.len() == 256
  61. static_assert_binary_size nf_preimage 256
  62. # let mut ivk = blake2s(ivk_preimage, CRH_IVK)
  63. blake2s ivk ivk_preimage CRH_IVK
  64. # ivk.truncate(JUBJUB_FR_CAPACITY)
  65. binary_truncate ivk JUBJUB_FR_CAPACITY
  66. # let pk_d: Point = ivk * g_d
  67. witness g_d param:g_d
  68. assert_not_small_order g_d
  69. ec_mul pk_d ivk g_d
  70. # let cv: Point = value * G_VCV + rcv * G_VCR
  71. u64_as_binary_le value_bits param:value
  72. ec_mul_const value value_bits G_VCV
  73. fr_as_binary_le rcv param:randomness
  74. ec_mul_const rcv rcv G_VCR
  75. ec_add cv value rcv
  76. # emit cv
  77. emit_ec cv
  78. # let mut note_contents: BinaryNumber = []
  79. alloc_binary note_contents
  80. # note_contents.put(value)
  81. binary_extend note_contents value
  82. # note_contents.put(g_d)
  83. ec_repr repr_g_d g_d
  84. binary_extend note_contents repr_g_d
  85. # note_contents.put(p_k)
  86. ec_repr repr_p_k p_k
  87. binary_extend note_contents repr_p_k
  88. # assert note_contents.len() == 64 + 256 + 256
  89. static_assert_binary_size ivk_preimage 576
  90. # let mut cm = pedersen_hash(note_contents, NOTE_COMMIT)
  91. pedersen_hash cm note_contents NOTE_COMMIT
  92. # cm += commitment_randomness * G_NOTE_COMMIT_R
  93. fr_as_binary_le rcm param:commitment_randomness
  94. ec_mul_const cm1 rcm G_NOTE_COMMIT_R
  95. ec_add cm cm cm1
  96. # let mut position = []
  97. alloc_binary position
  98. # let mut cur: Scalar = cm.u
  99. ec_get_u cur cm
  100. ###############################################
  101. # There are no loops in this language.
  102. # ZK proofs must have a fixed size.
  103. # So in this assembly we UNROLL all loops.
  104. # for i in range(auth_path.size()):
  105. #
  106. # Here we give the example of loop 0.
  107. # Replace the indexes with the value i
  108. # Below line is auth_path[0].1
  109. # let (node: Scalar, is_right: Bool) = auth_path[i]
  110. # position.push(is_right)
  111. alloc_bit cur_is_right param:auth_path_0_1
  112. clone_bit cur_is_right2 cur_is_right
  113. binary_push position cur_is_right2
  114. alloc_num path_element param:auth_path_0_0
  115. # let (left: Scalar, right: Scalar) = swap_if(is_right, cur, node)
  116. conditionally_reverse ul ur cur path_element is_right
  117. # let mut preimage: BinaryNumber = []
  118. alloc_binary preimage
  119. # preimage.put(left)
  120. num_to_binary ul_bits ul
  121. binary_extend preimage ul_bits
  122. # preimage.put(right)
  123. num_to_binary ur_bits ur
  124. binary_extend preimage ur_bits
  125. # cur = pedersen_hash(MERKLE_TREE[i], preimage).u
  126. pedersen_hash curhash preimage MERKLE_0
  127. ec_get_u cur curhash
  128. # ... repeat the above N times
  129. ###############################################
  130. # enforce cur == rt
  131. alloc_num rt param:anchor
  132. num_enforce_equal cur rt
  133. # emit rt
  134. emit_num rt
  135. # let rho: Point = rho + position * G_NULL
  136. ec_mul_const position position_bits G_NULL
  137. ec_add rho rho position
  138. # nf_preimage.put(rho)
  139. ec_repr repr_rho rho
  140. binary_extend nf_preimage repr_rho
  141. # assert nf_preimage.len() == 512
  142. static_assert_binary_size nf_preimage 512
  143. # let nf: BinaryNumber = blake2s(nf_preimage, PRF_NF)
  144. blake2s nf nf_preimage PRF_NF
  145. emit_binary nf
  146. end