arnaucube
arnaucube/websnarkPublic Self-hosted repository
websnark/example/index.html
example/index.htmlRaw
 1<html>
 2<header>
 3</header>
 4<script src="websnark.js"></script>
 5<script>
 6
 7var witness;
 8var provingKey;
 9
10function onLoad() {
11
12    fetch("proving_key.bin").then( (response) => {
13        return response.arrayBuffer();
14    }).then( (b) => {
15        provingKey = b;
16    });
17
18    fetch("witness.bin").then( (response) => {
19        return response.arrayBuffer();
20    }).then( (b) => {
21        witness = b;
22    });
23}
24
25function calcProof() {
26    const start = new Date().getTime();
27    document.getElementById("time").innerHTML = "processing....";
28    document.getElementById("proof").innerHTML = "";
29
30    window.genZKSnarkProof(witness, provingKey).then((p)=> {
31        const end = new Date().getTime();
32        const time = end - start;
33        document.getElementById("time").innerHTML = `Time to compute: ${time}ms`;
34        document.getElementById("proof").innerHTML = JSON.stringify(p, null, 1);
35    });
36}
37
38function test() {
39
40    const groth16 = window.groth16;
41    const nSignals = 1;
42
43    const pkey32 = new Uint32Array(provingKey);
44    const pPointsA = pkey32[5];
45
46    const points = provingKey.slice(pPointsA, pPointsA + nSignals*64);
47    const signals = witness.slice(0, nSignals*32);
48
49    const pr1 = groth16.alloc(96);
50    const pPoints = groth16.alloc(points.byteLength);
51    groth16.putBin(pPoints, points);
52
53    const pSignals = groth16.alloc(signals.byteLength);
54    groth16.putBin(pSignals, signals);
55
56    groth16.instance.exports.g1_zero(pr1);
57    groth16.instance.exports.g1_multiexp(pSignals, pPoints, nSignals, 1, pr1);
58    groth16.instance.exports.g1_affine(pr1, pr1);
59    groth16.instance.exports.g1_fromMontgomery(pr1, pr1);
60
61    const r1 = groth16.bin2g1(groth16.getBin(pr1, 96));
62
63    groth16.instance.exports.g1_zero(pr1);
64    groth16.instance.exports.g1_multiexp2(pSignals, pPoints, nSignals, 1, pr1);
65    groth16.instance.exports.g1_affine(pr1, pr1);
66    groth16.instance.exports.g1_fromMontgomery(pr1, pr1);
67
68    const r2 = groth16.bin2g1(groth16.getBin(pr1, 96));
69
70    console.log(r1);
71    console.log(r2);
72}
73
74</script>
75<body onLoad="onLoad()">
76<h1>iden3</h1>
77<h2>Zero knowledge proof generator</h2>
78<button onClick="calcProof()">Test</button>
79<div id="time"></div>
80<pre id="proof"></pre>
81
82</body>
83</html>