Step test case with public inputs (#23)

* added step test case

* export solidity code

* just set proof's public input as public variables

* make serialization a command line option

* added flag to output solidity

* some changes to the benchmark file

* used gnark cherry picked bug fix

* removed fuzz testing

* added some logging

* more debug messages and test cases for the hint issue

* removed usage of goldilocks reduce

* removed prints

* removed GoldilocksReduce

* removed prints

* added a todo

* some serialization changes
This commit is contained in:
Kevin Jue
2023-06-17 19:44:20 -07:00
committed by GitHub
parent 15b7dcbcdb
commit 9ce7bb7dbb
12 changed files with 17094 additions and 95 deletions

View File

@@ -172,12 +172,11 @@ func (c *PoseidonChip) mdsRowShf(r int, v [SPONGE_WIDTH]frontend.Variable) front
for i := 0; i < 12; i++ {
if i < SPONGE_WIDTH {
res1 := c.api.Mul(v[(i+r)%SPONGE_WIDTH], MDS_MATRIX_CIRC_VARS[i])
res = c.api.Add(res, res1)
res = field.GoldilocksMulAdd(c.api, v[(i+r)%SPONGE_WIDTH], MDS_MATRIX_CIRC_VARS[i], res)
}
}
res = c.api.Add(res, c.api.Mul(v[r], MDS_MATRIX_DIAG_VARS[r]))
res = field.GoldilocksMulAdd(c.api, v[r], MDS_MATRIX_DIAG_VARS[r], res)
return res
}
@@ -203,15 +202,9 @@ func (c *PoseidonChip) mdsLayer(state_ PoseidonState) PoseidonState {
result[i] = frontend.Variable(0)
}
var state [SPONGE_WIDTH]frontend.Variable
for i := 0; i < SPONGE_WIDTH; i++ {
state[i] = field.GoldilocksReduce(c.api, state_[i])
}
for r := 0; r < 12; r++ {
if r < SPONGE_WIDTH {
sum := c.mdsRowShf(r, state)
result[r] = field.GoldilocksReduce(c.api, sum)
result[r] = c.mdsRowShf(r, state_)
}
}
@@ -298,14 +291,11 @@ func (c *PoseidonChip) mdsPartialLayerFast(state PoseidonState, r int) PoseidonS
for i := 1; i < 12; i++ {
if i < SPONGE_WIDTH {
t := FAST_PARTIAL_ROUND_W_HATS_VARS[r][i-1]
reducedState := field.GoldilocksReduce(c.api, state[i])
dSum = c.api.Add(dSum, c.api.Mul(reducedState, t))
dSum = field.GoldilocksMulAdd(c.api, state[i], t, dSum)
}
}
s0 := field.GoldilocksReduce(c.api, state[0])
dSum = c.api.Add(dSum, c.api.Mul(s0, MDS0TO0_VAR))
d := field.GoldilocksReduce(c.api, dSum)
d := field.GoldilocksMulAdd(c.api, state[0], MDS0TO0_VAR, dSum)
var result PoseidonState
for i := 0; i < SPONGE_WIDTH; i++ {

View File

@@ -4,6 +4,7 @@ import (
"testing"
"github.com/consensys/gnark-crypto/ecc"
"github.com/consensys/gnark/backend"
"github.com/consensys/gnark/frontend"
"github.com/consensys/gnark/test"
"github.com/succinctlabs/gnark-plonky2-verifier/field"
@@ -58,3 +59,26 @@ func TestPublicInputsHashWitness(t *testing.T) {
copy(out[:], utils.StrArrayToFrontendVariableArray(outStr))
testCase(in, out)
}
func TestPublicInputsHashWitness2(t *testing.T) {
assert := test.NewAssert(t)
inStr := []string{"0", "1", "3736710860384812976"}
outStr := []string{"8416658900775745054", "12574228347150446423", "9629056739760131473", "3119289788404190010"}
var in [3]frontend.Variable
var out [4]frontend.Variable
copy(in[:], utils.StrArrayToFrontendVariableArray(inStr))
copy(out[:], utils.StrArrayToFrontendVariableArray(outStr))
circuit := TestPublicInputsHashCircuit{In: in, Out: out}
witness := TestPublicInputsHashCircuit{In: in, Out: out}
assert.ProverSucceeded(
&circuit,
&witness,
test.WithBackends(backend.GROTH16),
test.WithCurves(ecc.BN254),
test.NoFuzzing(),
test.NoSerialization(),
)
}