github.com/Evanesco-Labs/go-evanesco@v1.0.1/zkpminer/problem/problem_test.go (about) 1 package problem 2 3 import ( 4 "bytes" 5 "crypto/sha256" 6 "github.com/consensys/gnark-crypto/ecc" 7 "github.com/consensys/gnark-crypto/ecc/bn254/fr" 8 "github.com/consensys/gnark-crypto/ecc/bn254/fr/mimc" 9 "github.com/consensys/gnark/backend" 10 "github.com/consensys/gnark/backend/groth16" 11 "github.com/consensys/gnark/frontend" 12 "github.com/Evanesco-Labs/go-evanesco/log" 13 "github.com/stretchr/testify/assert" 14 "runtime" 15 "testing" 16 "time" 17 ) 18 19 func TestNewProvingKey(t *testing.T) { 20 r1cs := CompileCircuit() 21 pk, vk := SetupZKP(r1cs) 22 buf := bytes.Buffer{} 23 pk.WriteTo(&buf) 24 pkR := NewProvingKey(buf.Bytes()) 25 assert.Equal(t, false, pkR.IsDifferent(pk)) 26 27 buf.Reset() 28 vk.WriteTo(&buf) 29 vkR := NewVerifyingKey(buf.Bytes()) 30 assert.Equal(t, false, vkR.IsDifferent(vk)) 31 } 32 33 func TestZKP(t *testing.T) { 34 r1cs := CompileCircuit() 35 pk, vk := SetupZKP(r1cs) 36 37 msg := "test evanesco" 38 hash := sha256.New() 39 hash.Write([]byte(msg)) 40 preimage := hash.Sum(nil) 41 42 mimcHash, proof := ZKPProve(r1cs, pk, preimage) 43 44 result := ZKPVerify(vk, preimage, mimcHash, proof) 45 assert.Equal(t, true, result) 46 } 47 48 func TestCircuit(t *testing.T) { 49 runtime.GOMAXPROCS(1) 50 var mimcCircuit Circuit 51 52 r1cs, err := frontend.Compile(ecc.BN254, backend.GROTH16, &mimcCircuit) 53 log.Debug("constraints:","number", r1cs.GetNbConstraints()) 54 if err != nil { 55 t.Fatal(err) 56 } 57 58 startTime := time.Now() 59 pk, vk, err := groth16.Setup(r1cs) 60 if err != nil { 61 t.Fatal(err) 62 } 63 log.Debug("setup time:", "duration",time.Now().Sub(startTime).String()) 64 65 { 66 buf := bytes.Buffer{} 67 n, err := pk.WriteTo(&buf) 68 log.Debug("pk size:", "size",n) 69 70 buf = bytes.Buffer{} 71 n, err = vk.WriteTo(&buf) 72 log.Debug("vk size:","size", n) 73 74 var witness Circuit 75 76 msg := "test evanesco" 77 hash1 := sha256.New() 78 hash1.Write([]byte(msg)) 79 pre := hash1.Sum(nil) 80 81 witness.PreImage.Assign(pre) 82 83 hash := mimc.NewMiMC(SEED) 84 var preimage fr.Element 85 preimage.SetBytes(pre) 86 pr := preimage.Bytes() 87 hash.Write(pr[:]) 88 sum := hash.Sum(nil) 89 witness.Hash.Assign(sum) 90 91 start := time.Now() 92 proof, err := groth16.Prove(r1cs, pk, &witness) 93 if err != nil { 94 t.Fatal(err) 95 } 96 duration := time.Now().Sub(start).String() 97 log.Debug("prove time:","duration", duration) 98 99 buf = bytes.Buffer{} 100 _, err = proof.WriteTo(&buf) 101 if err != nil { 102 log.Error(err.Error()) 103 } 104 105 var witnessV Circuit 106 witnessV.PreImage.Assign(pre) 107 witnessV.Hash.Assign(sum) 108 start = time.Now() 109 err = groth16.Verify(proof, vk, &witnessV) 110 if err != nil { 111 t.Fatal(err) 112 } 113 log.Debug("verify time:", "duration",time.Now().Sub(start).String()) 114 } 115 } 116 117 //TestSetupZKP checks setup randomness 118 func TestSetupZKP(t *testing.T) { 119 r1cs := CompileCircuit() 120 pk1, vk1 := SetupZKP(r1cs) 121 122 pk2, vk2 := SetupZKP(r1cs) 123 124 buf1 := new(bytes.Buffer) 125 buf2 := new(bytes.Buffer) 126 127 pk1.WriteTo(buf1) 128 pk2.WriteTo(buf2) 129 assert.Equal(t, false, bytes.Equal(buf1.Bytes(), buf2.Bytes())) 130 131 buf1.Reset() 132 buf2.Reset() 133 vk1.WriteTo(buf1) 134 vk2.WriteTo(buf2) 135 assert.Equal(t, false, bytes.Equal(buf1.Bytes(), buf2.Bytes())) 136 }