mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-01-06 21:34:00 -05:00
114 lines
3.1 KiB
Racket
114 lines
3.1 KiB
Racket
#lang racket
|
|
|
|
(require "zk.rkt")
|
|
|
|
(struct jj_point
|
|
(u v)
|
|
)
|
|
|
|
(define (create_jj_param_point name)
|
|
(jj_point
|
|
(zk_param (string-append name "_u"))
|
|
(zk_param (string-append name "_v"))
|
|
)
|
|
)
|
|
(define (create_jj_public_point name)
|
|
(jj_point
|
|
(zk_public (string-append name "_u"))
|
|
(zk_public (string-append name "_v"))
|
|
)
|
|
)
|
|
|
|
(define (zk_jj_add namespace result a b)
|
|
(zk_comment "call jj_add()")
|
|
(let* ([namespace (append namespace (list "_jj_add"))]
|
|
[U (zk_private namespace 'U)]
|
|
[A (zk_private namespace 'A)]
|
|
[B (zk_private namespace 'B)]
|
|
[C (zk_private namespace 'C)]
|
|
[tmp (zk_local namespace 'tmp)])
|
|
(zk_comment "Compute U = (x1 + y1) * (y2 - EDWARDS_A*x2)")
|
|
(zk_comment " = (x1 + y1) * (x2 + y2)")
|
|
(zk_set U (jj_point-u a))
|
|
(zk_add U (jj_point-v a))
|
|
|
|
(zk_set tmp (jj_point-u b))
|
|
(zk_add tmp (jj_point-v b))
|
|
|
|
(zk_mul U tmp)
|
|
|
|
(zk_comment "assert (x1 + y1) * (x2 + y2) == U")
|
|
(zk_lc0_add (jj_point-u a))
|
|
(zk_lc0_add (jj_point-v a))
|
|
(zk_lc1_add (jj_point-u b))
|
|
(zk_lc1_add (jj_point-v b))
|
|
(zk_lc2_add U)
|
|
(zk_enforce)
|
|
|
|
(zk_comment "Compute A = y2 * x1")
|
|
(zk_set A (jj_point-v b))
|
|
(zk_mul A (jj_point-u a))
|
|
(zk_comment "Compute B = x2 * y1")
|
|
(zk_set B (jj_point-u b))
|
|
(zk_mul B (jj_point-v a))
|
|
(zk_comment "Compute C = d*A*B")
|
|
(zk_load C const_d)
|
|
(zk_mul C A)
|
|
(zk_mul C B)
|
|
|
|
(zk_comment "assert (d * A) * (B) == C")
|
|
(zk_lc0_add_coeff const_d A)
|
|
(zk_lc1_add B)
|
|
(zk_lc2_add C)
|
|
(zk_enforce)
|
|
|
|
(zk_comment "Compute P.x = (A + B) / (1 + C)")
|
|
(zk_set (jj_point-u result) A)
|
|
(zk_add (jj_point-u result) B)
|
|
; Re-use the tmp variable from earlier here
|
|
(zk_load tmp const_one)
|
|
(zk_add tmp C)
|
|
(zk_divide (jj_point-u result) tmp)
|
|
|
|
(zk_lc0_add_one)
|
|
(zk_lc0_add C)
|
|
(zk_lc1_add (jj_point-u result))
|
|
(zk_lc2_add A)
|
|
(zk_lc2_add B)
|
|
(zk_enforce)
|
|
|
|
(zk_comment "Compute P.y = (U - A - B) / (1 - C)")
|
|
(zk_set (jj_point-v result) U)
|
|
(zk_sub (jj_point-v result) A)
|
|
(zk_sub (jj_point-v result) B)
|
|
; Re-use the tmp variable from earlier here
|
|
(zk_load tmp const_one)
|
|
(zk_sub tmp C)
|
|
(zk_divide (jj_point-v result) tmp)
|
|
|
|
(zk_lc0_add_one)
|
|
(zk_lc0_sub C)
|
|
(zk_lc1_add (jj_point-v result))
|
|
(zk_lc2_add U)
|
|
(zk_lc2_sub A)
|
|
(zk_lc2_sub B)
|
|
(zk_enforce)
|
|
)
|
|
)
|
|
|
|
(create_zk_output "jj.psm")
|
|
|
|
(define const_d (zk_constant
|
|
"d" "0x2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1"))
|
|
(define const_one (zk_constant
|
|
"one" "0x0000000000000000000000000000000000000000000000000000000000000001"))
|
|
|
|
(zk_contract_begin "foo")
|
|
(define namespace (list "_"))
|
|
(define a (create_jj_param_point "a"))
|
|
(define b (create_jj_param_point "b"))
|
|
(define result (create_jj_public_point "result"))
|
|
(zk_jj_add namespace result a b)
|
|
(zk_contract_end)
|
|
|