arnaucube
arnaucube/go-snarkPublic Self-hosted repository
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/groth16"
 11	"github.com/arnaucube/go-snark/wasm/utils"
 12)
 13
 14func main() {
 15	c := make(chan struct{}, 0)
 16	println("WASM Go Initialized")
 17	registerCallbacks()
 18	<-c
 19}
 20
 21func registerCallbacks() {
 22	js.Global().Set("generateProofs", js.FuncOf(generateProofs))
 23	js.Global().Set("verifyProofs", js.FuncOf(verifyProofs))
 24	js.Global().Set("grothGenerateProofs", js.FuncOf(grothGenerateProofs))
 25	js.Global().Set("grothVerifyProofs", js.FuncOf(grothVerifyProofs))
 26}
 27
 28func generateProofs(this js.Value, i []js.Value) interface{} {
 29	var circuitStr utils.CircuitString
 30	err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
 31	if err != nil {
 32		println(i[0].String())
 33		println("error parsing circuit from stringified json")
 34	}
 35	circuit, err := utils.CircuitFromString(circuitStr)
 36	if err != nil {
 37		println("error " + err.Error())
 38	}
 39	sj, err := json.Marshal(circuit)
 40	if err != nil {
 41		println("error " + err.Error())
 42	}
 43	println("circuit", string(sj))
 44
 45	var setupStr utils.SetupString
 46	println(i[1].String())
 47	err = json.Unmarshal([]byte(i[1].String()), &setupStr)
 48	if err != nil {
 49		println("error parsing setup from stringified json")
 50	}
 51	setup, err := utils.SetupFromString(setupStr)
 52	if err != nil {
 53		println("error " + err.Error())
 54	}
 55	sj, err = json.Marshal(setup)
 56	if err != nil {
 57		println("error " + err.Error())
 58	}
 59	println("set", string(sj))
 60
 61	var pxStr []string
 62	err = json.Unmarshal([]byte(i[2].String()), &pxStr)
 63	if err != nil {
 64		println("error parsing pxStr from stringified json")
 65	}
 66	px, err := utils.ArrayStringToBigInt(pxStr)
 67	if err != nil {
 68		println(err.Error())
 69	}
 70	sj, err = json.Marshal(px)
 71	if err != nil {
 72		println("error " + err.Error())
 73	}
 74	println("px", string(sj))
 75
 76	var inputs circuitcompiler.Inputs
 77	err = json.Unmarshal([]byte(i[3].String()), &inputs)
 78	if err != nil {
 79		println("error parsing inputs from stringified json")
 80	}
 81	w, err := circuit.CalculateWitness(inputs.Private, inputs.Public)
 82
 83	proof, err := snark.GenerateProofs(circuit, setup, w, px)
 84	if err != nil {
 85		println("error generating proof", err)
 86	}
 87	proofString := utils.ProofToString(proof)
 88	proofJson, err := json.Marshal(proofString)
 89	if err != nil {
 90		println("error marshal proof to json", err)
 91	}
 92	println("proofJson", string(proofJson))
 93	return js.ValueOf(string(proofJson))
 94}
 95
 96func verifyProofs(this js.Value, i []js.Value) interface{} {
 97	var circuitStr utils.CircuitString
 98	err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
 99	if err != nil {
100		println(i[0].String())
101		println("error parsing circuit from stringified json")
102	}
103	circuit, err := utils.CircuitFromString(circuitStr)
104	if err != nil {
105		println("error " + err.Error())
106	}
107
108	var setupStr utils.SetupString
109	println(i[1].String())
110	err = json.Unmarshal([]byte(i[1].String()), &setupStr)
111	if err != nil {
112		println("error parsing setup from stringified json")
113	}
114	setup, err := utils.SetupFromString(setupStr)
115	if err != nil {
116		println("error " + err.Error())
117	}
118
119	var proofStr utils.ProofString
120	err = json.Unmarshal([]byte(i[2].String()), &proofStr)
121	if err != nil {
122		println(i[0].String())
123		println("error parsing proof from stringified json")
124	}
125	proof, err := utils.ProofFromString(proofStr)
126	if err != nil {
127		println("error " + err.Error())
128	}
129
130	var publicInputs []*big.Int
131	err = json.Unmarshal([]byte(i[3].String()), &publicInputs)
132	if err != nil {
133		println(i[0].String())
134		println("error parsing publicInputs from stringified json")
135	}
136
137	verified := snark.VerifyProof(circuit, setup, proof, publicInputs, false)
138	if err != nil {
139		println("error verifiyng proof", err)
140	}
141	verifiedJson, err := json.Marshal(verified)
142	if err != nil {
143		println("error marshal verified to json", err)
144	}
145	println("verifiedJson", string(verifiedJson))
146	return js.ValueOf(string(verifiedJson))
147}
148
149func grothGenerateProofs(this js.Value, i []js.Value) interface{} {
150	var circuitStr utils.CircuitString
151	err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
152	if err != nil {
153		println(i[0].String())
154		println("error parsing circuit from stringified json")
155	}
156	circuit, err := utils.CircuitFromString(circuitStr)
157	if err != nil {
158		println("error " + err.Error())
159	}
160	sj, err := json.Marshal(circuit)
161	if err != nil {
162		println("error " + err.Error())
163	}
164	println("circuit", string(sj))
165
166	var setupStr utils.GrothSetupString
167	println(i[1].String())
168	err = json.Unmarshal([]byte(i[1].String()), &setupStr)
169	if err != nil {
170		println("error parsing setup from stringified json")
171	}
172	setup, err := utils.GrothSetupFromString(setupStr)
173	if err != nil {
174		println("error " + err.Error())
175	}
176	sj, err = json.Marshal(setup)
177	if err != nil {
178		println("error " + err.Error())
179	}
180	println("set", string(sj))
181
182	var pxStr []string
183	err = json.Unmarshal([]byte(i[2].String()), &pxStr)
184	if err != nil {
185		println("error parsing pxStr from stringified json")
186	}
187	px, err := utils.ArrayStringToBigInt(pxStr)
188	if err != nil {
189		println(err.Error())
190	}
191	sj, err = json.Marshal(px)
192	if err != nil {
193		println("error " + err.Error())
194	}
195	println("px", string(sj))
196
197	var inputs circuitcompiler.Inputs
198	err = json.Unmarshal([]byte(i[3].String()), &inputs)
199	if err != nil {
200		println("error parsing inputs from stringified json")
201	}
202	w, err := circuit.CalculateWitness(inputs.Private, inputs.Public)
203
204	proof, err := groth16.GenerateProofs(circuit, setup, w, px)
205	if err != nil {
206		println("error generating proof", err)
207	}
208	proofString := utils.GrothProofToString(proof)
209	proofJson, err := json.Marshal(proofString)
210	if err != nil {
211		println("error marshal proof to json", err)
212	}
213	println("proofJson", string(proofJson))
214	return js.ValueOf(string(proofJson))
215}
216
217func grothVerifyProofs(this js.Value, i []js.Value) interface{} {
218	var circuitStr utils.CircuitString
219	err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
220	if err != nil {
221		println(i[0].String())
222		println("error parsing circuit from stringified json")
223	}
224	circuit, err := utils.CircuitFromString(circuitStr)
225	if err != nil {
226		println("error " + err.Error())
227	}
228
229	var setupStr utils.GrothSetupString
230	println(i[1].String())
231	err = json.Unmarshal([]byte(i[1].String()), &setupStr)
232	if err != nil {
233		println("error parsing setup from stringified json")
234	}
235	setup, err := utils.GrothSetupFromString(setupStr)
236	if err != nil {
237		println("error " + err.Error())
238	}
239
240	var proofStr utils.GrothProofString
241	err = json.Unmarshal([]byte(i[2].String()), &proofStr)
242	if err != nil {
243		println(i[0].String())
244		println("error parsing proof from stringified json")
245	}
246	proof, err := utils.GrothProofFromString(proofStr)
247	if err != nil {
248		println("error " + err.Error())
249	}
250
251	var publicInputs []*big.Int
252	err = json.Unmarshal([]byte(i[3].String()), &publicInputs)
253	if err != nil {
254		println(i[0].String())
255		println("error parsing publicInputs from stringified json")
256	}
257
258	verified := groth16.VerifyProof(circuit, setup, proof, publicInputs, false)
259	if err != nil {
260		println("error verifiyng proof", err)
261	}
262	verifiedJson, err := json.Marshal(verified)
263	if err != nil {
264		println("error marshal verified to json", err)
265	}
266	println("verifiedJson", string(verifiedJson))
267	return js.ValueOf(string(verifiedJson))
268}