1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
// Copyright (C) 2019-2023 Aleo Systems Inc.
// This file is part of the snarkVM library.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use super::*;
impl<N: Network> Stack<N> {
/// Authorizes a call to the program function for the given inputs.
#[inline]
pub fn authorize<A: circuit::Aleo<Network = N>, R: Rng + CryptoRng>(
&self,
private_key: &PrivateKey<N>,
function_name: impl TryInto<Identifier<N>>,
inputs: impl ExactSizeIterator<Item = impl TryInto<Value<N>>>,
rng: &mut R,
) -> Result<Authorization<N>> {
let timer = timer!("Stack::authorize");
// Get the program ID.
let program_id = *self.program.id();
// Prepare the function name.
let function_name = function_name.try_into().map_err(|_| anyhow!("Invalid function name"))?;
// Retrieve the input types.
let input_types = self.get_function(&function_name)?.input_types();
lap!(timer, "Retrieve the input types");
// Compute the request.
let request = Request::sign(private_key, program_id, function_name, inputs, &input_types, rng)?;
lap!(timer, "Compute the request");
// Initialize the authorization.
let authorization = Authorization::new(request.clone());
// Construct the call stack.
let call_stack = CallStack::Authorize(vec![request], *private_key, authorization.clone());
// Construct the authorization from the function.
let _response = self.execute_function::<A, R>(call_stack, None, rng)?;
finish!(timer, "Construct the authorization from the function");
// Return the authorization.
Ok(authorization)
}
}