go-snark/wasm/go-snark-wasm-wrapper.go
wasm/go-snark-wasm-wrapper.goRaw
1package main
2
3import (
4 "encoding/json"
5 "math/big"
6 "syscall/js"
7
8 "github.com/arnaucube/go-snark"
9 "github.com/arnaucube/go-snark/circuitcompiler"
10 "github.com/arnaucube/go-snark/wasm/utils"
11)
12
13func main() {
14 c := make(chan struct{}, 0)
15 println("WASM Go Initialized")
16 registerCallbacks()
17 <-c
18}
19
20func registerCallbacks() {
21 js.Global().Set("generateProofs", js.FuncOf(generateProofs))
22 js.Global().Set("verifyProofs", js.FuncOf(verifyProofs))
23}
24
25func generateProofs(this js.Value, i []js.Value) interface{} {
26 var circuitStr utils.CircuitString
27 err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
28 if err != nil {
29 println(i[0].String())
30 println("error parsing circuit from stringified json")
31 }
32 circuit, err := utils.CircuitFromString(circuitStr)
33 if err != nil {
34 println("error " + err.Error())
35 }
36 sj, err := json.Marshal(circuit)
37 if err != nil {
38 println("error " + err.Error())
39 }
40 println("circuit", string(sj))
41
42 var setupStr utils.SetupString
43 println(i[1].String())
44 err = json.Unmarshal([]byte(i[1].String()), &setupStr)
45 if err != nil {
46 println("error parsing setup from stringified json")
47 }
48 setup, err := utils.SetupFromString(setupStr)
49 if err != nil {
50 println("error " + err.Error())
51 }
52 sj, err = json.Marshal(setup)
53 if err != nil {
54 println("error " + err.Error())
55 }
56 println("set", string(sj))
57
58 var pxStr []string
59 err = json.Unmarshal([]byte(i[2].String()), &pxStr)
60 if err != nil {
61 println("error parsing pxStr from stringified json")
62 }
63 px, err := utils.ArrayStringToBigInt(pxStr)
64 if err != nil {
65 println(err.Error())
66 }
67 sj, err = json.Marshal(px)
68 if err != nil {
69 println("error " + err.Error())
70 }
71 println("px", string(sj))
72
73 var inputs circuitcompiler.Inputs
74 err = json.Unmarshal([]byte(i[3].String()), &inputs)
75 if err != nil {
76 println("error parsing inputs from stringified json")
77 }
78 w, err := circuit.CalculateWitness(inputs.Private, inputs.Public)
79
80 proof, err := snark.GenerateProofs(circuit, setup, w, px)
81 if err != nil {
82 println("error generating proof", err)
83 }
84 proofString := utils.ProofToString(proof)
85 proofJson, err := json.Marshal(proofString)
86 if err != nil {
87 println("error marshal proof to json", err)
88 }
89 println("proofJson", string(proofJson))
90 return js.ValueOf(string(proofJson))
91}
92
93func verifyProofs(this js.Value, i []js.Value) interface{} {
94 var circuitStr utils.CircuitString
95 err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
96 if err != nil {
97 println(i[0].String())
98 println("error parsing circuit from stringified json")
99 }
100 circuit, err := utils.CircuitFromString(circuitStr)
101 if err != nil {
102 println("error " + err.Error())
103 }
104
105 var setupStr utils.SetupString
106 println(i[1].String())
107 err = json.Unmarshal([]byte(i[1].String()), &setupStr)
108 if err != nil {
109 println("error parsing setup from stringified json")
110 }
111 setup, err := utils.SetupFromString(setupStr)
112 if err != nil {
113 println("error " + err.Error())
114 }
115
116 var proofStr utils.ProofString
117 err = json.Unmarshal([]byte(i[2].String()), &proofStr)
118 if err != nil {
119 println(i[0].String())
120 println("error parsing proof from stringified json")
121 }
122 proof, err := utils.ProofFromString(proofStr)
123 if err != nil {
124 println("error " + err.Error())
125 }
126
127 var publicInputs []*big.Int
128 err = json.Unmarshal([]byte(i[3].String()), &publicInputs)
129 if err != nil {
130 println(i[0].String())
131 println("error parsing publicInputs from stringified json")
132 }
133
134 verified := snark.VerifyProof(circuit, setup, proof, publicInputs, false)
135 if err != nil {
136 println("error verifiyng proof", err)
137 }
138 verifiedJson, err := json.Marshal(verified)
139 if err != nil {
140 println("error marshal verified to json", err)
141 }
142 println("verifiedJson", string(verifiedJson))
143 return js.ValueOf(string(verifiedJson))
144}