Files
darkfi/lisp/racket/jj.rkt
2020-10-28 01:26:55 +01:00

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)