Open winderica opened 6 months ago
This looks like a good idea to me! Maybe we can call it new_variable_with_inferred_mode
? Or some variant.
Sure, new_variable_with_inferred_mode
also sounds better to me! I agree that naming it by functionality is better than by usage, as users may use it in some other cases.
Summary
Add a new method to
AllocVar
that creates a witness variable or constant in the constraint system depending on the type ofcs
.Problem Definition
When feeding non-deterministic advice for some computation $f$ to a circuit, it is often desirable to call
new_variable
with amode
based on the context. That is, when the inputs to $f$ are all constant, we can chooseAllocationMode::Constant
for the advice to save some constraints for enforcing its validity. Otherwise, we need to chooseAllocationMode::Witness
.However, doing so manually introduces redundancy. We can find many duplicated code fragments for this purpose in this repo, e.g.,
https://github.com/arkworks-rs/r1cs-std/blob/4020fbc22625621baa8125ede87abaeac3c1ca26/src/groups/curves/twisted_edwards/mod.rs#L120-L138 https://github.com/arkworks-rs/r1cs-std/blob/4020fbc22625621baa8125ede87abaeac3c1ca26/src/fields/quadratic_extension.rs#L279-L291
Furthermore, taking care for every advice allocation increases the mental burden of a circuit developer, while failing to do so may result in a larger circuit.
Proposal
This proposal aims to address the above problem by introducing a new method (tentatively dubbed
new_hint
) toAllocVar
, which creates a constant ifcs
isNone
and a witness variable otherwise. The logic ofnew_hint
should be similar as below:Please let me know what you think, and I can create a PR if this proposal looks good to you :)
For Admin Use