mint.pism 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # :set syntax=pism
  2. # :source ../scripts/pism.vim
  3. constant G_VCV FixedGenerator
  4. constant G_VCR FixedGenerator
  5. constant CRH_IVK BlakePersonalization
  6. #constant JUBJUB_FR_CAPACITY BinarySize
  7. #constant NOTE_COMMIT PedersenPersonalization
  8. contract mint_contract
  9. # Value commitment
  10. param value U64
  11. param asset_id U64
  12. param randomness_value Fr
  13. param serial Fr
  14. param randomness_coin Fr
  15. param public Point
  16. start
  17. # Witness input values
  18. u64_as_binary_le value param:value
  19. u64_as_binary_le asset_id param:asset_id
  20. fr_as_binary_le randomness_value param:randomness_value
  21. fr_as_binary_le serial param:serial
  22. fr_as_binary_le randomness_coin param:randomness_coin
  23. witness public param:public
  24. assert_not_small_order public
  25. # Make value commitment
  26. # V = v * G_VCV + r * G_VCR
  27. ec_mul_const vcv value G_VCV
  28. ec_mul_const rcv randomness_value G_VCR
  29. ec_add cv vcv rcv
  30. # emit cv
  31. emit_ec cv
  32. # Make the coin
  33. # C = Hash(public_key, value, serial, randomness_coin)
  34. # Build the preimage to hash
  35. alloc_binary preimage
  36. # public_key
  37. ec_repr repr_public public
  38. binary_extend preimage repr_public
  39. # value
  40. binary_extend preimage value
  41. # asset_id
  42. binary_extend preimage asset_id
  43. # Fr values are 252 bits so we need to pad it with extra 0s
  44. # to match the Rust values which are 256 bits
  45. {% macro binary_put_fr(binary, var) -%}
  46. binary_extend {{ binary }} {{ var }}
  47. {% for n in range(4) %}
  48. alloc_const_bit zero_bit false
  49. binary_push {{ binary }} zero_bit
  50. {% endfor %}
  51. {%- endmacro %}
  52. # serial
  53. {{ binary_put_fr("preimage", "serial") }}
  54. # randomness_coin
  55. {{ binary_put_fr("preimage", "randomness_coin") }}
  56. # Public key: SubgroupPoint = 256 bits
  57. # Value: u64 = 64 bits
  58. # Serial: Fr = 252 + 4 bits padding
  59. # Randomness coin Fr = 252 + 4 bits padding
  60. # TOTAL: 896 bits for preimage
  61. static_assert_binary_size preimage 896
  62. blake2s coin preimage CRH_IVK
  63. emit_binary coin
  64. end