feat: output total budget spent from cli

This commit is contained in:
rvcas 2022-09-24 20:23:51 -04:00
parent 4166e27fd7
commit 08596588a7
No known key found for this signature in database
GPG Key ID: C09B64E263F7D68C
6 changed files with 57 additions and 48 deletions

View File

@ -1,4 +0,0 @@
(program
1.0.0
(lam y (lam x [ [ (builtin addInteger) x ] y ]))
)

View File

@ -20,21 +20,29 @@ pub enum Args {
pub enum TxCommand { pub enum TxCommand {
/// Simulate a transaction by evaluating it's script /// Simulate a transaction by evaluating it's script
Simulate { Simulate {
/// A file containing cbor hex /// A file containing cbor hex for a transaction
input: PathBuf, input: PathBuf,
/// Toggle whether input is raw cbor or a hex string /// Toggle whether input is raw cbor or a hex string
#[clap(short, long)] #[clap(short, long)]
cbor: bool, cbor: bool,
/// Json file containing resolved inputs /// A file containing cbor hex for the raw inputs
#[clap(short, long)] raw_inputs: PathBuf,
resolved_inputs: PathBuf,
#[clap(short, long)] /// A file containing cbor hex for the raw outputs
raw_outputs: PathBuf,
/// Time between each slot
#[clap(short, long, default_value_t = 1000)]
slot_length: u64, slot_length: u64,
#[clap(long)]
/// Time of shelley hardfork
#[clap(long, default_value_t = 1596059091000)]
zero_time: u64, zero_time: u64,
#[clap(long)]
/// Slot number at the start of the shelley hardfork
#[clap(long, default_value_t = 4492800)]
zero_slot: u64, zero_slot: u64,
}, },
} }

View File

@ -1,5 +1,9 @@
use std::{fmt::Write as _, fs}; use std::{fmt::Write as _, fs};
use pallas_primitives::{
babbage::{TransactionInput, TransactionOutput},
Fragment,
};
use pallas_traverse::{Era, MultiEraTx}; use pallas_traverse::{Era, MultiEraTx};
use uplc::{ use uplc::{
ast::{DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term}, ast::{DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term},
@ -23,27 +27,48 @@ fn main() -> anyhow::Result<()> {
TxCommand::Simulate { TxCommand::Simulate {
input, input,
cbor, cbor,
resolved_inputs, raw_inputs,
raw_outputs,
slot_length, slot_length,
zero_time, zero_time,
zero_slot, zero_slot,
} => { } => {
let tx_bytes = if cbor { let (tx_bytes, inputs_bytes, outputs_bytes) = if cbor {
fs::read(input)? (
fs::read(input)?,
fs::read(raw_inputs)?,
fs::read(raw_outputs)?,
)
} else { } else {
let cbor_hex = fs::read_to_string(input)?; let cbor_hex = fs::read_to_string(input)?;
let inputs_hex = fs::read_to_string(raw_inputs)?;
let outputs_hex = fs::read_to_string(raw_outputs)?;
hex::decode(cbor_hex.trim())? (
hex::decode(cbor_hex.trim())?,
hex::decode(inputs_hex.trim())?,
hex::decode(outputs_hex.trim())?,
)
}; };
let tx = MultiEraTx::decode(Era::Babbage, &tx_bytes) let tx = MultiEraTx::decode(Era::Babbage, &tx_bytes)
.or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes))?; .or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes))?;
let inputs = Vec::<TransactionInput>::decode_fragment(&inputs_bytes).unwrap();
let outputs = Vec::<TransactionOutput>::decode_fragment(&outputs_bytes).unwrap();
let resolved_inputs: Vec<ResolvedInput> = inputs
.iter()
.zip(outputs.iter())
.map(|(input, output)| ResolvedInput {
input: input.clone(),
output: output.clone(),
})
.collect();
println!("Simulating: {}", tx.hash()); println!("Simulating: {}", tx.hash());
if let Some(tx_babbage) = tx.as_babbage() { if let Some(tx_babbage) = tx.as_babbage() {
let resolved_inputs = ResolvedInput::from_json(&resolved_inputs)?;
let slot_config = SlotConfig { let slot_config = SlotConfig {
zero_time, zero_time,
zero_slot, zero_slot,
@ -61,11 +86,18 @@ fn main() -> anyhow::Result<()> {
match result { match result {
Ok(redeemers) => { Ok(redeemers) => {
println!("\nResult\n------\n\n"); println!("\nTotal Budget Used\n-----------------\n");
for redeemer in redeemers { let total_budget_used = redeemers.iter().fold(
println!("{:#?}", redeemer) 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,
},
);
println!("mem: {}", total_budget_used.mem);
println!("cpu: {}", total_budget_used.cpu);
} }
Err(err) => { Err(err) => {
eprintln!("\nError\n-----\n\n{}\n", err); eprintln!("\nError\n-----\n\n{}\n", err);

View File

@ -1,5 +1,3 @@
use std::{fs::File, io::BufReader, path::PathBuf};
use pallas_codec::utils::KeyValuePairs; use pallas_codec::utils::KeyValuePairs;
use pallas_crypto::hash::Hash; use pallas_crypto::hash::Hash;
use pallas_primitives::babbage::{ use pallas_primitives::babbage::{
@ -16,26 +14,6 @@ pub struct ResolvedInput {
pub output: TransactionOutput, pub output: TransactionOutput,
} }
#[derive(thiserror::Error, Debug)]
pub enum Error {
#[error("{0}")]
File(#[from] std::io::Error),
#[error("{0}")]
Serde(#[from] serde_json::error::Error),
}
impl ResolvedInput {
pub fn from_json(file: &PathBuf) -> Result<Vec<Self>, Error> {
let file = File::open(file)?;
let reader = BufReader::new(file);
let resolved_inputs: Vec<ResolvedInput> = serde_json::from_reader(reader)?;
Ok(resolved_inputs)
}
}
#[derive(Debug, PartialEq, Clone)] #[derive(Debug, PartialEq, Clone)]
pub struct TxInInfo { pub struct TxInInfo {
pub out_ref: TransactionInput, pub out_ref: TransactionInput,

File diff suppressed because one or more lines are too long

View File

@ -1,4 +0,0 @@
[
{"input":{"tx_hash":"71b02d2309057ca589878c02ef9f89ca2a911f4282bef459a44b035deee292f0","index":0},"output":{"address":"addr1zxj47sy4qxlktqzmkrw8dahe46gtv8seakrshsqz26qnvzypw288a4x0xf8pxgcntelxmyclq83s0ykeehchz2wtspksr3q9nx","value":[1724100,{"deebf749dd081b3aea1c59ef2a1be1038d61a0c7398de15c310244be": {"54455354544f4b454e313631": 1}}],"datum":{"datum_hash": "d908988cd6197fb46e9711a8e84eda57e1b134b0e0fe11ea7e9cdc6e3d484189"}}},
{"input":{"tx_hash":"ba68b9076c6c34666d5a554d7cd0fdffacc1c38d86cd37ff5c565d77a1ce2fd0","index":0},"output":{"address":"addr1qxpct7l5e9gmtlt73uz9000y08yelyg0tdcqdc9ykle7w98vqctk0alpkvrf7l226m8djg05lusu74uvx69hp6ve808qxc39wj","value":[5000000,{}]}}
]