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