arnaucube
arnaucube/go-circom-prover-verifierPublic Self-hosted repository
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}