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:
@@ -41,7 +41,7 @@ Improvements from the minimal implementation:
|
|||||||
- [x] Groth16
|
- [x] Groth16
|
||||||
- [ ] multiple optimizations
|
- [ ] multiple optimizations
|
||||||
- [x] wasm proof generation
|
- [x] wasm proof generation
|
||||||
- [ ] wasm proof verification
|
- [x] wasm proof verification
|
||||||
|
|
||||||
## WASM usage
|
## WASM usage
|
||||||
Ongoing experimentation with go-snark compiled to wasm: https://github.com/arnaucube/go-snark/tree/master/wasm
|
Ongoing experimentation with go-snark compiled to wasm: https://github.com/arnaucube/go-snark/tree/master/wasm
|
||||||
|
|||||||
BIN
go-snark-cli
BIN
go-snark-cli
Binary file not shown.
@@ -12,15 +12,7 @@ Add the file `wasm_exec.js` in the directory:
|
|||||||
cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .
|
cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .
|
||||||
```
|
```
|
||||||
|
|
||||||
Call the library from javascript:
|
To see the usage from javascript, check `index.js` file.
|
||||||
```js
|
|
||||||
let r = generateProofs(
|
|
||||||
JSON.stringify(circuit),
|
|
||||||
JSON.stringify(setup),
|
|
||||||
JSON.stringify(px),
|
|
||||||
JSON.stringify(inputs),
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
Run the http server that allows to load the `.wasm` file:
|
Run the http server that allows to load the `.wasm` file:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"math/big"
|
||||||
"syscall/js"
|
"syscall/js"
|
||||||
|
|
||||||
"github.com/arnaucube/go-snark"
|
"github.com/arnaucube/go-snark"
|
||||||
@@ -11,15 +12,14 @@ import (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
c := make(chan struct{}, 0)
|
c := make(chan struct{}, 0)
|
||||||
|
|
||||||
println("WASM Go Initialized")
|
println("WASM Go Initialized")
|
||||||
// register functions
|
|
||||||
registerCallbacks()
|
registerCallbacks()
|
||||||
<-c
|
<-c
|
||||||
}
|
}
|
||||||
|
|
||||||
func registerCallbacks() {
|
func registerCallbacks() {
|
||||||
js.Global().Set("generateProofs", js.FuncOf(generateProofs))
|
js.Global().Set("generateProofs", js.FuncOf(generateProofs))
|
||||||
|
js.Global().Set("verifyProofs", js.FuncOf(verifyProofs))
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateProofs(this js.Value, i []js.Value) interface{} {
|
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))
|
println("proofJson", string(proofJson))
|
||||||
return js.ValueOf(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>
|
<button onClick="callGenerateProof();">Generate Proof</button>
|
||||||
<textarea id="proofResult" rows="15" style="width: 80%;">
|
<textarea id="proofResult" rows="15" style="width: 80%;">
|
||||||
</textarea>
|
</textarea>
|
||||||
|
<button onClick="callVerifyProof();">Verify Proof</button>
|
||||||
<script src="index.js"></script>
|
<script src="index.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</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.Bp = Array3BigIntToString(setup.Pk.Bp)
|
||||||
s.Pk.Cp = Array3BigIntToString(setup.Pk.Cp)
|
s.Pk.Cp = Array3BigIntToString(setup.Pk.Cp)
|
||||||
s.Pk.Z = ArrayBigIntToString(setup.Pk.Z)
|
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
|
return s
|
||||||
}
|
}
|
||||||
func SetupFromString(s SetupString) (snark.Setup, error) {
|
func SetupFromString(s SetupString) (snark.Setup, error) {
|
||||||
@@ -214,6 +222,40 @@ func SetupFromString(s SetupString) (snark.Setup, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return o, err
|
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
|
return o, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user