use super::*;
impl<N: Network> Stack<N> {
#[inline]
pub fn synthesize_key<A: circuit::Aleo<Network = N>, R: Rng + CryptoRng>(
&self,
function_name: &Identifier<N>,
rng: &mut R,
) -> Result<()> {
if self.contains_proving_key(function_name) && self.contains_verifying_key(function_name) {
return Ok(());
}
let program_id = self.program_id();
let input_types = self.get_function(function_name)?.input_types();
let burner_private_key = PrivateKey::new(rng)?;
let burner_address = Address::try_from(&burner_private_key)?;
let inputs = input_types
.iter()
.map(|input_type| match input_type {
ValueType::ExternalRecord(locator) => {
let stack = self.get_external_stack(locator.program_id())?;
stack.sample_value(&burner_address, &ValueType::Record(*locator.resource()), rng)
}
_ => self.sample_value(&burner_address, input_type, rng),
})
.collect::<Result<Vec<_>>>()?;
let is_root = true;
let root_tvk = None;
let caller = None;
let request = Request::sign(
&burner_private_key,
*program_id,
*function_name,
inputs.into_iter(),
&input_types,
root_tvk,
is_root,
rng,
)?;
let authorization = Authorization::new(request.clone());
let call_stack = CallStack::Synthesize(vec![request], burner_private_key, authorization);
let _response = self.execute_function::<A, R>(call_stack, caller, root_tvk, rng)?;
ensure!(self.contains_proving_key(function_name), "Function '{function_name}' is missing a proving key.");
ensure!(self.contains_verifying_key(function_name), "Function '{function_name}' is missing a verifying key.");
Ok(())
}
#[inline]
pub fn synthesize_from_assignment(
&self,
function_name: &Identifier<N>,
assignment: &circuit::Assignment<N::Field>,
) -> Result<()> {
if self.contains_proving_key(function_name) && self.contains_verifying_key(function_name) {
return Ok(());
}
let (proving_key, verifying_key) = self.universal_srs.to_circuit_key(&function_name.to_string(), assignment)?;
self.insert_proving_key(function_name, proving_key)?;
self.insert_verifying_key(function_name, verifying_key)
}
}