# :set syntax=pism # :source ../scripts/pism.vim constant G_VCV FixedGenerator constant G_VCR FixedGenerator constant CRH_IVK BlakePersonalization #constant JUBJUB_FR_CAPACITY BinarySize #constant NOTE_COMMIT PedersenPersonalization contract mint_contract # Value commitment param value U64 param randomness_value Fr param serial Fr param randomness_coin Fr param public Point start # Witness input values u64_as_binary_le value param:value fr_as_binary_le randomness_value param:randomness_value fr_as_binary_le serial param:serial fr_as_binary_le randomness_coin param:randomness_coin witness public param:public assert_not_small_order public # Make value commitment # V = v * G_VCV + r * G_VCR ec_mul_const vcv value G_VCV ec_mul_const rcv randomness_value G_VCR ec_add cv vcv rcv # emit cv emit_ec cv # Make the coin # C = Hash(public_key, value, serial, randomness_coin) # Build the preimage to hash alloc_binary preimage # public_key ec_repr repr_public public binary_extend preimage repr_public # value binary_extend preimage value # Fr values are 252 bits so we need to pad it with extra 0s # to match the Rust values which are 256 bits {% macro binary_put_fr(binary, var) -%} binary_extend {{ binary }} {{ var }} {% for n in range(4) %} alloc_const_bit zero_bit false binary_push {{ binary }} zero_bit {% endfor %} {%- endmacro %} # serial {{ binary_put_fr("preimage", "serial") }} # randomness_coin {{ binary_put_fr("preimage", "randomness_coin") }} # Public key: SubgroupPoint = 256 bits # Value: u64 = 64 bits # Serial: Fr = 252 + 4 bits padding # Randomness coin Fr = 252 + 4 bits padding # TOTAL: 832 bits for preimage static_assert_binary_size preimage 832 blake2s coin preimage CRH_IVK emit_binary coin end