go-circom-prover-verifier/prover/gextra_test.go
prover/gextra_test.goRaw
1package prover
2
3import (
4 "bytes"
5 "crypto/rand"
6 "fmt"
7 "math/big"
8 "testing"
9 "time"
10
11 bn256 "github.com/ethereum/go-ethereum/crypto/bn256/cloudflare"
12)
13
14const (
15 N1 = 5000
16 N2 = 5000
17)
18
19func randomBigIntArray(n int) []*big.Int {
20 var p []*big.Int
21 for i := 0; i < n; i++ {
22 pi := randBI()
23 p = append(p, pi)
24 }
25
26 return p
27}
28
29func randomG1Array(n int) []*bn256.G1 {
30 arrayG1 := make([]*bn256.G1, n)
31
32 for i := 0; i < n; i++ {
33 _, arrayG1[i], _ = bn256.RandomG1(rand.Reader)
34 }
35 return arrayG1
36}
37
38func randomG2Array(n int) []*bn256.G2 {
39 arrayG2 := make([]*bn256.G2, n)
40
41 for i := 0; i < n; i++ {
42 _, arrayG2[i], _ = bn256.RandomG2(rand.Reader)
43 }
44 return arrayG2
45}
46
47func TestTableG1(t *testing.T) {
48 n := N1
49
50 // init scalar
51 var arrayW = randomBigIntArray(n)
52 // init G1 array
53 var arrayG1 = randomG1Array(n)
54
55 beforeT := time.Now()
56 Q1 := new(bn256.G1).ScalarBaseMult(new(big.Int))
57 for i := 0; i < n; i++ {
58 Q1.Add(Q1, new(bn256.G1).ScalarMult(arrayG1[i], arrayW[i]))
59 }
60 fmt.Println("Std. Mult. time elapsed:", time.Since(beforeT))
61
62 for gsize := 2; gsize < 10; gsize++ {
63 ntables := int((n + gsize - 1) / gsize)
64 table := make([]tableG1, ntables)
65
66 for i := 0; i < ntables-1; i++ {
67 table[i].newTableG1(arrayG1[i*gsize:(i+1)*gsize], gsize, true)
68 }
69 table[ntables-1].newTableG1(arrayG1[(ntables-1)*gsize:], gsize, true)
70
71 beforeT = time.Now()
72 Q2 := new(bn256.G1).ScalarBaseMult(new(big.Int))
73 for i := 0; i < ntables-1; i++ {
74 Q2 = table[i].mulTableG1(arrayW[i*gsize:(i+1)*gsize], Q2, gsize)
75 }
76 Q2 = table[ntables-1].mulTableG1(arrayW[(ntables-1)*gsize:], Q2, gsize)
77 fmt.Printf("Gsize : %d, TMult time elapsed: %s\n", gsize, time.Since(beforeT))
78
79 beforeT = time.Now()
80 Q3 := scalarMultG1(arrayG1, arrayW, nil, gsize)
81 fmt.Printf("Gsize : %d, TMult time elapsed (inc table comp): %s\n", gsize, time.Since(beforeT))
82
83 beforeT = time.Now()
84 Q4 := mulTableNoDoubleG1(table, arrayW, nil, gsize)
85 fmt.Printf("Gsize : %d, TMultNoDouble time elapsed: %s\n", gsize, time.Since(beforeT))
86
87 beforeT = time.Now()
88 Q5 := scalarMultNoDoubleG1(arrayG1, arrayW, nil, gsize)
89 fmt.Printf("Gsize : %d, TMultNoDouble time elapsed (inc table comp): %s\n", gsize, time.Since(beforeT))
90
91 if bytes.Compare(Q1.Marshal(), Q2.Marshal()) != 0 {
92 t.Error("Error in TMult")
93 }
94 if bytes.Compare(Q1.Marshal(), Q3.Marshal()) != 0 {
95 t.Error("Error in TMult with table comp")
96 }
97 if bytes.Compare(Q1.Marshal(), Q4.Marshal()) != 0 {
98 t.Error("Error in TMultNoDouble")
99 }
100 if bytes.Compare(Q1.Marshal(), Q5.Marshal()) != 0 {
101 t.Error("Error in TMultNoDoublee with table comp")
102 }
103 }
104}
105
106func TestTableG2(t *testing.T) {
107 n := N2
108
109 // init scalar
110 var arrayW = randomBigIntArray(n)
111 // init G2 array
112 var arrayG2 = randomG2Array(n)
113
114 beforeT := time.Now()
115 Q1 := new(bn256.G2).ScalarBaseMult(new(big.Int))
116 for i := 0; i < n; i++ {
117 Q1.Add(Q1, new(bn256.G2).ScalarMult(arrayG2[i], arrayW[i]))
118 }
119 fmt.Println("Std. Mult. time elapsed:", time.Since(beforeT))
120
121 for gsize := 2; gsize < 10; gsize++ {
122 ntables := int((n + gsize - 1) / gsize)
123 table := make([]tableG2, ntables)
124
125 for i := 0; i < ntables-1; i++ {
126 table[i].newTableG2(arrayG2[i*gsize:(i+1)*gsize], gsize, false)
127 }
128 table[ntables-1].newTableG2(arrayG2[(ntables-1)*gsize:], gsize, false)
129
130 beforeT = time.Now()
131 Q2 := new(bn256.G2).ScalarBaseMult(new(big.Int))
132 for i := 0; i < ntables-1; i++ {
133 Q2 = table[i].mulTableG2(arrayW[i*gsize:(i+1)*gsize], Q2, gsize)
134 }
135 Q2 = table[ntables-1].mulTableG2(arrayW[(ntables-1)*gsize:], Q2, gsize)
136 fmt.Printf("Gsize : %d, TMult time elapsed: %s\n", gsize, time.Since(beforeT))
137
138 beforeT = time.Now()
139 Q3 := scalarMultG2(arrayG2, arrayW, nil, gsize)
140 fmt.Printf("Gsize : %d, TMult time elapsed (inc table comp): %s\n", gsize, time.Since(beforeT))
141
142 beforeT = time.Now()
143 Q4 := mulTableNoDoubleG2(table, arrayW, nil, gsize)
144 fmt.Printf("Gsize : %d, TMultNoDouble time elapsed: %s\n", gsize, time.Since(beforeT))
145
146 beforeT = time.Now()
147 Q5 := scalarMultNoDoubleG2(arrayG2, arrayW, nil, gsize)
148 fmt.Printf("Gsize : %d, TMultNoDouble time elapsed (inc table comp): %s\n", gsize, time.Since(beforeT))
149
150 if bytes.Compare(Q1.Marshal(), Q2.Marshal()) != 0 {
151 t.Error("Error in TMult")
152 }
153 if bytes.Compare(Q1.Marshal(), Q3.Marshal()) != 0 {
154 t.Error("Error in TMult with table comp")
155 }
156 if bytes.Compare(Q1.Marshal(), Q4.Marshal()) != 0 {
157 t.Error("Error in TMultNoDouble")
158 }
159 if bytes.Compare(Q1.Marshal(), Q5.Marshal()) != 0 {
160 t.Error("Error in TMultNoDoublee with table comp")
161 }
162 }
163}