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 String
s) 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
.