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 request = Request::sign(&burner_private_key, *program_id, *function_name, &inputs, &input_types, 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, 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, assignment)?;
self.insert_proving_key(function_name, proving_key)?;
self.insert_verifying_key(function_name, verifying_key)
}
}