spend.pseudo 1000 B

12345678910111213141516171819202122232425262728293031323334
  1. param secret
  2. param serial
  3. param coin_merkle_branch[4]
  4. param coin_merkle_is_right[4]
  5. constant generator_coin
  6. constant generator_value_commit_value
  7. constant generator_value_commit_random
  8. public nullifier = mimc_hash(secret, serial)
  9. private (public_u, public_v) = jj_mul(secret, generator_coin)
  10. public coin = mimc_hash(public_u, public_v, value, serial, randomness_coin)
  11. let current = coin
  12. for i in range(4):
  13. branch = coin_merkle_branch[i]
  14. is_right = coin_merkle_is_right[i]
  15. # reverse(a, b, condition) = if condition (b, a) else (a, b)
  16. private left, right = conditionally_reverse(current, branch, is_right)
  17. # Only the last one is public
  18. if i == 3:
  19. current = public mimc_hash(left, right)
  20. else:
  21. current = private mimc_hash(left, right)
  22. private value_digits = unpack(value)
  23. rangeproof_assert(value, value_digits)
  24. public value_commit = jj_add(
  25. jj_mul(value, generator_value_commit_value),
  26. jj_mul(randomness_value, generator_value_commit_random)
  27. )