arnaucube
arnaucube/gnark-plonky2-verifierPublic Self-hosted repository
gnark-plonky2-verifier/verifier/internal/plonk/challenger_test.go
verifier/internal/plonk/challenger_test.goRaw
  1package plonk
  2
  3import (
  4	"math/big"
  5	"testing"
  6
  7	"github.com/consensys/gnark/frontend"
  8	"github.com/consensys/gnark/test"
  9	"github.com/succinctlabs/gnark-plonky2-verifier/field"
 10	"github.com/succinctlabs/gnark-plonky2-verifier/poseidon"
 11)
 12
 13type TestChallengerCircuit struct {
 14	PublicInputs              []field.F
 15	CircuitDigest             poseidon.PoseidonBN128HashOut
 16	WiresCap                  [16]poseidon.PoseidonBN128HashOut
 17	PlonkZsPartialProductsCap [16]poseidon.PoseidonBN128HashOut
 18	QuotientPolysCap          [16]poseidon.PoseidonBN128HashOut
 19}
 20
 21func (circuit *TestChallengerCircuit) Define(api frontend.API) error {
 22	fieldAPI := field.NewFieldAPI(api)
 23	degreeBits := 3
 24	qeAPI := field.NewQuadraticExtensionAPI(api, fieldAPI, uint64(degreeBits))
 25	poseidonChip := poseidon.NewPoseidonChip(api, fieldAPI, qeAPI)
 26	poseidonBN128Chip := poseidon.NewPoseidonBN128Chip(api, fieldAPI)
 27	challengerChip := NewChallengerChip(api, fieldAPI, poseidonChip, poseidonBN128Chip)
 28
 29	challengerChip.ObserveBN128Hash(circuit.CircuitDigest)
 30	publicInputHash := poseidonChip.HashNoPad(circuit.PublicInputs[:])
 31	challengerChip.ObserveHash(publicInputHash)
 32	challengerChip.ObserveCap(circuit.WiresCap[:])
 33
 34	numChallenges := uint64(2)
 35	plonkBetas := challengerChip.GetNChallenges(numChallenges)
 36	plonkGammas := challengerChip.GetNChallenges(numChallenges)
 37
 38	expectedPublicInputHash := [4]field.F{
 39		field.NewFieldConstFromString("0"),
 40		field.NewFieldConstFromString("0"),
 41		field.NewFieldConstFromString("0"),
 42		field.NewFieldConstFromString("0"),
 43	}
 44
 45	for i := 0; i < 4; i++ {
 46		fieldAPI.AssertIsEqual(publicInputHash[i], expectedPublicInputHash[i])
 47	}
 48
 49	expectedPlonkBetas := [2]field.F{
 50		field.NewFieldConstFromString("17615363392879944733"),
 51		field.NewFieldConstFromString("9422446877322953047"),
 52	}
 53
 54	expectedPlonkGammas := [2]field.F{
 55		field.NewFieldConstFromString("15174493176564484303"),
 56		field.NewFieldConstFromString("6175150444166239851"),
 57	}
 58
 59	for i := 0; i < 2; i++ {
 60		fieldAPI.AssertIsEqual(plonkBetas[i], expectedPlonkBetas[i])
 61		fieldAPI.AssertIsEqual(plonkGammas[i], expectedPlonkGammas[i])
 62	}
 63
 64	challengerChip.ObserveCap(circuit.PlonkZsPartialProductsCap[:])
 65	plonkAlphas := challengerChip.GetNChallenges(numChallenges)
 66
 67	expectedPlonkAlphas := [2]field.F{
 68		field.NewFieldConstFromString("9276470834414745550"),
 69		field.NewFieldConstFromString("5302812342351431915"),
 70	}
 71
 72	for i := 0; i < 2; i++ {
 73		fieldAPI.AssertIsEqual(plonkAlphas[i], expectedPlonkAlphas[i])
 74	}
 75
 76	challengerChip.ObserveCap(circuit.QuotientPolysCap[:])
 77	plonkZeta := challengerChip.GetExtensionChallenge()
 78
 79	expectedPlonkZeta := field.QuadraticExtension{
 80		field.NewFieldConstFromString("3892795992421241388"),
 81		field.NewFieldConstFromString("15786647757418200302"),
 82	}
 83
 84	for i := 0; i < 2; i++ {
 85		fieldAPI.AssertIsEqual(plonkZeta[i], expectedPlonkZeta[i])
 86	}
 87
 88	return nil
 89}
 90
 91func StringToBN128Hash(hashStr string) poseidon.PoseidonBN128HashOut {
 92	hashBigInt, ok := new(big.Int).SetString(hashStr, 10)
 93	if !(ok) {
 94		panic("Invalid hash: " + hashStr)
 95	}
 96
 97	hashVar := frontend.Variable(*hashBigInt)
 98	return poseidon.PoseidonBN128HashOut(hashVar)
 99}
100
101func TestChallengerWitness(t *testing.T) {
102	assert := test.NewAssert(t)
103
104	testCase := func(
105		publicInputs []field.F,
106		circuitDigest poseidon.PoseidonBN128HashOut,
107		wiresCap [16]poseidon.PoseidonBN128HashOut,
108		plonkZsPartialProductsCap [16]poseidon.PoseidonBN128HashOut,
109		quotientPolysCap [16]poseidon.PoseidonBN128HashOut,
110	) {
111		circuit := TestChallengerCircuit{
112			PublicInputs:              publicInputs,
113			CircuitDigest:             circuitDigest,
114			WiresCap:                  wiresCap,
115			PlonkZsPartialProductsCap: plonkZsPartialProductsCap,
116			QuotientPolysCap:          quotientPolysCap,
117		}
118		witness := TestChallengerCircuit{
119			PublicInputs:              publicInputs,
120			CircuitDigest:             circuitDigest,
121			WiresCap:                  wiresCap,
122			PlonkZsPartialProductsCap: plonkZsPartialProductsCap,
123			QuotientPolysCap:          quotientPolysCap,
124		}
125		err := test.IsSolved(&circuit, &witness, field.TEST_CURVE.ScalarField())
126		assert.NoError(err)
127	}
128
129	publicInputs := []field.F{}
130
131	circuitDigest := StringToBN128Hash("11532502846882484230992726008257788785937565673229400981185786126842727172973")
132
133	wiresCaps := [16]poseidon.PoseidonBN128HashOut{}
134	wiresCaps[0] = StringToBN128Hash("6232016528318542211523647364792867346449137823066292895075623303633330508214")
135	wiresCaps[1] = StringToBN128Hash("3849229275985461680629770572508259203226163621677714310355251582693130685288")
136	wiresCaps[2] = StringToBN128Hash("5987556171512366759354088598227343740440477791444099795740854232780130336082")
137	wiresCaps[3] = StringToBN128Hash("8523377779888975334090507575349048869294640263235559121841789718805736414837")
138	wiresCaps[4] = StringToBN128Hash("4173305429039088756536564029627250985745421317354666614089039608061166671898")
139	wiresCaps[5] = StringToBN128Hash("19514742808406256372169729907222415291809011606011679387563713660256488346125")
140	wiresCaps[6] = StringToBN128Hash("8519703011007005463193900985655355044586093539828702987016626948657512235078")
141	wiresCaps[7] = StringToBN128Hash("13337062986664638507390757043422262298890182385759661595000247205380836291424")
142	wiresCaps[8] = StringToBN128Hash("13956988298720968721248573872513053256190487207048215310365406791617256823071")
143	wiresCaps[9] = StringToBN128Hash("4139118776078237399422219240136866906229498819930564462151328936368637474741")
144	wiresCaps[10] = StringToBN128Hash("20010683036854145765538326917745039166608941517703057250025522185331298063240")
145	wiresCaps[11] = StringToBN128Hash("16542849340693186579674885260236043503488748690860552251132996633211111581047")
146	wiresCaps[12] = StringToBN128Hash("15340310232736118098606223218073833983285921571850333937460777227732109309104")
147	wiresCaps[13] = StringToBN128Hash("14370557250059545670244193708996703450518439828341533154117610442161777001185")
148	wiresCaps[14] = StringToBN128Hash("18844434454299441334771065219656682212700835025465734281792408139929868142021")
149	wiresCaps[15] = StringToBN128Hash("19676343740377898318702605893881480074303742058989194823248293456630167789460")
150
151	plonkZsPartialProductsCaps := [16]poseidon.PoseidonBN128HashOut{}
152	plonkZsPartialProductsCaps[0] = StringToBN128Hash("18630303757724954689095079665308152603926320437432442392614316813333911252124")
153	plonkZsPartialProductsCaps[1] = StringToBN128Hash("1941509032097423911575973752610668722198580889286836043016771886256831254944")
154	plonkZsPartialProductsCaps[2] = StringToBN128Hash("6147898094056673441182607282006528423230906496770003193057422314911254596722")
155	plonkZsPartialProductsCaps[3] = StringToBN128Hash("8711744418341460096856191310559061094028644913424948320707020455945693390966")
156	plonkZsPartialProductsCaps[4] = StringToBN128Hash("3170507894509162329082713944669012510679535839018490515228566075949014704871")
157	plonkZsPartialProductsCaps[5] = StringToBN128Hash("9513443633020527244719737008971091746535961947215556968735061932963144145728")
158	plonkZsPartialProductsCaps[6] = StringToBN128Hash("16440622144490342815400399751667969445057099157732990266662948140364680211732")
159	plonkZsPartialProductsCaps[7] = StringToBN128Hash("16904904288584890809819587275120157893767917607795020298373538872373275028362")
160	plonkZsPartialProductsCaps[8] = StringToBN128Hash("1322883689945010694042124537248103086068476085787048131689196755087178475099")
161	plonkZsPartialProductsCaps[9] = StringToBN128Hash("3859729225679954076862546769780866075152550721517632074656261209033111218654")
162	plonkZsPartialProductsCaps[10] = StringToBN128Hash("5995885491698588595978721670502011088690021401297557688057158353938846681398")
163	plonkZsPartialProductsCaps[11] = StringToBN128Hash("16957177478856199232404038751327729781816109007496656232207408246975862260922")
164	plonkZsPartialProductsCaps[12] = StringToBN128Hash("9422393668093911702915740702404346320943009100616501740579421944206639410155")
165	plonkZsPartialProductsCaps[13] = StringToBN128Hash("15680345727093646870610240619814271686346382346107751208797654607051065248818")
166	plonkZsPartialProductsCaps[14] = StringToBN128Hash("4939261448468032698521878059774016528161329965101885352386001950329280576201")
167	plonkZsPartialProductsCaps[15] = StringToBN128Hash("7003946111898359335505647195128523292498498760325513092978040051648331398446")
168
169	quotientPolysCaps := [16]poseidon.PoseidonBN128HashOut{}
170	quotientPolysCaps[0] = StringToBN128Hash("3918560082526903400389798118659365477465402367561322989181693953047280669646")
171	quotientPolysCaps[1] = StringToBN128Hash("496966935842756068593963213547105605432646958081400837931911611833297095727")
172	quotientPolysCaps[2] = StringToBN128Hash("8683297895986438077633020202252074142721819824824948690853505463451806801507")
173	quotientPolysCaps[3] = StringToBN128Hash("14623770060934618886104076268225324888644340537717836901769942847173950269850")
174	quotientPolysCaps[4] = StringToBN128Hash("902377468311802642056170073282349607767917979325737018777782566011948776523")
175	quotientPolysCaps[5] = StringToBN128Hash("12124340721627925810131860890689432371048624670798932303474977401990312142398")
176	quotientPolysCaps[6] = StringToBN128Hash("21656753786114693289615694183370749990935753681953197920766927707640495235100")
177	quotientPolysCaps[7] = StringToBN128Hash("4651674172794111060599611529192263627230814664669763852917839857516619530510")
178	quotientPolysCaps[8] = StringToBN128Hash("13161231355626784301812735677481006076469384200800574341495987998366265598910")
179	quotientPolysCaps[9] = StringToBN128Hash("20853590455948262404101100028402584187982204016660952863575312077951992942329")
180	quotientPolysCaps[10] = StringToBN128Hash("742867642166478273564934628555265381154191517824405375118170559554873960389")
181	quotientPolysCaps[11] = StringToBN128Hash("17617970388755497287414457313283777609067524774358298322461931046141926005038")
182	quotientPolysCaps[12] = StringToBN128Hash("55496208750959228576253470708262329602643441253143570259294790484739321332")
183	quotientPolysCaps[13] = StringToBN128Hash("18450079114184018679423491604333957974306902732410122012117555285853099024676")
184	quotientPolysCaps[14] = StringToBN128Hash("14403337493956171864251492809058241138806636992110526018123749007090024780352")
185	quotientPolysCaps[15] = StringToBN128Hash("252265115458024097842043026135110356285192501597856208375838682286051476335")
186
187	testCase(publicInputs, circuitDigest, wiresCaps, plonkZsPartialProductsCaps, quotientPolysCaps)
188}