@ -0,0 +1,3 @@ |
|||
node_modules |
|||
package-lock.json |
|||
wasm_exec.js |
@ -0,0 +1,28 @@ |
|||
# go-snark wasm |
|||
*Warning: this is an ongoing experimentation* |
|||
|
|||
## Wasm usage |
|||
To compile to wasm, inside the `wasm` directory, execute: |
|||
``` |
|||
GOARCH=wasm GOOS=js go build -o go-snark.wasm go-snark-wasm-wrapper.go |
|||
``` |
|||
|
|||
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), |
|||
); |
|||
``` |
|||
|
|||
Run the http server that allows to load the `.wasm` file: |
|||
``` |
|||
node server.js |
|||
``` |
@ -0,0 +1,91 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"encoding/json" |
|||
"syscall/js" |
|||
|
|||
"github.com/arnaucube/go-snark" |
|||
"github.com/arnaucube/go-snark/circuitcompiler" |
|||
"github.com/arnaucube/go-snark/wasm/utils" |
|||
) |
|||
|
|||
func main() { |
|||
c := make(chan struct{}, 0) |
|||
|
|||
println("WASM Go Initialized") |
|||
// register functions
|
|||
registerCallbacks() |
|||
<-c |
|||
} |
|||
|
|||
func registerCallbacks() { |
|||
js.Global().Set("generateProofs", js.FuncOf(generateProofs)) |
|||
} |
|||
|
|||
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, 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)) |
|||
} |
@ -0,0 +1,19 @@ |
|||
<html> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<title>go-snark wasm experiments</title> |
|||
</head> |
|||
<body> |
|||
<script src="wasm_exec.js"></script> |
|||
<script> |
|||
const go = new Go(); |
|||
WebAssembly.instantiateStreaming(fetch('go-snark.wasm'), go.importObject).then(function(dat) { |
|||
go.run(dat.instance); |
|||
}); |
|||
</script> |
|||
<button onClick="callGenerateProof();">Generate Proof</button> |
|||
<textarea id="proofResult" rows="15" style="width: 80%;"> |
|||
</textarea> |
|||
<script src="index.js"></script> |
|||
</body> |
|||
</html> |
@ -0,0 +1,15 @@ |
|||
{ |
|||
"name": "server", |
|||
"version": "1.0.0", |
|||
"description": "", |
|||
"main": "server.js", |
|||
"scripts": { |
|||
"test": "echo \"Error: no test specified\" && exit 1", |
|||
"start": "node server.js" |
|||
}, |
|||
"author": "", |
|||
"license": "ISC", |
|||
"dependencies": { |
|||
"express": "^4.16.4" |
|||
} |
|||
} |
@ -0,0 +1,7 @@ |
|||
var express = require('express'); |
|||
var app = express(); |
|||
express.static.mime.types['wasm'] = 'application/wasm'; |
|||
app.use(express.static(__dirname + '/')); |
|||
port=8080 |
|||
app.listen(8080); |
|||
console.log("server running at :8080") |