Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Or && Xor #355

Merged
merged 3 commits into from
Sep 15, 2022
Merged

Fix Or && Xor #355

merged 3 commits into from
Sep 15, 2022

Conversation

liyue201
Copy link
Contributor

@liyue201 liyue201 commented Aug 8, 2022

Or and Xor return unexpected values

my circuit

package main

import (
	"fmt"
	"time"

	"github.com/consensys/gnark-crypto/ecc"
	"github.com/consensys/gnark/backend/groth16"
	"github.com/consensys/gnark/frontend"
	"github.com/consensys/gnark/frontend/cs/r1cs"
)

type TestCircuit struct {
	A frontend.Variable
	B frontend.Variable
}

func (t *TestCircuit) Define(api frontend.API) error {
	a := api.ToBinary(t.A, 8)
	b := api.ToBinary(t.B, 8)
	isZero := make([]frontend.Variable, 8)

	for i := 0; i < 8; i++ {
		isZero[i] = api.And(a[i], b[i])
	}

	api.Println(isZero...)

	// test or
	or := make([]frontend.Variable, 8)
	or[0] = api.Sub(1, isZero[0])
	for i := 1; i < 8; i++ {
		or[i] = api.Or(api.Sub(1, isZero[i]), or[i-1])
	}
	api.Println(or...)

	// test xor
	xor := make([]frontend.Variable, 8)
	xor[0] = api.Sub(1, isZero[0])
	for i := 1; i < 8; i++ {
		xor[i] = api.Xor(api.Sub(1, isZero[i]), xor[i-1])
	}
	api.Println(xor...)

	return nil
}

func main() {

	var circuit TestCircuit

	t := time.Now()
	_r1cs, err := frontend.Compile(ecc.BN254, r1cs.NewBuilder, &circuit, frontend.IgnoreUnconstrainedInputs())
	if err != nil {
		panic(err)
	}
	internal, secret, public := _r1cs.GetNbVariables()
	fmt.Printf("public, secret, internal %v, %v, %v\n", public, secret, internal)

	t0 := time.Now()
	fmt.Printf("Compilation time: %v\n", t0.Sub(t))
	pk, vk, _ := groth16.Setup(_r1cs)
	t1 := time.Now()
	fmt.Printf("Setup time: %v\n", t1.Sub(t0))

	witness, err := frontend.NewWitness(&TestCircuit{
		A: 7,
		B: 21,
	}, ecc.BN254)
	if err != nil {
		panic(err)
	}

	t2 := time.Now()
	fmt.Printf("Witness time: %v\n", t2.Sub(t1))
	proof, err := groth16.Prove(_r1cs, pk, witness)
	if err != nil {
		panic(err)
	}
	t3 := time.Now()
	fmt.Printf("Prove time: %v\n", t3.Sub(t2))
	pubwit, _ := witness.Public()
	if err := groth16.Verify(proof, vk, pubwit); err != nil {
		panic("verification failed")
	}
}

and the log

16:56:43 DBG main.go:27 > 1 0 1 0 0 0 0 0
16:56:43 DBG main.go:35 > 0 2 3 1 1 1 1 1
16:56:43 DBG main.go:43 > 0 2 3 -2 3 -2 3 -2

the expected value

17:00:07 DBG main.go:27 > 1 0 1 0 0 0 0 0
17:00:07 DBG main.go:35 > 0 1 1 1 1 1 1 1
17:00:07 DBG main.go:43 > 0 1 1 0 1 0 1 0

tinywell and others added 2 commits July 29, 2022 12:39
* fix  misspelled ("decsribes" ->  "describes")

* fix  misspelled ("decsribes" ->  "describes") from tmpl file and regenerate

Co-authored-by: tinywell <tinywell@tinywell.com>
@gbotrel gbotrel changed the base branch from master to develop September 15, 2022 19:33
@gbotrel gbotrel merged commit b33f88c into Consensys:develop Sep 15, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants