arkworks-rs / snark

Interfaces for Relations and SNARKs for these relations
https://www.arkworks.rs
Apache License 2.0
783 stars 208 forks source link

Generate public inputs for verifier also via ConstraintSystem API #341

Open Pratyush opened 3 years ago

Pratyush commented 3 years ago

Problem Definition

Right now, when the verifier needs to verify the public input, they have to implement and call ToConstraintField on the input. This is error prone for two reasons:

Proposal

I propose that we instead leverage the existing ConstraintSystem API to generate these inputs: we add a Verifier variant to the Mode enum, which generates variable assignments only for instance/input variables.

My only worry is that this could cause extra memory/computation for the verifier, but we can at least try it and see. I have two ideas to minimize this overhead:


For Admin Use

Pratyush commented 3 years ago

what do y'all think, @ValarDragon @weikengchen @npwardberkeley?

weikengchen commented 3 years ago

I agree. We should add a Verifier mode. This is useful in general.

As for the two optimizations, we feel they are not very crucial for now---but surely good to have. If we are unable to get both of them done it should still be fine since one who really wants a very efficient verifier can still do ToConstraintField themselves.

weikengchen commented 3 years ago

That said, it is better that we still leave an interface for one to run the verifier with a list of field elements, for compatibility and for use cases where the verifier cost needs to be very low.

Pratyush commented 3 years ago

That said, it is better that we still leave an interface for one to run the verifier with a list of field elements, for compatibility and for use cases where the verifier cost needs to be very low.

Yeah I was thinking the same

Pratyush commented 3 years ago

Make a related instantiation of ConstraintSynthesizer that only generates public inputs, and does not have the rest of the circuit logic. This is still better than the ToConstraintField idea because it is easy to match up the new_input statements on both sides.

Note that the above approach is compatible with this requirement:

That said, it is better that we still leave an interface for one to run the verifier with a list of field elements, for compatibility and for use cases where the verifier cost needs to be very low.

This is because you set the VerifierInputSynthesizer to directly call to_constraint_field, instead of going via the constraint system API