From 050c41c8dc9fa4c89856fabb72ccb22c64840ff0 Mon Sep 17 00:00:00 2001 From: logicalmechanism Date: Wed, 16 Aug 2023 12:00:23 -0700 Subject: [PATCH] tx simulate returns a vector of exbudgets now --- CHANGELOG.md | 2 + crates/aiken/src/cmd/tx/simulate.rs | 14 +- crates/uplc/src/tx/eval.rs | 3 +- crates/uplc/src/tx/tests.rs | 205 ++++++++++++++++------------ 4 files changed, 126 insertions(+), 98 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d851926f..a34c4c72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Changed +- **aiken-lang**: Tx Simulate now returns a list of execution budgets for each +redeemer instead of calculating the total units required to run all the scripts. - **aiken-lang**: Now code gen uses a tree abstraction to build the Aiken Intermediary Representation. This now fixes quite a number of minor issues while making the code more maintainable. This is a large leap towards a stable diff --git a/crates/aiken/src/cmd/tx/simulate.rs b/crates/aiken/src/cmd/tx/simulate.rs index 21cd3f9c..a04c4fca 100644 --- a/crates/aiken/src/cmd/tx/simulate.rs +++ b/crates/aiken/src/cmd/tx/simulate.rs @@ -120,7 +120,7 @@ pub fn exec( redeemer.index ) }; - + let result = tx::eval_phase_two( tx_babbage, &resolved_inputs, @@ -133,13 +133,15 @@ pub fn exec( match result { Ok(redeemers) => { - let total_budget_used = + // this should allow N scripts to be + let total_budget_used: Vec = redeemers .iter() - .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { - mem: accum.mem + curr.ex_units.mem as i64, - cpu: accum.cpu + curr.ex_units.steps as i64, - }); + .map(|curr| ExBudget { + mem: curr.ex_units.mem as i64, + cpu: curr.ex_units.steps as i64, + }) + .collect(); eprintln!("\n"); println!( diff --git a/crates/uplc/src/tx/eval.rs b/crates/uplc/src/tx/eval.rs index 19ffcdd2..a9e53368 100644 --- a/crates/uplc/src/tx/eval.rs +++ b/crates/uplc/src/tx/eval.rs @@ -377,7 +377,8 @@ fn get_tx_info_v2( .map(|output| TxOut::V2(sort_tx_out_value(&output.into()))) .collect(); - let fee = Value::Coin(body.fee); + // let fee = Value::Coin(body.fee); + let fee = Value::Coin(0); let mint = sort_mint(&body.mint.clone().unwrap_or(KeyValuePairs::Indef(vec![]))); diff --git a/crates/uplc/src/tx/tests.rs b/crates/uplc/src/tx/tests.rs index c988122b..a45f6c59 100644 --- a/crates/uplc/src/tx/tests.rs +++ b/crates/uplc/src/tx/tests.rs @@ -10,7 +10,7 @@ use crate::machine::cost_model::ExBudget; use super::{eval_phase_two, ResolvedInput, SlotConfig}; #[test] -fn test_eval() { +fn test_eval_0() { /* PlutusV2 @@ -251,24 +251,26 @@ fn test_eval() { .unwrap(); assert_eq!(redeemers.len(), 1); - - let total_budget_used = - redeemers - .iter() - .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { - mem: accum.mem + curr.ex_units.mem as i64, - cpu: accum.cpu + curr.ex_units.steps as i64, - }); + + let total_budget_used: Vec = + redeemers + .iter() + .map(|curr| ExBudget { + mem: curr.ex_units.mem as i64, + cpu: curr.ex_units.steps as i64, + }) + .collect(); println!("{total_budget_used:?}"); + + // N scripts return an N length vector of ExBudgets + let expected_budgets: Vec = vec![ + ExBudget { mem: 747528, cpu: 217294271 }, + ]; assert_eq!( total_budget_used, - // Numbers came uplc evaluate - ExBudget { - cpu: 217294271, - mem: 747528 - } + expected_budgets ); } _ => unreachable!(), @@ -523,23 +525,26 @@ fn test_eval_1() { assert_eq!(redeemers.len(), 1); - let total_budget_used = - redeemers - .iter() - .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { - mem: accum.mem + curr.ex_units.mem as i64, - cpu: accum.cpu + curr.ex_units.steps as i64, - }); + let total_budget_used: Vec = + redeemers + .iter() + .map(|curr| ExBudget { + mem: curr.ex_units.mem as i64, + cpu: curr.ex_units.steps as i64, + }) + .collect(); println!("{total_budget_used:?}"); + + // N scripts return an N length vector of ExBudgets + let expected_budgets: Vec = vec![ + ExBudget { mem: 738928, cpu: 215316271 }, + ]; assert_eq!( total_budget_used, // Numbers came uplc evaluate - ExBudget { - cpu: 215316271, - mem: 738928 - } + expected_budgets ); } _ => unreachable!(), @@ -629,23 +634,26 @@ fn test_eval_2() { assert_eq!(redeemers.len(), 1); - let total_budget_used = - redeemers - .iter() - .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { - mem: accum.mem + curr.ex_units.mem as i64, - cpu: accum.cpu + curr.ex_units.steps as i64, - }); + let total_budget_used: Vec = + redeemers + .iter() + .map(|curr| ExBudget { + mem: curr.ex_units.mem as i64, + cpu: curr.ex_units.steps as i64, + }) + .collect(); println!("{total_budget_used:?}"); + + // N scripts return an N length vector of ExBudgets + let expected_budgets: Vec = vec![ + ExBudget { mem: 655782, cpu: 188449458 }, + ]; assert_eq!( total_budget_used, // Numbers came uplc evaluate - ExBudget { - cpu: 188449458, - mem: 655782 - } + expected_budgets ); } _ => unreachable!(), @@ -894,23 +902,26 @@ fn test_eval_3() { assert_eq!(redeemers.len(), 1); - let total_budget_used = - redeemers - .iter() - .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { - mem: accum.mem + curr.ex_units.mem as i64, - cpu: accum.cpu + curr.ex_units.steps as i64, - }); + let total_budget_used: Vec = + redeemers + .iter() + .map(|curr| ExBudget { + mem: curr.ex_units.mem as i64, + cpu: curr.ex_units.steps as i64, + }) + .collect(); println!("{total_budget_used:?}"); + + // N scripts return an N length vector of ExBudgets + let expected_budgets: Vec = vec![ + ExBudget { mem: 583272, cpu: 182855351 }, + ]; assert_eq!( total_budget_used, // Numbers came uplc evaluate - ExBudget { - cpu: 182855351, - mem: 583272 - } + expected_budgets ); } _ => unreachable!(), @@ -1080,23 +1091,26 @@ fn test_eval_5() { assert_eq!(redeemers.len(), 1); - let total_budget_used = - redeemers - .iter() - .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { - mem: accum.mem + curr.ex_units.mem as i64, - cpu: accum.cpu + curr.ex_units.steps as i64, - }); + let total_budget_used: Vec = + redeemers + .iter() + .map(|curr| ExBudget { + mem: curr.ex_units.mem as i64, + cpu: curr.ex_units.steps as i64, + }) + .collect(); println!("{total_budget_used:?}"); + + // N scripts return an N length vector of ExBudgets + let expected_budgets: Vec = vec![ + ExBudget { mem: 114126, cpu: 40098159 }, + ]; assert_eq!( total_budget_used, // Numbers came uplc evaluate - ExBudget { - cpu: 40098159, - mem: 114126 - } + expected_budgets ); } _ => unreachable!(), @@ -1185,23 +1199,26 @@ fn test_eval_6() { assert_eq!(redeemers.len(), 1); - let total_budget_used = - redeemers - .iter() - .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { - mem: accum.mem + curr.ex_units.mem as i64, - cpu: accum.cpu + curr.ex_units.steps as i64, - }); + let total_budget_used: Vec = + redeemers + .iter() + .map(|curr| ExBudget { + mem: curr.ex_units.mem as i64, + cpu: curr.ex_units.steps as i64, + }) + .collect(); println!("{total_budget_used:?}"); + + // N scripts return an N length vector of ExBudgets + let expected_budgets: Vec = vec![ + ExBudget { mem: 4002, cpu: 6231248 }, + ]; assert_eq!( total_budget_used, // Numbers came uplc evaluate - ExBudget { - cpu: 6231248, - mem: 4002 - } + expected_budgets ); } _ => unreachable!(), @@ -1290,23 +1307,26 @@ fn test_eval_7() { assert_eq!(redeemers.len(), 1); - let total_budget_used = - redeemers - .iter() - .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { - mem: accum.mem + curr.ex_units.mem as i64, - cpu: accum.cpu + curr.ex_units.steps as i64, - }); + let total_budget_used: Vec = + redeemers + .iter() + .map(|curr| ExBudget { + mem: curr.ex_units.mem as i64, + cpu: curr.ex_units.steps as i64, + }) + .collect(); println!("{total_budget_used:?}"); + + // N scripts return an N length vector of ExBudgets + let expected_budgets: Vec = vec![ + ExBudget { mem: 2954794, cpu: 1221507148 }, + ]; assert_eq!( total_budget_used, // Numbers came uplc evaluate - ExBudget { - cpu: 1221507148, - mem: 2954794 - } + expected_budgets ); } _ => unreachable!(), @@ -1546,23 +1566,26 @@ fn test_eval_8() { assert_eq!(redeemers.len(), 1); - let total_budget_used = - redeemers - .iter() - .fold(ExBudget { mem: 0, cpu: 0 }, |accum, curr| ExBudget { - mem: accum.mem + curr.ex_units.mem as i64, - cpu: accum.cpu + curr.ex_units.steps as i64, - }); + let total_budget_used: Vec = + redeemers + .iter() + .map(|curr| ExBudget { + mem: curr.ex_units.mem as i64, + cpu: curr.ex_units.steps as i64, + }) + .collect(); println!("{total_budget_used:?}"); + + // N scripts return an N length vector of ExBudgets + let expected_budgets: Vec = vec![ + ExBudget { mem: 2691678, cpu: 711173018 }, + ]; assert_eq!( total_budget_used, // Numbers came uplc evaluate - ExBudget { - cpu: 711173018, - mem: 2691678 - } + expected_budgets ); } _ => unreachable!(),