package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"math/big"
|
|
"syscall/js"
|
|
|
|
"github.com/arnaucube/go-snark"
|
|
"github.com/arnaucube/go-snark/circuitcompiler"
|
|
"github.com/arnaucube/go-snark/groth16"
|
|
"github.com/arnaucube/go-snark/utils"
|
|
)
|
|
|
|
func main() {
|
|
c := make(chan struct{}, 0)
|
|
println("WASM Go Initialized")
|
|
registerCallbacks()
|
|
<-c
|
|
}
|
|
|
|
func registerCallbacks() {
|
|
js.Global().Set("generateProofs", js.FuncOf(generateProofs))
|
|
js.Global().Set("verifyProofs", js.FuncOf(verifyProofs))
|
|
js.Global().Set("grothGenerateProofs", js.FuncOf(grothGenerateProofs))
|
|
js.Global().Set("grothVerifyProofs", js.FuncOf(grothVerifyProofs))
|
|
}
|
|
|
|
func generateProofs(this js.Value, i []js.Value) interface{} {
|
|
var circuitStr utils.CircuitString
|
|
err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
|
|
if err != nil {
|
|
println(i[0].String())
|
|
println("error parsing circuit from stringified json")
|
|
}
|
|
circuit, err := utils.CircuitFromString(circuitStr)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
sj, err := json.Marshal(circuit)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
println("circuit", string(sj))
|
|
|
|
var setupStr utils.SetupString
|
|
println(i[1].String())
|
|
err = json.Unmarshal([]byte(i[1].String()), &setupStr)
|
|
if err != nil {
|
|
println("error parsing setup from stringified json")
|
|
}
|
|
setup, err := utils.SetupFromString(setupStr)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
sj, err = json.Marshal(setup)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
println("set", string(sj))
|
|
|
|
var pxStr []string
|
|
err = json.Unmarshal([]byte(i[2].String()), &pxStr)
|
|
if err != nil {
|
|
println("error parsing pxStr from stringified json")
|
|
}
|
|
px, err := utils.ArrayStringToBigInt(pxStr)
|
|
if err != nil {
|
|
println(err.Error())
|
|
}
|
|
sj, err = json.Marshal(px)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
println("px", string(sj))
|
|
|
|
var inputs circuitcompiler.Inputs
|
|
err = json.Unmarshal([]byte(i[3].String()), &inputs)
|
|
if err != nil {
|
|
println("error parsing inputs from stringified json")
|
|
}
|
|
w, err := circuit.CalculateWitness(inputs.Private, inputs.Public)
|
|
|
|
proof, err := snark.GenerateProofs(circuit, setup.Pk, w, px)
|
|
if err != nil {
|
|
println("error generating proof", err)
|
|
}
|
|
proofString := utils.ProofToString(proof)
|
|
proofJson, err := json.Marshal(proofString)
|
|
if err != nil {
|
|
println("error marshal proof to json", err)
|
|
}
|
|
println("proofJson", string(proofJson))
|
|
return js.ValueOf(string(proofJson))
|
|
}
|
|
|
|
func verifyProofs(this js.Value, i []js.Value) interface{} {
|
|
var setupStr utils.SetupString
|
|
println(i[0].String())
|
|
err := json.Unmarshal([]byte(i[0].String()), &setupStr)
|
|
if err != nil {
|
|
println("error parsing setup from stringified json")
|
|
}
|
|
setup, err := utils.SetupFromString(setupStr)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
|
|
var proofStr utils.ProofString
|
|
err = json.Unmarshal([]byte(i[1].String()), &proofStr)
|
|
if err != nil {
|
|
println(i[1].String())
|
|
println("error parsing proof from stringified json")
|
|
}
|
|
proof, err := utils.ProofFromString(proofStr)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
|
|
var publicInputs []*big.Int
|
|
err = json.Unmarshal([]byte(i[2].String()), &publicInputs)
|
|
if err != nil {
|
|
println(i[2].String())
|
|
println("error parsing publicInputs from stringified json")
|
|
}
|
|
|
|
verified := snark.VerifyProof(setup.Vk, proof, publicInputs, false)
|
|
if err != nil {
|
|
println("error verifiyng proof", err)
|
|
}
|
|
verifiedJson, err := json.Marshal(verified)
|
|
if err != nil {
|
|
println("error marshal verified to json", err)
|
|
}
|
|
println("verifiedJson", string(verifiedJson))
|
|
return js.ValueOf(string(verifiedJson))
|
|
}
|
|
|
|
func grothGenerateProofs(this js.Value, i []js.Value) interface{} {
|
|
var circuitStr utils.CircuitString
|
|
err := json.Unmarshal([]byte(i[0].String()), &circuitStr)
|
|
if err != nil {
|
|
println(i[0].String())
|
|
println("error parsing circuit from stringified json")
|
|
}
|
|
circuit, err := utils.CircuitFromString(circuitStr)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
sj, err := json.Marshal(circuit)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
println("circuit", string(sj))
|
|
|
|
var setupStr utils.GrothSetupString
|
|
println(i[1].String())
|
|
err = json.Unmarshal([]byte(i[1].String()), &setupStr)
|
|
if err != nil {
|
|
println("error parsing setup from stringified json")
|
|
}
|
|
setup, err := utils.GrothSetupFromString(setupStr)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
sj, err = json.Marshal(setup)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
println("set", string(sj))
|
|
|
|
var pxStr []string
|
|
err = json.Unmarshal([]byte(i[2].String()), &pxStr)
|
|
if err != nil {
|
|
println("error parsing pxStr from stringified json")
|
|
}
|
|
px, err := utils.ArrayStringToBigInt(pxStr)
|
|
if err != nil {
|
|
println(err.Error())
|
|
}
|
|
sj, err = json.Marshal(px)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
println("px", string(sj))
|
|
|
|
var inputs circuitcompiler.Inputs
|
|
err = json.Unmarshal([]byte(i[3].String()), &inputs)
|
|
if err != nil {
|
|
println("error parsing inputs from stringified json")
|
|
}
|
|
w, err := circuit.CalculateWitness(inputs.Private, inputs.Public)
|
|
|
|
proof, err := groth16.GenerateProofs(circuit, setup.Pk, w, px)
|
|
if err != nil {
|
|
println("error generating proof", err)
|
|
}
|
|
proofString := utils.GrothProofToString(proof)
|
|
proofJson, err := json.Marshal(proofString)
|
|
if err != nil {
|
|
println("error marshal proof to json", err)
|
|
}
|
|
println("proofJson", string(proofJson))
|
|
return js.ValueOf(string(proofJson))
|
|
}
|
|
|
|
func grothVerifyProofs(this js.Value, i []js.Value) interface{} {
|
|
var setupStr utils.GrothSetupString
|
|
println(i[0].String())
|
|
err := json.Unmarshal([]byte(i[0].String()), &setupStr)
|
|
if err != nil {
|
|
println("error parsing setup from stringified json")
|
|
}
|
|
setup, err := utils.GrothSetupFromString(setupStr)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
|
|
var proofStr utils.GrothProofString
|
|
err = json.Unmarshal([]byte(i[1].String()), &proofStr)
|
|
if err != nil {
|
|
println(i[1].String())
|
|
println("error parsing proof from stringified json")
|
|
}
|
|
proof, err := utils.GrothProofFromString(proofStr)
|
|
if err != nil {
|
|
println("error " + err.Error())
|
|
}
|
|
|
|
var publicInputs []*big.Int
|
|
err = json.Unmarshal([]byte(i[2].String()), &publicInputs)
|
|
if err != nil {
|
|
println(i[2].String())
|
|
println("error parsing publicInputs from stringified json")
|
|
}
|
|
|
|
verified := groth16.VerifyProof(setup.Vk, proof, publicInputs, false)
|
|
if err != nil {
|
|
println("error verifiyng proof", err)
|
|
}
|
|
verifiedJson, err := json.Marshal(verified)
|
|
if err != nil {
|
|
println("error marshal verified to json", err)
|
|
}
|
|
println("verifiedJson", string(verifiedJson))
|
|
return js.ValueOf(string(verifiedJson))
|
|
}
|