mint.pism 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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 randomness_asset Fr
  14. param serial Fr
  15. param randomness_coin Fr
  16. param public Point
  17. start
  18. # Witness input values
  19. u64_as_binary_le value param:value
  20. u64_as_binary_le asset_id param:asset_id
  21. fr_as_binary_le randomness_value param:randomness_value
  22. fr_as_binary_le randomness_asset param:randomness_asset
  23. fr_as_binary_le serial param:serial
  24. fr_as_binary_le randomness_coin param:randomness_coin
  25. witness public param:public
  26. assert_not_small_order public
  27. # Make value commitment
  28. # V = v * G_VCV + r * G_VCR
  29. ec_mul_const vcv value G_VCV
  30. ec_mul_const rcv randomness_value G_VCR
  31. ec_add cv vcv rcv
  32. # emit cv
  33. emit_ec cv
  34. # Make asset_id commitment
  35. # A = a * G_VCV + r_a * G_VCR
  36. ec_mul_const vca asset_id G_VCV
  37. ec_mul_const rca randomness_asset G_VCR
  38. ec_add ca vca rca
  39. # emit ca
  40. emit_ec ca
  41. # Make the coin
  42. # C = Hash(public_key, value, asset_id, serial, randomness_coin)
  43. # Build the preimage to hash
  44. alloc_binary preimage
  45. # public_key
  46. ec_repr repr_public public
  47. binary_extend preimage repr_public
  48. # value
  49. binary_extend preimage value
  50. # asset_id
  51. binary_extend preimage asset_id
  52. # Fr values are 252 bits so we need to pad it with extra 0s
  53. # to match the Rust values which are 256 bits
  54. {% macro binary_put_fr(binary, var) -%}
  55. binary_extend {{ binary }} {{ var }}
  56. {% for n in range(4) %}
  57. alloc_const_bit zero_bit false
  58. binary_push {{ binary }} zero_bit
  59. {% endfor %}
  60. {%- endmacro %}
  61. # serial
  62. {{ binary_put_fr("preimage", "serial") }}
  63. # randomness_coin
  64. {{ binary_put_fr("preimage", "randomness_coin") }}
  65. # Public key: SubgroupPoint = 256 bits
  66. # Value: u64 = 64 bits
  67. # Serial: Fr = 252 + 4 bits padding
  68. # Randomness coin Fr = 252 + 4 bits padding
  69. # TOTAL: 896 bits for preimage
  70. static_assert_binary_size preimage 896
  71. blake2s coin preimage CRH_IVK
  72. emit_binary coin
  73. end