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