Closed SherLzp closed 3 years ago
When I change Define
to this(change A to G), it works:
func (circuit *SchnorrProofCircuit) Define(curveID ecc.ID, cs *frontend.ConstraintSystem) error {
// get edwards curve params
params, err := NewEdCurve(curveID)
if err != nil {
return err
}
l := circuit.G.ScalarMulFixedBase(cs, params.BaseX, params.BaseY, circuit.Z, params)
pkc := circuit.G.ScalarMulNonFixedBase(cs, &circuit.Pk, circuit.C, params)
r := circuit.G.AddGeneric(cs, &circuit.A, pkc, params)
cs.AssertIsEqual(l.X, circuit.E.X)
cs.AssertIsEqual(l.Y, circuit.E.Y)
cs.AssertIsEqual(r.X, circuit.E.X)
cs.AssertIsEqual(r.Y, circuit.E.Y)
return nil
}
hi, did reproduce, but I believe your issue comes from the fact that circuit.G.ScalarMulFixedBase
and circuit.G. circuit.G.ScalarMulNonFixedBase
mutates the caller.
So doing this works:
l := circuit.G.ScalarMulFixedBase(cs, params.BaseX, params.BaseY, circuit.Z, params)
cs.AssertIsEqual(l.X, circuit.E.X)
cs.AssertIsEqual(l.Y, circuit.E.Y)
pkc := circuit.G.ScalarMulNonFixedBase(cs, &circuit.Pk, circuit.C, params)
r := circuit.A.AddGeneric(cs, &circuit.A, pkc, params)
cs.AssertIsEqual(r.X, circuit.E.X)
cs.AssertIsEqual(r.Y, circuit.E.Y)
or
l := Point{
X: cs.Constant(circuit.G.X),
Y: cs.Constant(circuit.G.Y),
}
l.ScalarMulFixedBase(cs, params.BaseX, params.BaseY, circuit.Z, params)
pkc := circuit.G.ScalarMulNonFixedBase(cs, &circuit.Pk, circuit.C, params)
r := circuit.A.AddGeneric(cs, &circuit.A, pkc, params)
cs.AssertIsEqual(l.X, circuit.E.X)
cs.AssertIsEqual(l.Y, circuit.E.Y)
cs.AssertIsEqual(r.X, circuit.E.X)
cs.AssertIsEqual(r.Y, circuit.E.Y)
it works again. Thanks.
I want to use twisted edwards bn254 to verify schnorr proof(to prove $pk = g^{sk}$, and the verification process is: $g^z == A pk^c$), but some errors occur. Here is my code:
I can confirm that the witness is right. And something strange is that, when I change the code for
Define
as these two ways, it works: First:Second:
I think that's something wrong with the AssertIsEqual. Could you help me solve that?