spend.pism 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. constant G_VCV FixedGenerator
  2. constant G_VCR FixedGenerator
  3. constant G_SPEND FixedGenerator
  4. constant PRF_NF BlakePersonalization
  5. constant CRH_IVK BlakePersonalization
  6. contract spend_contract
  7. # Value commitment
  8. param value U64
  9. param randomness_value Fr
  10. param serial Fr
  11. param randomness_coin Fr
  12. param secret Fr
  13. start
  14. # Witness input values
  15. u64_as_binary_le value param:value
  16. fr_as_binary_le randomness_value param:randomness_value
  17. # Make value commitment
  18. # V = v * G_VCV + r * G_VCR
  19. ec_mul_const vcv value G_VCV
  20. ec_mul_const rcv randomness_value G_VCR
  21. ec_add cv vcv rcv
  22. # emit cv
  23. emit_ec cv
  24. # Make the nullifier
  25. # N = Hash(secret, serial)
  26. fr_as_binary_le serial param:serial
  27. fr_as_binary_le secret param:secret
  28. alloc_binary nf_preimage
  29. # Fr values are 252 bits so we need to pad it with extra 0s
  30. # to match the Rust values which are 256 bits
  31. {% macro binary_put_fr(binary, var) -%}
  32. binary_extend {{ binary }} {{ var }}
  33. {% for n in range(4) %}
  34. alloc_const_bit zero_bit false
  35. binary_push {{ binary }} zero_bit
  36. {% endfor %}
  37. {%- endmacro %}
  38. # secret
  39. binary_clone secret2 secret
  40. {{ binary_put_fr("nf_preimage", "secret2") }}
  41. # serial
  42. binary_clone serial2 serial
  43. {{ binary_put_fr("nf_preimage", "serial2") }}
  44. # Secret: Fr = 252 + 4 bits padding
  45. # Serial: Fr = 252 + 4 bits padding
  46. # TOTAL: 512 bits for preimage
  47. static_assert_binary_size nf_preimage 512
  48. blake2s nf nf_preimage PRF_NF
  49. emit_binary nf
  50. # Derive the public key
  51. # P = secret * G
  52. ec_mul_const public secret G_SPEND
  53. # Make the coin (same as mint contract)
  54. # C = Hash(public_key, value, serial, randomness_coin)
  55. fr_as_binary_le randomness_coin param:randomness_coin
  56. # Build the preimage to hash
  57. alloc_binary preimage
  58. # public_key
  59. ec_repr repr_public public
  60. binary_extend preimage repr_public
  61. # value
  62. binary_extend preimage value
  63. # serial
  64. {{ binary_put_fr("preimage", "serial") }}
  65. # randomness_coin
  66. {{ binary_put_fr("preimage", "randomness_coin") }}
  67. # Public key: SubgroupPoint = 256 bits
  68. # Value: u64 = 64 bits
  69. # Serial: Fr = 252 + 4 bits padding
  70. # Randomness coin Fr = 252 + 4 bits padding
  71. # TOTAL: 832 bits for preimage
  72. static_assert_binary_size preimage 832
  73. blake2s coin preimage CRH_IVK
  74. emit_binary coin
  75. end