arnaucube
arnaucube/circomlibPublic Self-hosted repository
circomlib/test/escalarmul.js
test/escalarmul.jsRaw
  1const chai = require("chai");
  2const path = require("path");
  3const snarkjs = require("snarkjs");
  4const compiler = require("circom");
  5
  6const assert = chai.assert;
  7
  8const bigInt = snarkjs.bigInt;
  9
 10
 11const q=bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617");
 12function addPoint(a,b) {
 13    const cta = bigInt("168700");
 14    const d = bigInt("168696");
 15
 16    const res = [];
 17    res[0] = bigInt((a[0]*b[1] + b[0]*a[1]) *  bigInt(bigInt.one + d*a[0]*b[0]*a[1]*b[1]).inverse(q)).affine(q);
 18    res[1] = bigInt((a[1]*b[1] - cta*a[0]*b[0]) * bigInt(bigInt.one - d*a[0]*b[0]*a[1]*b[1]).inverse(q)).affine(q);
 19    return res;
 20}
 21
 22function print(circuit, w, s) {
 23    console.log(s + ": " + w[circuit.getSignalIdx(s)]);
 24}
 25
 26describe("Exponentioation test", () => {
 27    it("Should generate the Exponentiation table in k=0", async () => {
 28
 29        const cirDef = await compiler(path.join(__dirname, "circuits", "escalarmulw4table_test.circom"));
 30
 31//        console.log(JSON.stringify(cirDef, null, 1));
 32
 33//        assert.equal(cirDef.nVars, 2);
 34
 35        const circuit = new snarkjs.Circuit(cirDef);
 36
 37        console.log("NConstrains: " + circuit.nConstraints);
 38
 39        const w = circuit.calculateWitness({in: 1});
 40
 41        assert(circuit.checkWitness(w));
 42
 43        let g = [bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
 44                 bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203")]
 45
 46        dbl= [bigInt("0"), snarkjs.bigInt("1")];
 47
 48        for (let i=0; i<16; i++) {
 49            const xout1 = w[circuit.getSignalIdx(`main.out[${i}][0]`)];
 50            const yout1 = w[circuit.getSignalIdx(`main.out[${i}][1]`)];
 51
 52            // console.log(xout1.toString());
 53            // console.log(yout1.toString());
 54            // console.log(dbl[0]);
 55            // console.log(dbl[1]);
 56
 57            assert(xout1.equals(dbl[0]));
 58            assert(yout1.equals(dbl[1]));
 59
 60            dbl = addPoint([xout1, yout1],g);
 61        }
 62
 63    });
 64
 65    it("Should generate the Exponentiation table in k=3", async () => {
 66
 67        const cirDef = await compiler(path.join(__dirname, "circuits", "escalarmulw4table_test3.circom"));
 68
 69//        console.log(JSON.stringify(cirDef, null, 1));
 70
 71//        assert.equal(cirDef.nVars, 2);
 72
 73        const circuit = new snarkjs.Circuit(cirDef);
 74
 75        console.log("NConstrains: " + circuit.nConstraints);
 76
 77        const w = circuit.calculateWitness({in: 1});
 78
 79        assert(circuit.checkWitness(w));
 80
 81        let g = [snarkjs.bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
 82                 snarkjs.bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203")]
 83
 84        for (let i=0; i<12;i++) {
 85            g = addPoint(g,g);
 86        }
 87
 88        dbl= [snarkjs.bigInt("0"), snarkjs.bigInt("1")];
 89
 90        for (let i=0; i<16; i++) {
 91            const xout1 = w[circuit.getSignalIdx(`main.out[${i}][0]`)];
 92            const yout1 = w[circuit.getSignalIdx(`main.out[${i}][1]`)];
 93
 94
 95            // console.log(xout1.toString());
 96            // console.log(yout1.toString());
 97            // console.log(dbl[0]);
 98            // console.log(dbl[1]);
 99
100            assert(xout1.equals(dbl[0]));
101            assert(yout1.equals(dbl[1]));
102
103            dbl = addPoint([xout1, yout1],g);
104        }
105
106    });
107
108    it("Should exponentiate g^31", async () => {
109        const cirDef = await compiler(path.join(__dirname, "circuits", "escalarmul_test.circom"), {reduceConstraints: true});
110
111//        console.log(JSON.stringify(cirDef, null, 1));
112
113//        assert.equal(cirDef.nVars, 2);
114
115        const circuit = new snarkjs.Circuit(cirDef);
116
117        console.log("NConstrains: " + circuit.nConstraints);
118
119        const w = circuit.calculateWitness({"in": 31});
120
121        assert(circuit.checkWitness(w));
122
123        let g = [snarkjs.bigInt("5299619240641551281634865583518297030282874472190772894086521144482721001553"),
124                 snarkjs.bigInt("16950150798460657717958625567821834550301663161624707787222815936182638968203")]
125
126        let c = [0n, 1n];
127
128        for (let i=0; i<31;i++) {
129            c = addPoint(c,g);
130        }
131
132        const xout = w[circuit.getSignalIdx(`main.out[0]`)];
133        const yout = w[circuit.getSignalIdx(`main.out[1]`)];
134
135/*
136        console.log(xout.toString());
137        console.log(yout.toString());
138*/
139        assert(xout.equals(c[0]));
140        assert(yout.equals(c[1]));
141
142        console.log("-------")
143        const w2 = circuit.calculateWitness({"in": (1n<<252n)+1n});
144
145        const xout2 = w2[circuit.getSignalIdx(`main.out[0]`)];
146        const yout2 = w2[circuit.getSignalIdx(`main.out[1]`)];
147
148        c = [g[0], g[1]];
149        for (let i=0; i<252;i++) {
150            c = addPoint(c,c);
151        }
152        c = addPoint(c,g);
153
154        // console.log(xout2.toString());
155        // console.log(yout2.toString());
156        // console.log(c[0].toString());
157        // console.log(c[1].toString());
158
159        assert(xout2.equals(c[0]));
160        assert(yout2.equals(c[1]));
161
162    }).timeout(10000000);
163
164    it("Number of constrains for 256 bits", async () => {
165        const cirDef = await compiler(path.join(__dirname, "circuits", "escalarmul_test_min.circom"));
166
167        const circuit = new snarkjs.Circuit(cirDef);
168
169        console.log("NConstrains: " + circuit.nConstraints);
170    }).timeout(10000000);
171
172});