feat: introduce EvalResult type

This commit is contained in:
rvcas
2023-03-08 01:10:15 -05:00
committed by KtorZ
parent 4f1d14f2a0
commit bd7b8792bf
6 changed files with 63 additions and 79 deletions

View File

@@ -24,6 +24,7 @@ use crate::{
flat::Binder,
machine::{
cost_model::{initialize_cost_model, CostModel, ExBudget},
eval_result::EvalResult,
Machine,
},
};
@@ -595,14 +596,7 @@ impl From<Term<FakeNamedDeBruijn>> for Term<NamedDeBruijn> {
}
impl Program<NamedDeBruijn> {
pub fn eval(
&self,
initial_budget: ExBudget,
) -> (
Result<Term<NamedDeBruijn>, crate::machine::Error>,
ExBudget,
Vec<String>,
) {
pub fn eval(&self, initial_budget: ExBudget) -> EvalResult {
let mut machine = Machine::new(
Language::PlutusV2,
CostModel::default(),
@@ -612,22 +606,16 @@ impl Program<NamedDeBruijn> {
let term = machine.run(&self.term);
(term, machine.ex_budget, machine.logs)
EvalResult::new(term, machine.ex_budget, initial_budget, machine.logs)
}
/// Evaluate a Program as PlutusV1
pub fn eval_v1(
&self,
) -> (
Result<Term<NamedDeBruijn>, crate::machine::Error>,
ExBudget,
Vec<String>,
) {
pub fn eval_v1(&self) -> EvalResult {
let mut machine = Machine::new(Language::PlutusV1, CostModel::v1(), ExBudget::v1(), 200);
let term = machine.run(&self.term);
(term, machine.ex_budget, machine.logs)
EvalResult::new(term, machine.ex_budget, ExBudget::v1(), machine.logs)
}
pub fn eval_as(
@@ -635,11 +623,7 @@ impl Program<NamedDeBruijn> {
version: &Language,
costs: &[i64],
initial_budget: Option<&ExBudget>,
) -> (
Result<Term<NamedDeBruijn>, crate::machine::Error>,
ExBudget,
Vec<String>,
) {
) -> EvalResult {
let budget = match initial_budget {
Some(b) => *b,
None => ExBudget::default(),
@@ -654,19 +638,12 @@ impl Program<NamedDeBruijn> {
let term = machine.run(&self.term);
(term, machine.ex_budget, machine.logs)
EvalResult::new(term, machine.ex_budget, budget, machine.logs)
}
}
impl Program<DeBruijn> {
pub fn eval(
&self,
initial_budget: ExBudget,
) -> (
Result<Term<NamedDeBruijn>, crate::machine::Error>,
ExBudget,
Vec<String>,
) {
pub fn eval(&self, initial_budget: ExBudget) -> EvalResult {
let program: Program<NamedDeBruijn> = self.clone().into();
program.eval(initial_budget)

View File

@@ -8,6 +8,7 @@ use crate::{
pub mod cost_model;
mod error;
pub mod eval_result;
pub mod runtime;
use cost_model::{ExBudget, StepKind};
@@ -785,9 +786,9 @@ mod tests {
},
};
let (eval_result, _, _) = program.eval(ExBudget::default());
let eval_result = program.eval(ExBudget::default());
let term = eval_result.unwrap();
let term = eval_result.result().unwrap();
assert_eq!(
term,
@@ -834,10 +835,10 @@ mod tests {
];
for (fun, n, m, result) in test_data {
let (eval_result, _, _) = make_program(fun, n, m).eval(ExBudget::default());
let eval_result = make_program(fun, n, m).eval(ExBudget::default());
assert_eq!(
eval_result.unwrap(),
eval_result.result().unwrap(),
Term::Constant(Constant::Integer(result.into()).into())
);
}

View File

@@ -730,7 +730,7 @@ pub fn eval_redeemer(
.apply_data(redeemer.data.clone())
.apply_data(script_context.to_plutus_data());
let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt {
let mut eval_result = if let Some(cost_mdls) = cost_mdls_opt {
let costs = if let Some(costs) = &cost_mdls.plutus_v1 {
costs
} else {
@@ -742,9 +742,12 @@ pub fn eval_redeemer(
program.eval_v1()
};
match result {
let cost = eval_result.cost();
let logs = eval_result.logs();
match eval_result.result() {
Ok(_) => (),
Err(err) => return Err(Error::Machine(err, budget, logs)),
Err(err) => return Err(Error::Machine(err, cost, logs)),
}
let new_redeemer = Redeemer {
@@ -752,8 +755,8 @@ pub fn eval_redeemer(
index: redeemer.index,
data: redeemer.data.clone(),
ex_units: ExUnits {
mem: (initial_budget.mem - budget.mem) as u32,
steps: (initial_budget.cpu - budget.cpu) as u64,
mem: cost.mem as u32,
steps: cost.cpu as u64,
},
};
@@ -776,7 +779,7 @@ pub fn eval_redeemer(
.apply_data(redeemer.data.clone())
.apply_data(script_context.to_plutus_data());
let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt {
let mut eval_result = if let Some(cost_mdls) = cost_mdls_opt {
let costs = if let Some(costs) = &cost_mdls.plutus_v2 {
costs
} else {
@@ -788,9 +791,12 @@ pub fn eval_redeemer(
program.eval(ExBudget::default())
};
match result {
let cost = eval_result.cost();
let logs = eval_result.logs();
match eval_result.result() {
Ok(_) => (),
Err(err) => return Err(Error::Machine(err, budget, logs)),
Err(err) => return Err(Error::Machine(err, cost, logs)),
}
let new_redeemer = Redeemer {
@@ -798,8 +804,8 @@ pub fn eval_redeemer(
index: redeemer.index,
data: redeemer.data.clone(),
ex_units: ExUnits {
mem: (initial_budget.mem - budget.mem) as u32,
steps: (initial_budget.cpu - budget.cpu) as u64,
mem: cost.mem as u32,
steps: cost.cpu as u64,
},
};
@@ -824,7 +830,7 @@ pub fn eval_redeemer(
.apply_data(redeemer.data.clone())
.apply_data(script_context.to_plutus_data());
let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt {
let mut eval_result = if let Some(cost_mdls) = cost_mdls_opt {
let costs = if let Some(costs) = &cost_mdls.plutus_v1 {
costs
} else {
@@ -836,9 +842,12 @@ pub fn eval_redeemer(
program.eval_v1()
};
match result {
let cost = eval_result.cost();
let logs = eval_result.logs();
match eval_result.result() {
Ok(_) => (),
Err(err) => return Err(Error::Machine(err, budget, logs)),
Err(err) => return Err(Error::Machine(err, cost, logs)),
}
let new_redeemer = Redeemer {
@@ -846,8 +855,8 @@ pub fn eval_redeemer(
index: redeemer.index,
data: redeemer.data.clone(),
ex_units: ExUnits {
mem: (initial_budget.mem - budget.mem) as u32,
steps: (initial_budget.cpu - budget.cpu) as u64,
mem: cost.mem as u32,
steps: cost.cpu as u64,
},
};
@@ -869,7 +878,7 @@ pub fn eval_redeemer(
.apply_data(redeemer.data.clone())
.apply_data(script_context.to_plutus_data());
let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt {
let mut eval_result = if let Some(cost_mdls) = cost_mdls_opt {
let costs = if let Some(costs) = &cost_mdls.plutus_v2 {
costs
} else {
@@ -881,9 +890,12 @@ pub fn eval_redeemer(
program.eval(ExBudget::default())
};
match result {
let cost = eval_result.cost();
let logs = eval_result.logs();
match eval_result.result() {
Ok(_) => (),
Err(err) => return Err(Error::Machine(err, budget, logs)),
Err(err) => return Err(Error::Machine(err, cost, logs)),
}
let new_redeemer = Redeemer {
@@ -891,8 +903,8 @@ pub fn eval_redeemer(
index: redeemer.index,
data: redeemer.data.clone(),
ex_units: ExUnits {
mem: (initial_budget.mem - budget.mem) as u32,
steps: (initial_budget.cpu - budget.cpu) as u64,
mem: cost.mem as u32,
steps: cost.cpu as u64,
},
};