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	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}