snarkvm_debug/package/
execute.rs1use super::*;
16
17impl<N: Network> Package<N> {
18 #[allow(clippy::type_complexity)]
20 pub fn execute<A: crate::circuit::Aleo<Network = N, BaseField = N::Field>, R: Rng + CryptoRng>(
21 &self,
22 endpoint: String,
23 private_key: &PrivateKey<N>,
24 function_name: Identifier<N>,
25 inputs: &[Value<N>],
26 rng: &mut R,
27 ) -> Result<(Response<N>, Execution<N>, Vec<CallMetrics<N>>)> {
28 let program = self.program();
30 let program_id = program.id();
32 if !program.contains_function(&function_name) {
34 bail!("Function '{function_name}' does not exist.")
35 }
36
37 self.build::<A>(None)?;
41
42 let locator = Locator::<N>::from_str(&format!("{program_id}/{function_name}"))?;
44
45 #[cfg(feature = "aleo-cli")]
46 println!("🚀 Executing '{}'...\n", locator.to_string().bold());
47
48 let process = self.get_process()?;
50 let authorization = process.authorize::<A, R>(private_key, program_id, function_name, inputs.iter(), rng)?;
52
53 let program = process.get_program(program_id)?;
55 let function = program.get_function(&function_name)?;
57 for instruction in function.instructions() {
59 if let Instruction::Call(call) = instruction {
60 let (program, resource) = match call.operator() {
62 CallOperator::Locator(locator) => (process.get_program(locator.program_id())?, locator.resource()),
63 CallOperator::Resource(resource) => (program, resource),
64 };
65 if program.contains_function(resource) {
67 let function_name = resource;
69 let import_build_directory =
71 self.build_directory().join(format!("{}-{}", program.id().name(), program.id().network()));
72
73 let prover = ProverFile::open(&import_build_directory, function_name)?;
75 process.insert_proving_key(program.id(), function_name, prover.proving_key().clone())?;
77
78 let verifier = VerifierFile::open(&import_build_directory, function_name)?;
80 process.insert_verifying_key(program.id(), function_name, verifier.verifying_key().clone())?;
82 }
83 }
84 }
85
86 let build_directory = self.build_directory();
88 let prover = ProverFile::open(&build_directory, &function_name)?;
90 let verifier = VerifierFile::open(&build_directory, &function_name)?;
92
93 process.insert_proving_key(program_id, &function_name, prover.proving_key().clone())?;
95 process.insert_verifying_key(program_id, &function_name, verifier.verifying_key().clone())?;
97
98 let (response, mut trace) = process.execute::<A, R>(authorization, rng)?;
100
101 let call_metrics = trace.call_metrics().to_vec();
103
104 trace.prepare(Query::<_, BlockMemory<_>>::from(endpoint))?;
106 let execution = trace.prove_execution::<A, R>(&locator.to_string(), rng)?;
108 Ok((response, execution, call_metrics))
110 }
111}
112
113#[cfg(test)]
114mod tests {
115 use super::*;
116 use snarkvm_utilities::TestRng;
117
118 type CurrentAleo = snarkvm_circuit::network::AleoV0;
119
120 #[test]
122 #[ignore]
123 fn test_execute() {
124 let (directory, package) = crate::package::test_helpers::sample_token_package();
126
127 assert!(!package.build_directory().exists());
129 package.build::<CurrentAleo>(None).unwrap();
131 assert!(package.build_directory().exists());
133
134 let rng = &mut TestRng::default();
136 let (private_key, function_name, inputs) =
138 crate::package::test_helpers::sample_package_run(package.program_id());
139 let endpoint = "https://api.explorer.aleo.org/v1".to_string();
141 let (_response, _execution, _metrics) =
143 package.execute::<CurrentAleo, _>(endpoint, &private_key, function_name, &inputs, rng).unwrap();
144
145 std::fs::remove_dir_all(directory).unwrap();
147 }
148
149 #[test]
151 #[ignore]
152 fn test_execute_with_import() {
153 let (directory, package) = crate::package::test_helpers::sample_wallet_package();
155
156 assert!(!package.build_directory().exists());
158 package.build::<CurrentAleo>(None).unwrap();
160 assert!(package.build_directory().exists());
162
163 let rng = &mut TestRng::default();
165 let (private_key, function_name, inputs) =
167 crate::package::test_helpers::sample_package_run(package.program_id());
168 let endpoint = "https://api.explorer.aleo.org/v1".to_string();
170 let (_response, _execution, _metrics) =
172 package.execute::<CurrentAleo, _>(endpoint, &private_key, function_name, &inputs, rng).unwrap();
173
174 std::fs::remove_dir_all(directory).unwrap();
176 }
177
178 #[ignore]
180 #[test]
181 fn test_profiler() -> Result<()> {
182 let (directory, package) = crate::package::test_helpers::sample_token_package();
184
185 assert!(!package.build_directory().exists());
187 package.build::<CurrentAleo>(None).unwrap();
189 assert!(package.build_directory().exists());
191
192 let rng = &mut TestRng::default();
194 let (private_key, function_name, inputs) =
196 crate::package::test_helpers::sample_package_run(package.program_id());
197 let endpoint = "https://api.explorer.aleo.org/v1".to_string();
199 let (_response, _execution, _metrics) =
201 package.execute::<CurrentAleo, _>(endpoint, &private_key, function_name, &inputs, rng).unwrap();
202
203 std::fs::remove_dir_all(directory).unwrap();
205
206 bail!("\n\nRemember to #[ignore] this test!\n\n")
207 }
208}