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/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}