Add a new trait `ToConstraintFieldGadget`?
Closed this issue · 1 comments
We should have a new trait ToConstraintFieldGadget
, which is the r1cs counterpart of ToConstraintField
. Both are shown below.
pub trait ToConstraintField<F: Field> {
fn to_field_elements(&self) -> Result<Vec<F>, Error>;
}
pub trait ToConstraintFieldGadget<ConstraintF: PrimeField> {
fn to_field_gadgets<CS: ConstraintSystem<ConstraintF>>(
&self,
cs: CS,
) -> Result<Vec<FpGadget<ConstraintF>>, SynthesisError>;
}
Reason: for algebraic hash functions.
Currently, many gadgets implement ToBytesGadget
, so that they could later be used for Pedersen hash functions (or even classical SHA-256).
This is not suitable for algebraic hash functions like Poseidon, whose natural input is exactly of the field elements.
Thus, it would be great if we have a ToConstraintFieldGadget
that is implemented in many applicable gadgets. I have had some local implementations. And I am wondering whether we should do so. If so, I can submit a PR after the Great Refactoring.
This can also make the HashChain/Sponge easier to program since they can accept any types with a trait ToConstraintFieldGadget
, rather than requiring the developers to write additional lines of code to convert it first to constraint field gadgets.