@ -13,31 +13,36 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/assert"
)
)
/ *
func TestZkMultiplication ( t * testing . T ) {
func TestZkFromFlatCircuitCode ( t * testing . T ) {
// compile circuit and get the R1CS
// compile circuit and get the R1CS
flatCode := `
flatCode := `
func test ( a , b ) :
out = a * b
func test ( x ) :
aux = x * x
y = aux * x
z = x + y
out = z + 5
`
`
fmt . Print ( "\nflat code of the circuit:" )
fmt . Println ( flatCode )
// parse the code
// parse the code
parser := circuitcompiler . NewParser ( strings . NewReader ( flatCode ) )
parser := circuitcompiler . NewParser ( strings . NewReader ( flatCode ) )
circuit , err := parser . Parse ( )
circuit , err := parser . Parse ( )
assert . Nil ( t , err )
assert . Nil ( t , err )
fmt . Println ( "\ncircuit data:" , circuit )
circuitJson , _ := json . Marshal ( circuit )
fmt . Println ( "circuit:" , string ( circuitJson ) )
b3 := big . NewInt ( int64 ( 3 ) )
b3 := big . NewInt ( int64 ( 3 ) )
b4 := big . NewInt ( int64 ( 4 ) )
inputs := [ ] * big . Int { b3 , b4 }
privateInputs := [ ] * big . Int { b3 }
// wittness
// wittness
w , err := circuit . CalculateWitness ( inputs )
w , err := circuit . CalculateWitness ( pr ivateI nputs)
assert . Nil ( t , err )
assert . Nil ( t , err )
fmt . Println ( "circuit" )
fmt . Println ( circuit . NPublic )
fmt . Println ( "\nwitness" , w )
// flat code to R1CS
// flat code to R1CS
fmt . Println ( "\ngenerating R1CS from flat code" )
a , b , c := circuit . GenerateR1CS ( )
a , b , c := circuit . GenerateR1CS ( )
fmt . Println ( "\nR1CS:" )
fmt . Println ( "\nR1CS:" )
fmt . Println ( "a:" , a )
fmt . Println ( "a:" , a )
@ -45,74 +50,99 @@ func TestZkMultiplication(t *testing.T) {
fmt . Println ( "c:" , c )
fmt . Println ( "c:" , c )
// R1CS to QAP
// R1CS to QAP
alphas , betas , gammas , zx := Utils . PF . R1CSToQAP ( a , b , c )
alphas , betas , gammas , zxQAP := Utils . PF . R1CSToQAP ( a , b , c )
fmt . Println ( "qap" )
fmt . Println ( "qap" )
fmt . Println ( "alphas" , alphas )
fmt . Println ( "betas" , betas )
fmt . Println ( "gammas" , gammas )
fmt . Println ( "alphas" , len ( alphas ) )
fmt . Println ( "alphas" , alphas [ 0 ] )
fmt . Println ( "betas" , len ( betas ) )
fmt . Println ( "gammas" , len ( gammas ) )
fmt . Println ( "zx length" , len ( zxQAP ) )
ax , bx , cx , px := Utils . PF . CombinePolynomials ( w , alphas , betas , gammas )
ax , bx , cx , px := Utils . PF . CombinePolynomials ( w , alphas , betas , gammas )
fmt . Println ( "ax length" , len ( ax ) )
fmt . Println ( "bx length" , len ( bx ) )
fmt . Println ( "cx length" , len ( cx ) )
fmt . Println ( "px length" , len ( px ) )
hx := Utils . PF . DivisorPolynomial ( px , zx )
hxQAP := Utils . PF . DivisorPolynomial ( px , zxQAP )
fmt . Println ( "hx length" , len ( hxQAP ) )
// hx==px/zx so px==hx*zx
// hx==px/zx so px==hx*zx
assert . Equal ( t , px , Utils . PF . Mul ( hx , zx ) )
assert . Equal ( t , px , Utils . PF . Mul ( hxQAP , zxQAP ) )
// p(x) = a(x) * b(x) - c(x) == h(x) * z(x)
// p(x) = a(x) * b(x) - c(x) == h(x) * z(x)
abc := Utils . PF . Sub ( Utils . PF . Mul ( ax , bx ) , cx )
abc := Utils . PF . Sub ( Utils . PF . Mul ( ax , bx ) , cx )
assert . Equal ( t , abc , px )
assert . Equal ( t , abc , px )
hz := Utils . PF . Mul ( hx , zx )
assert . Equal ( t , abc , hz )
hzQAP := Utils . PF . Mul ( hxQAP , zxQAP )
assert . Equal ( t , abc , hzQAP )
div , rem := Utils . PF . Div ( px , zx )
assert . Equal ( t , hx , div )
assert . Equal ( t , rem , r1csqap . ArrayOfBigZeros ( 1 ) )
div , rem := Utils . PF . Div ( px , zxQAP )
assert . Equal ( t , hxQAP , div )
assert . Equal ( t , rem , r1csqap . ArrayOfBigZeros ( 4 ) )
// calculate trusted setup
// calculate trusted setup
setup , err := GenerateTrustedSetup ( len ( w ) , * circuit , alphas , betas , gammas , zx )
setup , err := GenerateTrustedSetup ( len ( w ) , * circuit , alphas , betas , gammas )
assert . Nil ( t , err )
assert . Nil ( t , err )
fmt . Println ( "\nt:" , setup . Toxic . T )
// zx and setup.Pk.Z should be the same (currently not, the correct one is the calculation used inside GenerateTrustedSetup function), the calculation is repeated. TODO avoid repeating calculation
// assert.Equal(t, zxQAP, setup.Pk.Z)
fmt . Println ( "hx pk.z" , hxQAP )
hx := Utils . PF . DivisorPolynomial ( px , setup . Pk . Z )
fmt . Println ( "hx pk.z" , hx )
// assert.Equal(t, hxQAP, hx)
assert . Equal ( t , px , Utils . PF . Mul ( hxQAP , zxQAP ) )
assert . Equal ( t , px , Utils . PF . Mul ( hx , setup . Pk . Z ) )
assert . Equal ( t , len ( hx ) , len ( px ) - len ( setup . Pk . Z ) + 1 )
assert . Equal ( t , len ( hxQAP ) , len ( px ) - len ( zxQAP ) + 1 )
// fmt.Println("pk.Z", len(setup.Pk.Z))
// fmt.Println("zxQAP", len(zxQAP))
// piA = g1 * A(t), piB = g2 * B(t), piC = g1 * C(t), piH = g1 * H(t)
// piA = g1 * A(t), piB = g2 * B(t), piC = g1 * C(t), piH = g1 * H(t)
proof , err := GenerateProofs ( * circuit , setup , hx , w )
proof , err := GenerateProofs ( * circuit , setup , w , px )
assert . Nil ( t , err )
assert . Nil ( t , err )
// assert.True(t, VerifyProof(*circuit, setup, proof, false))
// fmt.Println("\n proofs:")
// fmt.Println(proof)
// fmt.Println("public signals:", proof.PublicSignals)
fmt . Println ( "\nwitness" , w )
// b1 := big.NewInt(int64(1))
b35 := big . NewInt ( int64 ( 35 ) )
b35 := big . NewInt ( int64 ( 35 ) )
// publicSignals := []*big.Int{b1, b35}
publicSignals := [ ] * big . Int { b35 }
publicSignals := [ ] * big . Int { b35 }
before := time . Now ( )
assert . True ( t , VerifyProof ( * circuit , setup , proof , publicSignals , true ) )
assert . True ( t , VerifyProof ( * circuit , setup , proof , publicSignals , true ) )
fmt . Println ( "verify proof time elapsed:" , time . Since ( before ) )
}
}
* /
func TestZkFromFlatCircuitCode ( t * testing . T ) {
/ *
func TestZkMultiplication ( t * testing . T ) {
// compile circuit and get the R1CS
// compile circuit and get the R1CS
flatCode := `
flatCode := `
func test ( x ) :
aux = x * x
y = aux * x
z = x + y
out = z + 5
func test ( a , b ) :
out = a * b
`
`
fmt . Print ( "\nflat code of the circuit:" )
fmt . Println ( flatCode )
// parse the code
// parse the code
parser := circuitcompiler . NewParser ( strings . NewReader ( flatCode ) )
parser := circuitcompiler . NewParser ( strings . NewReader ( flatCode ) )
circuit , err := parser . Parse ( )
circuit , err := parser . Parse ( )
assert . Nil ( t , err )
assert . Nil ( t , err )
fmt . Println ( "\ncircuit data:" , circuit )
circuitJson , _ := json . Marshal ( circuit )
fmt . Println ( "circuit:" , string ( circuitJson ) )
b3 := big . NewInt ( int64 ( 3 ) )
b3 := big . NewInt ( int64 ( 3 ) )
privateInputs := [ ] * big . Int { b3 }
b4 := big . NewInt ( int64 ( 4 ) )
inputs := [ ] * big . Int { b3 , b4 }
// wittness
// wittness
w , err := circuit . CalculateWitness ( pr ivateI nputs)
w , err := circuit . CalculateWitness ( inputs )
assert . Nil ( t , err )
assert . Nil ( t , err )
fmt . Println ( "\nwitness" , w )
fmt . Println ( "circuit" )
fmt . Println ( circuit . NPublic )
// flat code to R1CS
// flat code to R1CS
fmt . Println ( "\ngenerating R1CS from flat code" )
a , b , c := circuit . GenerateR1CS ( )
a , b , c := circuit . GenerateR1CS ( )
fmt . Println ( "\nR1CS:" )
fmt . Println ( "\nR1CS:" )
fmt . Println ( "a:" , a )
fmt . Println ( "a:" , a )
@ -125,13 +155,8 @@ func TestZkFromFlatCircuitCode(t *testing.T) {
fmt . Println ( "alphas" , alphas )
fmt . Println ( "alphas" , alphas )
fmt . Println ( "betas" , betas )
fmt . Println ( "betas" , betas )
fmt . Println ( "gammas" , gammas )
fmt . Println ( "gammas" , gammas )
fmt . Println ( "zx" , zx )
ax , bx , cx , px := Utils . PF . CombinePolynomials ( w , alphas , betas , gammas )
ax , bx , cx , px := Utils . PF . CombinePolynomials ( w , alphas , betas , gammas )
fmt . Println ( "ax" , ax )
// fmt.Println("bx", bx)
// fmt.Println("cx", cx)
// fmt.Println("px", px)
hx := Utils . PF . DivisorPolynomial ( px , zx )
hx := Utils . PF . DivisorPolynomial ( px , zx )
@ -146,32 +171,22 @@ func TestZkFromFlatCircuitCode(t *testing.T) {
div , rem := Utils . PF . Div ( px , zx )
div , rem := Utils . PF . Div ( px , zx )
assert . Equal ( t , hx , div )
assert . Equal ( t , hx , div )
assert . Equal ( t , rem , r1csqap . ArrayOfBigZeros ( 4 ) )
assert . Equal ( t , rem , r1csqap . ArrayOfBigZeros ( 1 ) )
// calculate trusted setup
// calculate trusted setup
setup , err := GenerateTrustedSetup ( len ( w ) , * circuit , alphas , betas , gammas , zx )
setup , err := GenerateTrustedSetup ( len ( w ) , * circuit , alphas , betas , gammas , zx )
// setup, err := GenerateTrustedSetup(len(w), *circuit, ax, bx, cx, zx)
assert . Nil ( t , err )
assert . Nil ( t , err )
fmt . Println ( "\nt:" , setup . Toxic . T )
// piA = g1 * A(t), piB = g2 * B(t), piC = g1 * C(t), piH = g1 * H(t)
// piA = g1 * A(t), piB = g2 * B(t), piC = g1 * C(t), piH = g1 * H(t)
proof , err := GenerateProofs ( * circuit , setup , hx , w )
proof , err := GenerateProofs ( * circuit , setup , hx , w )
assert . Nil ( t , err )
assert . Nil ( t , err )
fmt . Println ( "IC" , setup . Vk . IC )
// fmt.Println("\n proofs:")
// fmt.Println(proof)
// fmt.Println("public signals:", proof.PublicSignals)
fmt . Println ( "\nwitness" , w )
// assert.True(t, VerifyProof(*circuit, setup, proof, false))
b35 := big . NewInt ( int64 ( 35 ) )
b35 := big . NewInt ( int64 ( 35 ) )
publicSignals := [ ] * big . Int { b35 }
publicSignals := [ ] * big . Int { b35 }
fmt . Println ( "public signals:" , publicSignals )
before := time . Now ( )
assert . True ( t , VerifyProof ( * circuit , setup , proof , publicSignals , true ) )
assert . True ( t , VerifyProof ( * circuit , setup , proof , publicSignals , true ) )
fmt . Println ( "verify proof time elapsed:" , time . Since ( before ) )
}
}
* /
/ *
/ *
func TestZkFromHardcodedR1CS ( t * testing . T ) {
func TestZkFromHardcodedR1CS ( t * testing . T ) {
b0 := big . NewInt ( int64 ( 0 ) )
b0 := big . NewInt ( int64 ( 0 ) )