| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- # :set syntax=drk
- # :source ../scripts/drk.vim
- const:
- G_VCV: SubgroupPoint
- G_VCR: SubgroupPoint
- G_SPEND: SubgroupPoint
- G_PROOF: SubgroupPoint
- G_NOTE_COMMIT_R: SubgroupPoint
- G_NULL: SubgroupPoint
- CRH_IVK: Blake2sPersonalization
- NOTE_COMMIT: PedersenPersonalization
- MERKLE: list<PedersenPersonalization>
- PRF_NF: Blake2sPersonalization
- contract input_spend(
- value: U64 -> BinaryNumber
- randomness: Fr -> BinaryNumber
- ak: Point
- ar: Fr -> BinaryNumber
- nsk: Fr -> BinaryNumber
- g_d: Point
- commitment_randomness: Fr -> BinaryNumber
- auth_path: [(Scalar, Bool)]
- anchor: Scalar
- ) -> (Point, Point, Scalar, BinaryNumber):
- let rk: Point = ak + ar * G_SPEND
- emit rk
- let nk: Point = nsk * G_PROOF
- let mut ivk_preimage: BinaryNumber = []
- ivk_preimage.put(ak)
- let mut nf_preimage: BinaryNumber = []
- ivk_preimage.put(nk)
- nf_preimage.put(nk)
- assert ivk_preimage.len() == 512
- assert nf_preimage.len() == 256
- let mut ivk = blake2s(ivk_preimage, CRH_IVK)
- ivk.truncate(JUBJUB_FR_CAPACITY)
- # This will error if ivk.len() != 256
- #let ivk: Fr = ivk as Fr
- let pk_d: Point = ivk * g_d
- let cv: Point = value * G_VCV + rcv * G_VCR
- emit cv
- let mut note_contents: BinaryNumber = []
- note_contents.put(value)
- note_contents.put(g_d)
- note_contents.put(p_k)
- assert note_contents.len() == 64 + 256 + 256
- let mut cm = pedersen_hash(note_contents, NOTE_COMMIT)
- cm += commitment_randomness * G_NOTE_COMMIT_R
- let mut position = []
- let mut cur: Scalar = cm.u
- for i in range(auth_path.size()):
- let (node: Scalar, is_right: Bool) = auth_path[i]
- position.push(is_right)
- # Scalar -> AllocatedNum
- let (left: Scalar, right: Scalar) = swap_if(is_right, cur, node)
- let mut preimage: BinaryNumber = []
- preimage.put(left)
- preimage.put(right)
- cur = pedersen_hash(MERKLE_TREE[i], preimage).u
- enforce cur == rt
- emit rt
- let rho: Point = rho + position * G_NULL
- nf_preimage.put(rho)
- assert nf_preimage.len() == 512
- let nf: BinaryNumber = blake2s(nf_preimage, PRF_NF)
- emit nf
- contract output_mint(
- value: U64 -> BinaryNumber
- randomness: Fr -> BinaryNumber
- g_d: Point
- esk: Fr -> BinaryNumber
- pk_d: Point
- commitment_randomness: Fr -> BinaryNumber
- ) -> (Point, Point, Scalar):
- let cv: Point = value * G_VCV + rcv * G_VCR
- emit cv
- let mut note_contents: Binary = []
- note_contents.put(value)
- let epk: Point = esk * g_d
- emit epk
- let v_contents: Scalar = pk_d.v
- let sign_bit: Bool = pk_d.u.is_odd()
- note_contents.put(v_contents)
- note_contents.put(sign_bit)
- assert len(note_contents) == 64 + 256 + 256
- let mut cm: Point = pedersen_hash(note_contents, NOTE_COMMIT)
- let rcm: Point = commitment_randomness * G_NOTE_COMMIT_R
- cm += rcm
- let cmu: Scalar = cm.u
- emit cmu
|