Skip to content

Commit a21f340

Browse files
authored
fix poseidon tests (#16)
1 parent 36088c7 commit a21f340

File tree

2 files changed

+43
-41
lines changed

2 files changed

+43
-41
lines changed

poseidon/param.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ type PoseidonParams struct {
2323

2424
// TODOs: the parameters are not secure. use a better way to generate the constants
2525
func NewPoseidonParams() *PoseidonParams {
26+
r := rand.New(rand.NewSource(42))
27+
2628
num_full_rounds := 8
2729
num_part_rounds := 14
2830
num_states := 16
@@ -31,13 +33,13 @@ func NewPoseidonParams() *PoseidonParams {
3133
for i := 0; i < num_states; i++ {
3234
external_round_constant[i] = make([]uint32, num_full_rounds)
3335
for j := 0; j < num_full_rounds; j++ {
34-
external_round_constant[i][j] = randomM31()
36+
external_round_constant[i][j] = randomM31(r)
3537
}
3638
}
3739

3840
internal_round_constant := make([]uint32, num_part_rounds)
3941
for i := 0; i < num_part_rounds; i++ {
40-
internal_round_constant[i] = randomM31()
42+
internal_round_constant[i] = randomM31(r)
4143
}
4244

4345
// mds parameters adopted from Plonky3
@@ -66,8 +68,8 @@ func NewPoseidonParams() *PoseidonParams {
6668
}
6769
}
6870

69-
func randomM31() uint32 {
70-
t := rand.Uint32() & 0x7FFFFFFF
71+
func randomM31(r *rand.Rand) uint32 {
72+
t := r.Uint32() & 0x7FFFFFFF
7173

7274
for t == 0x7fffffff {
7375
t = rand.Uint32() & 0x7FFFFFFF

poseidon/poseidon_circuit_test.go

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,71 @@
11
package poseidon
22

33
import (
4-
"fmt"
54
"testing"
65

6+
"github.com/PolyhedraZK/ExpanderCompilerCollection"
77
"github.com/PolyhedraZK/ExpanderCompilerCollection/field/m31"
8-
"github.com/consensys/gnark-crypto/ecc"
8+
"github.com/PolyhedraZK/ExpanderCompilerCollection/test"
99
"github.com/consensys/gnark/constraint"
1010
"github.com/consensys/gnark/frontend"
11-
"github.com/consensys/gnark/frontend/cs/r1cs"
12-
"github.com/consensys/gnark/test"
1311
)
1412

1513
type MockPoseidonCircuit struct {
16-
State []frontend.Variable `gnark:",public"`
17-
Output frontend.Variable `gnark:",public"`
14+
State [16]frontend.Variable `gnark:",public"`
15+
Output frontend.Variable `gnark:",public"`
1816
}
1917

2018
func (c *MockPoseidonCircuit) Define(api frontend.API) (err error) {
21-
// Define the circuit
2219
param := NewPoseidonParams()
2320
engine := m31.Field{}
24-
t := PoseidonCircuit(api, engine, param, c.State, false)
21+
t := PoseidonCircuit(api, engine, param, c.State[:], false)
2522
api.AssertIsEqual(t, c.Output)
2623

2724
return
2825
}
2926

3027
func TestPoseidonCircuit(t *testing.T) {
31-
assert := test.NewAssert(t)
32-
3328
param := NewPoseidonParams()
3429

35-
state := make([]constraint.Element, 16)
36-
stateVar := make([]frontend.Variable, 16)
37-
var internalStateVars PoseidonInternalStateVar
30+
var states [16]constraint.Element
31+
var stateVars [16]frontend.Variable
32+
var outputVar frontend.Variable
3833

39-
for i := 0; i < 16; i++ {
40-
state[i] = constraint.Element{uint64(i)}
41-
stateVar[i] = frontend.Variable(uint64(i))
34+
for j := 0; j < 16; j++ {
35+
states[j] = constraint.Element{uint64(j)}
36+
stateVars[j] = frontend.Variable(uint64(j))
4237
}
43-
internalState, output := PoseidonM31WithInternalStates(param, state, true)
44-
outputVar := frontend.Variable(output[0])
38+
output := PoseidonM31(param, states[:])
39+
outputVar = frontend.Variable(output[0])
4540

46-
fmt.Println("internal state", internalState)
47-
48-
for j := 0; j < 16; j++ {
49-
internalStateVars.AfterHalfFullRound[j] = frontend.Variable(internalState.AfterHalfFullRound[j][0])
50-
internalStateVars.AfterHalfPartialRound[j] = frontend.Variable(internalState.AfterHalfPartialRound[j][0])
51-
internalStateVars.AfterPartialRound[j] = frontend.Variable(internalState.AfterPartialRound[j][0])
41+
assignment := &MockPoseidonCircuit{
42+
State: stateVars,
43+
Output: outputVar,
5244
}
5345

54-
c := MockPoseidonCircuit{
55-
stateVar,
56-
outputVar,
46+
// Gnark test disabled as it does not support randomness and custom gates
47+
// err := test.IsSolved(&MockPoseidonCircuit{}, assignment, m31.ScalarField)
48+
// if err != nil {
49+
// panic(err)
50+
// }
51+
// fmt.Println("Gnark test passed")
52+
53+
// Ecc test
54+
circuit, err := ExpanderCompilerCollection.Compile(m31.ScalarField, &MockPoseidonCircuit{}, frontend.WithCompressThreshold(32))
55+
if err != nil {
56+
panic(err)
5757
}
5858

59-
w, _ := frontend.NewWitness(&c, m31.ScalarField)
60-
fmt.Println("witness", w)
59+
layered_circuit := circuit.GetLayeredCircuit()
60+
// circuit.GetCircuitIr().Print()
6161

62-
err := test.IsSolved(&c, &c, m31.ScalarField)
63-
assert.NoError(err)
62+
inputSolver := circuit.GetInputSolver()
63+
witness, err := inputSolver.SolveInputAuto(assignment)
64+
if err != nil {
65+
panic(err)
66+
}
6467

65-
r1cs, err := frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &c)
66-
assert.NoError(err)
67-
fmt.Println("num constraints:", r1cs.GetNbConstraints())
68-
fmt.Println("num coefficients:", r1cs.GetNbCoefficients())
69-
i, p, s := r1cs.GetNbVariables()
70-
fmt.Println("num variables:", i, p, s)
68+
if !test.CheckCircuit(layered_circuit, witness) {
69+
panic("verification failed")
70+
}
7171
}

0 commit comments

Comments
 (0)