pub struct CodeGen { /* private fields */ }Expand description
The main struct to handle code generation for this macro.
Initialize a CodeGen with the SigmaCompSpec you get by
parsing the macro input. Pass it to the various transformations and
statement handlers, which will both update the code it will
generate, and modify the SigmaCompSpec. Then at the end, call
CodeGen::generate with the modified SigmaCompSpec to generate the
code output by this macro.
Implementations§
Source§impl CodeGen
impl CodeGen
Sourcepub fn new(spec: &SigmaCompSpec) -> Self
pub fn new(spec: &SigmaCompSpec) -> Self
Create a new CodeGen given the SigmaCompSpec you get by
parsing the macro input.
Sourcepub fn gen_scalar(
&self,
vars: &mut TaggedVarDict,
base: &Ident,
is_rand: bool,
is_vec: bool,
) -> Ident
pub fn gen_scalar( &self, vars: &mut TaggedVarDict, base: &Ident, is_rand: bool, is_vec: bool, ) -> Ident
Create a new generated private Scalar variable to put in the Witness.
If you call this, you should also call
prove_append with code like quote!{ let #id = ... } where id is the Ident returned from
this function.
Sourcepub fn gen_point(
&mut self,
vars: &mut TaggedVarDict,
base: &Ident,
is_vec: bool,
send_to_verifier: bool,
) -> Ident
pub fn gen_point( &mut self, vars: &mut TaggedVarDict, base: &Ident, is_vec: bool, send_to_verifier: bool, ) -> Ident
Create a new public Point variable to put in the Instance, optionally marking it as needing to be sent from the prover to the verifier along with the proof.
If you call this function, you should also call
prove_append with code like quote!{ let #id = ... } where id is the Ident returned from
this function. If is_vec is true, then you should also call
verify_pre_instance_append
with code like quote!{ let mut #id = Vec::<Point>::new(); #id.resize(#len, Point::default()); } where len is the number
of elements you expect to have in the vector (computed at
runtime, perhaps based on the values of public parameters).
Sourcepub fn gen_ident(&self, base: &Ident) -> Ident
pub fn gen_ident(&self, base: &Ident) -> Ident
Create a new identifier, using the unique prefix
Sourcepub fn prove_append(&mut self, code: TokenStream)
pub fn prove_append(&mut self, code: TokenStream)
Append some code to the generated prove function
Sourcepub fn verify_append(&mut self, code: TokenStream)
pub fn verify_append(&mut self, code: TokenStream)
Append some code to the generated verify function
Sourcepub fn verify_pre_instance_append(&mut self, code: TokenStream)
pub fn verify_pre_instance_append(&mut self, code: TokenStream)
Append some code to the generated verify function to be run
before the sent_instance are deserialized
Sourcepub fn prove_verify_append(&mut self, code: TokenStream)
pub fn prove_verify_append(&mut self, code: TokenStream)
Append some code to both the generated prove and verify
functions
Sourcepub fn prove_verify_pre_instance_append(&mut self, code: TokenStream)
pub fn prove_verify_pre_instance_append(&mut self, code: TokenStream)
Append some code to both the generated prove and verify
functions, the latter to be run before the sent_instance are
deserialized
Sourcepub fn code_strings(&self) -> (String, String, String)
pub fn code_strings(&self) -> (String, String, String)
Extract (as Strings) the code inserted by
prove_append,
verify_append, and
verify_pre_instance_append.
Sourcepub fn generate(
&self,
spec: &mut SigmaCompSpec,
emit_prover: bool,
emit_verifier: bool,
) -> TokenStream
pub fn generate( &self, spec: &mut SigmaCompSpec, emit_prover: bool, emit_verifier: bool, ) -> TokenStream
Generate the code to be output by this macro.
emit_prover and emit_verifier are as in
sigma_compiler_core.