mirror of
https://github.com/arnaucube/go-snark-study.git
synced 2026-02-02 17:26:41 +01:00
add wasm snark proof verification function (Pinocchio)
This commit is contained in:
@@ -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:
|
||||
```
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -14,6 +14,7 @@
|
||||
<button onClick="callGenerateProof();">Generate Proof</button>
|
||||
<textarea id="proofResult" rows="15" style="width: 80%;">
|
||||
</textarea>
|
||||
<button onClick="callVerifyProof();">Verify Proof</button>
|
||||
<script src="index.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -169,6 +169,14 @@ func SetupToString(setup snark.Setup) SetupString {
|
||||
s.Pk.Bp = Array3BigIntToString(setup.Pk.Bp)
|
||||
s.Pk.Cp = Array3BigIntToString(setup.Pk.Cp)
|
||||
s.Pk.Z = ArrayBigIntToString(setup.Pk.Z)
|
||||
s.Vk.Vka = BigInt32ToString(setup.Vk.Vka)
|
||||
s.Vk.Vkb = BigInt3ToString(setup.Vk.Vkb)
|
||||
s.Vk.Vkc = BigInt32ToString(setup.Vk.Vkc)
|
||||
s.Vk.IC = Array3BigIntToString(setup.Vk.IC)
|
||||
s.Vk.G1Kbg = BigInt3ToString(setup.Vk.G1Kbg)
|
||||
s.Vk.G2Kbg = BigInt32ToString(setup.Vk.G2Kbg)
|
||||
s.Vk.G2Kg = BigInt32ToString(setup.Vk.G2Kg)
|
||||
s.Vk.Vkz = BigInt32ToString(setup.Vk.Vkz)
|
||||
return s
|
||||
}
|
||||
func SetupFromString(s SetupString) (snark.Setup, error) {
|
||||
@@ -214,6 +222,40 @@ func SetupFromString(s SetupString) (snark.Setup, error) {
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
|
||||
o.Vk.Vka, err = String32ToBigInt(s.Vk.Vka)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
o.Vk.Vkb, err = String3ToBigInt(s.Vk.Vkb)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
o.Vk.Vkc, err = String32ToBigInt(s.Vk.Vkc)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
o.Vk.IC, err = Array3StringToBigInt(s.Vk.IC)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
o.Vk.G1Kbg, err = String3ToBigInt(s.Vk.G1Kbg)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
o.Vk.G2Kbg, err = String32ToBigInt(s.Vk.G2Kbg)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
o.Vk.G2Kg, err = String32ToBigInt(s.Vk.G2Kg)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
o.Vk.Vkz, err = String32ToBigInt(s.Vk.Vkz)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
|
||||
return o, nil
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user