mint.pism 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 token_id Fr
  12. param randomness_value Fr
  13. param randomness_token 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. fr_as_binary_le token_id param:token_id
  21. fr_as_binary_le randomness_value param:randomness_value
  22. fr_as_binary_le randomness_token param:randomness_token
  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 token_id commitment
  35. # A = a * G_VCV + r_a * G_VCR
  36. ec_mul_const vca token_id G_VCV
  37. ec_mul_const rca randomness_token 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, token_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. # Fr values are 252 bits so we need to pad it with extra 0s
  51. # to match the Rust values which are 256 bits
  52. {% macro binary_put_fr(binary, var) -%}
  53. binary_extend {{ binary }} {{ var }}
  54. {% for n in range(4) %}
  55. alloc_const_bit zero_bit false
  56. binary_push {{ binary }} zero_bit
  57. {% endfor %}
  58. {%- endmacro %}
  59. # serial
  60. {{ binary_put_fr("preimage", "serial") }}
  61. # randomness_coin
  62. {{ binary_put_fr("preimage", "randomness_coin") }}
  63. # token_id
  64. {{ binary_put_fr("preimage", "token_id") }}
  65. # Public key: SubgroupPoint = 256 bits
  66. # Value: u64 = 64 bits
  67. # AssetID: Fr = 252 + 4 bits padding
  68. # Serial: Fr = 252 + 4 bits padding
  69. # Randomness coin Fr = 252 + 4 bits padding
  70. # TOTAL: 1088 bits for preimage
  71. static_assert_binary_size preimage 1088
  72. blake2s coin preimage CRH_IVK
  73. emit_binary coin
  74. end