diff --git a/README.md b/README.md
index 52c79aa..be7f939 100644
--- a/README.md
+++ b/README.md
@@ -41,7 +41,7 @@ Improvements from the minimal implementation:
- [x] Groth16
- [ ] multiple optimizations
- [x] wasm proof generation
-- [ ] wasm proof verification
+- [x] wasm proof verification
## WASM usage
Ongoing experimentation with go-snark compiled to wasm: https://github.com/arnaucube/go-snark/tree/master/wasm
diff --git a/go-snark-cli b/go-snark-cli
index a0dc726..6266a0e 100755
Binary files a/go-snark-cli and b/go-snark-cli differ
diff --git a/wasm/README.md b/wasm/README.md
index a95ee81..5fdae15 100644
--- a/wasm/README.md
+++ b/wasm/README.md
@@ -12,15 +12,7 @@ Add the file `wasm_exec.js` in the directory:
cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .
```
-Call the library from javascript:
-```js
-let r = generateProofs(
- JSON.stringify(circuit),
- JSON.stringify(setup),
- JSON.stringify(px),
- JSON.stringify(inputs),
-);
-```
+To see the usage from javascript, check `index.js` file.
Run the http server that allows to load the `.wasm` file:
```
diff --git a/wasm/go-snark-wasm-wrapper.go b/wasm/go-snark-wasm-wrapper.go
index 8f96c03..44cc8b9 100644
--- a/wasm/go-snark-wasm-wrapper.go
+++ b/wasm/go-snark-wasm-wrapper.go
@@ -2,6 +2,7 @@ package main
import (
"encoding/json"
+ "math/big"
"syscall/js"
"github.com/arnaucube/go-snark"
@@ -11,15 +12,14 @@ import (
func main() {
c := make(chan struct{}, 0)
-
println("WASM Go Initialized")
- // register functions
registerCallbacks()
<-c
}
func registerCallbacks() {
js.Global().Set("generateProofs", js.FuncOf(generateProofs))
+ js.Global().Set("verifyProofs", js.FuncOf(verifyProofs))
}
func generateProofs(this js.Value, i []js.Value) interface{} {
@@ -89,3 +89,56 @@ func generateProofs(this js.Value, i []js.Value) interface{} {
println("proofJson", string(proofJson))
return js.ValueOf(string(proofJson))
}
+
+func verifyProofs(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())
+ }
+
+ 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())
+ }
+
+ var proofStr utils.ProofString
+ err = json.Unmarshal([]byte(i[2].String()), &proofStr)
+ if err != nil {
+ println(i[0].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[3].String()), &publicInputs)
+ if err != nil {
+ println(i[0].String())
+ println("error parsing publicInputs from stringified json")
+ }
+
+ verified := snark.VerifyProof(circuit, setup, 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))
+}
diff --git a/wasm/go-snark.wasm b/wasm/go-snark.wasm
index da3d99b..9b56560 100755
Binary files a/wasm/go-snark.wasm and b/wasm/go-snark.wasm differ
diff --git a/wasm/index.html b/wasm/index.html
index a2a05b0..fd9dec3 100644
--- a/wasm/index.html
+++ b/wasm/index.html
@@ -14,6 +14,7 @@
+