new tests

This commit is contained in:
alessandrokonrad 2022-09-24 00:43:46 +02:00
parent c45643bb01
commit 99a27f6a3d
2 changed files with 212 additions and 1 deletions

View File

@ -1,5 +1,5 @@
use crate::{ use crate::{
ast::{FakeNamedDeBruijn, NamedDeBruijn, Program}, ast::{DeBruijn, FakeNamedDeBruijn, NamedDeBruijn, Program},
machine::cost_model::ExBudget, machine::cost_model::ExBudget,
PlutusData, PlutusData,
}; };
@ -739,10 +739,15 @@ pub fn eval_redeemer(
prog.into() prog.into()
}; };
let program_flat: Program<DeBruijn> = program.clone().into();
println!("{}", hex::encode(program_flat.to_cbor().unwrap()));
let program = program let program = program
.apply_data(redeemer.data.clone()) .apply_data(redeemer.data.clone())
.apply_data(script_context.to_plutus_data()); .apply_data(script_context.to_plutus_data());
println!("{:#?}", script_context.to_plutus_data());
let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt { let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt {
let costs = if let Some(costs) = &cost_mdls.plutus_v1 { let costs = if let Some(costs) = &cost_mdls.plutus_v1 {
costs costs

View File

@ -1072,6 +1072,212 @@ fn test_eval_5() {
}; };
} }
#[test]
fn test_eval_6() {
/*
Haskell PLC: (_, _)
Aiken PLC: (_,_)
Plutus V1
Helios script:
func main(ctx: ScriptContext) -> Bool {ctx.tx.fee == ctx.tx.fee}
*/
let tx_bytes = hex::decode("84a80082825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b200825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f4000182825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00111958a1581c652cc39999ceb1ddbdd788c3206d70536d84d36f42198296736355efa1400a825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0047acf6021a0002c73209a1581c652cc39999ceb1ddbdd788c3206d70536d84d36f42198296736355efa1400a0b58201ca9076f41fe63a349f05c6346c732fa7f42744e43e0d54f546af0ffc463057f0d81825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b20110825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a054bc2ef111a00042acba30081825820065dd553fbe4e240a8f819bb9e333a7483de4a22b65c7fb6a95ce9450f84dff758402220dcecba177cabf70414676a5b9af9e0d6dec5ce3a7335caef5e4843a2f045995f6e8debbe019d21dcfc8749d780f0cd75c717cfab17ba275702c3aae37309038158235821010000323232223333573460060024931324c4660040020020024466ebc00800410581840100d8798082190fa21a005f14d0f5f6").unwrap();
let raw_inputs = hex::decode("86825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f400825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f401825820cd3589fae0ae4ad33dbc8a8d99b4e99b4a78c2b0473040aab34da8e44fba9fa300825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b200825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b201825820c5bc1437117c200f325467dcede3c09fbfca32f9fe399bd40c778ab2fa832f4301").unwrap();
let raw_outputs = hex::decode("86825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a005da7c4ac581c1e852216c006c55490cd85b6e0ba523a37c2be3526f479e61cca41eba2444e616d6902454e616d693201581c21514b6c51f0aaa0c9c337329ce93c52fad208cfd0b4ccd51074d9dcab4d50494e4b44494e4f4331494439014d50494e4b44494e4f4332494439014d50494e4b44494e4f4333494439014d50494e4b44494e4f4334494439014d50494e4b44494e4f4335494439014d50494e4b44494e4f4336494439014d50494e4b44494e4f4337494439014d50494e4b44494e4f4338494439014d50494e4b44494e4f4339494439014e50494e4b44494e4f433130494439014e50494e4b44494e4f43313149443901581c321668648736a09a40bc3ef5fbd05590530be624e39af84fab3bc6bba84d435033503050726f6d6f333431014f4b696e67447572616e747574323531015053616d757257686950726f6d6f313933015143727970746f6d626f50726f6d6f3134360154536b756c6c62616c6c4c6f676f50726f6d6f35320155536b756c6c62616c6c4c6f676f50726f6d6f33313301581b425345647761726473536c616d6d696e48616e647330303034313201581c42697a61727265537461727344726561646c696f6e526f736533323401581c9ec93fd47d1e43ec5bb5dad70af92b6498b92d20d4325f9027ac4743a1574a6f736570684d6972616e64615754503030353754323601581ca7dc26584358f5ca8d99d7aa646a7b658120296a94588e1cefad8940a157546573744e616d69467269656e645368696e794a50454701581cbc5a0f0f3f1bfa92286410388c54655687bb518f47e12b88c0d0728ca14b566563746f724669656c6401581cc4c00fbd8fa227442a5e7cdecde33b24588494d05a2c50fda8938c6da1444b49445a19c346581cd068fe47123ec4c86460eeb74c7d7765c67d2df295a3ac86d664ed45a156506c757475734669727374436c61737350686f746f3101581cd3b65744dd067fd7103cc6a4019cc9cd5f8627b78174c05dc67a9ad6a1544c696665496e4c6f636b646f776e53314d31503201581cd973d8df645da318bb331dbe4af8eb0270079470225d955c6183445ca15148617070794269727468646179416c657301581cdf9974c2192744f3b6dac92990769fe26c36b0ac8bcc623fb457a45da14d575450303035466c796572323401581cee47c1521b55a006c345f739f084f5c205aeb295e3e42fa66b9d1dd2a151446965666e6643727970746f6e6965726505825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a004c4b40825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a054fedba825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0028a3c6").unwrap();
let inputs = MaybeIndefArray::<TransactionInput>::decode_fragment(&raw_inputs).unwrap();
let outputs = MaybeIndefArray::<TransactionOutput>::decode_fragment(&raw_outputs).unwrap();
let utxos: MaybeIndefArray<ResolvedInput> = MaybeIndefArray::Indef(
inputs
.iter()
.zip(outputs.iter())
.map(|(input, output)| ResolvedInput {
input: input.clone(),
output: output.clone(),
})
.collect(),
);
let slot_config = SlotConfig {
zero_time: 1596059091000, // Mainnet network
slot_length: 1000,
};
let costs: Vec<i64> = vec![
197209, 0, 1, 1, 396231, 621, 0, 1, 150000, 1000, 0, 1, 150000, 32, 2477736, 29175, 4,
29773, 100, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 100, 100, 29773,
100, 150000, 32, 150000, 32, 150000, 32, 150000, 1000, 0, 1, 150000, 32, 150000, 1000, 0,
8, 148000, 425507, 118, 0, 1, 1, 150000, 1000, 0, 8, 150000, 112536, 247, 1, 150000, 10000,
1, 136542, 1326, 1, 1000, 150000, 1000, 1, 150000, 32, 150000, 32, 150000, 32, 1, 1,
150000, 1, 150000, 4, 103599, 248, 1, 103599, 248, 1, 145276, 1366, 1, 179690, 497, 1,
150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 148000, 425507,
118, 0, 1, 1, 61516, 11218, 0, 1, 150000, 32, 148000, 425507, 118, 0, 1, 1, 148000, 425507,
118, 0, 1, 1, 2477736, 29175, 4, 0, 82363, 4, 150000, 5000, 0, 1, 150000, 32, 197209, 0, 1,
1, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32,
3345831, 1, 1,
];
let cost_mdl = CostMdls {
plutus_v1: Some(costs),
plutus_v2: None,
};
let initial_budget = ExBudget {
cpu: 10000000000,
mem: 14000000,
};
let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes)
.or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes))
.unwrap();
match multi_era_tx {
MultiEraTx::Babbage(tx) => {
let redeemers = eval_phase_two(
&tx,
&utxos,
Some(&cost_mdl),
Some(&initial_budget),
&slot_config,
false,
)
.unwrap();
println!("{:?}", redeemers.len());
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,
});
println!("{:?}", total_budget_used);
assert_eq!(
total_budget_used,
// Numbers came uplc evaluate
ExBudget {
cpu: 40211433,
mem: 114126
}
);
}
_ => unreachable!(),
};
}
#[test]
fn test_eval_7() {
/*
Haskell PLC: (_, _)
Aiken PLC: (_,_)
Plutus V1
Helios script:
func main(ctx: ScriptContext) -> Bool {ctx.tx.fee == ctx.tx.fee}
*/
let tx_bytes = hex::decode("84a80082825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b200825820c5bc1437117c200f325467dcede3c09fbfca32f9fe399bd40c778ab2fa832f43010182825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a00111958a1581c366b596f230f1f7002b5a7a63c3fc6be4ef4e3ab81aae50824f78f52a1400a825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0060019e021a0003d41009a1581c366b596f230f1f7002b5a7a63c3fc6be4ef4e3ab81aae50824f78f52a1400a0b58204d87ff063c986ace7ca9fb756623f2125e7270c6934724f4cef6ae181d59cf650d81825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b20110825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a054a2fa2111a0005be18a30081825820065dd553fbe4e240a8f819bb9e333a7483de4a22b65c7fb6a95ce9450f84dff75840bb436c43e52cf56c75c551c65c25b10e6ef864ded07742bc2bca8ee20c29bad00d2016e265d15b614fa486b912443e3206a2ca19cca5d9a7c0ff08124a821f0e038159045a590457010000332232323232323222323232325335001100c1326320083357389201035054350000c3353235001220013553353333333574800846666ae68cdc39aab9d5004480008cccd55cfa8021280791999aab9f500425010233335573e6ae89401494cd54cd4c8c8c8c8c8c8c8c8c8c8c8c8ccccccd5d200611999ab9a3370e6aae7540312000233335573ea0184a04046666aae7d4030940848cccd55cfa8061281111999aab9f500c25023233335573ea0184a04846666aae7d4030940948cccd55cfa8061281311999aab9f500c25027233335573ea0184a05046666aae7d4030940a48cccd55cf9aba2500d2533553355335533553355335533533355025028335502502802735742a028426a05866644444444424666666666600201401201001600e00c00a0080060046ae854060d5d0a80b9aba150161502a213502c300135742a0282a054426a05860026ae85404c540a884d40b0c004d5d0a8090a815109a81618009aba150111502a213502c300135742a0202a054426a05860026ae85403c540a8940a80a009c09809409008c08808408007c0789407c060940789407894078940780704d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aab9e5001137540026ae85401c84d404c848cc00400c00854044854cd4c8c8c8c8ccccccd5d200211999ab9a3370ea004900111999aab9f500425019233335573e6ae89401494cd4c8c8c8c8ccccccd5d200211999ab9a3370e6aae7540112000233335573ea0084a04246666aae7d4010940888cccd55cf9aba25005253353232323333333574800646666ae68cdc39aab9d5003480008cccd55cfa8019281491999aab9f35744a0084a66a60506ae85401484d40b0004540a8940a80a009c940a00849409c9409c9409c9409c0944d55cf280089baa00135742a00e42a66a60426ae85401c84d409848cc00400c008540905408c9408c08408007c940800649407c9407c9407c9407c0744d5d1280089aab9e5001137540026ae85401884d4070488c00400c540689406806005c8cccd5cd19b875003480008cccd55cfa8029280d11999aab9f35744a00c4a66a60326ae85401c84d4074488c00800c5406c9406c064060940640480449405c9405c9405c9405c0544d55cea80109aab9e5001137540026ae85401c84d4050c00800454048540449404403c0380349403801c9403494034940349403402c8448c0040085880048488008984d5d1280089aab9e5001137540029308911911999999aba4001550052533530033756004426a0180022a014aa00aaa00aaa00a010640026460020024464646666aae7c00c8d403448800894cd4c01cd55cea80110a99a98039aab9e500321533530053574400c426a02024466002246600200c00a0062a01c2a01a2a01801426ae84008c00800844940148ccccccd5d200092802928029280291a8031bad002250050032333333357480024a0084a0084a0084a00846a00a6eb80080084800448488c00800c44880050581840100d87980821a0003b9f01a0675391df5f6").unwrap();
let raw_inputs = hex::decode("86825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f400825820a0bfcb30c19402a5bc79ecd33ddea4d67d8d6cb2ebe694c5ac2f14abc47092f401825820cd3589fae0ae4ad33dbc8a8d99b4e99b4a78c2b0473040aab34da8e44fba9fa300825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b200825820f375a19211ee8ce75b8306a2604e2a0e8c50dfae7a103dd3688f980bec5e29b201825820c5bc1437117c200f325467dcede3c09fbfca32f9fe399bd40c778ab2fa832f4301").unwrap();
let raw_outputs = hex::decode("86825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d5821a005da7c4ac581c1e852216c006c55490cd85b6e0ba523a37c2be3526f479e61cca41eba2444e616d6902454e616d693201581c21514b6c51f0aaa0c9c337329ce93c52fad208cfd0b4ccd51074d9dcab4d50494e4b44494e4f4331494439014d50494e4b44494e4f4332494439014d50494e4b44494e4f4333494439014d50494e4b44494e4f4334494439014d50494e4b44494e4f4335494439014d50494e4b44494e4f4336494439014d50494e4b44494e4f4337494439014d50494e4b44494e4f4338494439014d50494e4b44494e4f4339494439014e50494e4b44494e4f433130494439014e50494e4b44494e4f43313149443901581c321668648736a09a40bc3ef5fbd05590530be624e39af84fab3bc6bba84d435033503050726f6d6f333431014f4b696e67447572616e747574323531015053616d757257686950726f6d6f313933015143727970746f6d626f50726f6d6f3134360154536b756c6c62616c6c4c6f676f50726f6d6f35320155536b756c6c62616c6c4c6f676f50726f6d6f33313301581b425345647761726473536c616d6d696e48616e647330303034313201581c42697a61727265537461727344726561646c696f6e526f736533323401581c9ec93fd47d1e43ec5bb5dad70af92b6498b92d20d4325f9027ac4743a1574a6f736570684d6972616e64615754503030353754323601581ca7dc26584358f5ca8d99d7aa646a7b658120296a94588e1cefad8940a157546573744e616d69467269656e645368696e794a50454701581cbc5a0f0f3f1bfa92286410388c54655687bb518f47e12b88c0d0728ca14b566563746f724669656c6401581cc4c00fbd8fa227442a5e7cdecde33b24588494d05a2c50fda8938c6da1444b49445a19c346581cd068fe47123ec4c86460eeb74c7d7765c67d2df295a3ac86d664ed45a156506c757475734669727374436c61737350686f746f3101581cd3b65744dd067fd7103cc6a4019cc9cd5f8627b78174c05dc67a9ad6a1544c696665496e4c6f636b646f776e53314d31503201581cd973d8df645da318bb331dbe4af8eb0270079470225d955c6183445ca15148617070794269727468646179416c657301581cdf9974c2192744f3b6dac92990769fe26c36b0ac8bcc623fb457a45da14d575450303035466c796572323401581cee47c1521b55a006c345f739f084f5c205aeb295e3e42fa66b9d1dd2a151446965666e6643727970746f6e6965726505825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a000f4240825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a004c4b40825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a054fedba825839010af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a0028a3c6").unwrap();
let inputs = MaybeIndefArray::<TransactionInput>::decode_fragment(&raw_inputs).unwrap();
let outputs = MaybeIndefArray::<TransactionOutput>::decode_fragment(&raw_outputs).unwrap();
let utxos: MaybeIndefArray<ResolvedInput> = MaybeIndefArray::Indef(
inputs
.iter()
.zip(outputs.iter())
.map(|(input, output)| ResolvedInput {
input: input.clone(),
output: output.clone(),
})
.collect(),
);
let slot_config = SlotConfig {
zero_time: 1596059091000, // Mainnet network
slot_length: 1000,
};
let costs: Vec<i64> = vec![
197209, 0, 1, 1, 396231, 621, 0, 1, 150000, 1000, 0, 1, 150000, 32, 2477736, 29175, 4,
29773, 100, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 29773, 100, 100, 100, 29773,
100, 150000, 32, 150000, 32, 150000, 32, 150000, 1000, 0, 1, 150000, 32, 150000, 1000, 0,
8, 148000, 425507, 118, 0, 1, 1, 150000, 1000, 0, 8, 150000, 112536, 247, 1, 150000, 10000,
1, 136542, 1326, 1, 1000, 150000, 1000, 1, 150000, 32, 150000, 32, 150000, 32, 1, 1,
150000, 1, 150000, 4, 103599, 248, 1, 103599, 248, 1, 145276, 1366, 1, 179690, 497, 1,
150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 148000, 425507,
118, 0, 1, 1, 61516, 11218, 0, 1, 150000, 32, 148000, 425507, 118, 0, 1, 1, 148000, 425507,
118, 0, 1, 1, 2477736, 29175, 4, 0, 82363, 4, 150000, 5000, 0, 1, 150000, 32, 197209, 0, 1,
1, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32, 150000, 32,
3345831, 1, 1,
];
let cost_mdl = CostMdls {
plutus_v1: Some(costs),
plutus_v2: None,
};
let initial_budget = ExBudget {
cpu: 10000000000,
mem: 14000000,
};
let multi_era_tx = MultiEraTx::decode(Era::Babbage, &tx_bytes)
.or_else(|_| MultiEraTx::decode(Era::Alonzo, &tx_bytes))
.unwrap();
match multi_era_tx {
MultiEraTx::Babbage(tx) => {
let redeemers = eval_phase_two(
&tx,
&utxos,
Some(&cost_mdl),
Some(&initial_budget),
&slot_config,
false,
)
.unwrap();
println!("{:?}", redeemers.len());
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,
});
println!("{:?}", total_budget_used);
assert_eq!(
total_budget_used,
// Numbers came uplc evaluate
ExBudget {
cpu: 40211433,
mem: 114126
}
);
}
_ => unreachable!(),
};
}
#[test] #[test]
fn eval_missing_redeemer() { fn eval_missing_redeemer() {
let tx_bytes = hex::decode("84a30082825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c5000825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c50010181825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02cf47c8021a00028d89a1068149480100002221200101f5f6").unwrap(); let tx_bytes = hex::decode("84a30082825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c5000825820275b5da338c8b899035081eb34bfa950b634911a5dd3271b3ad6cf4c2bba0c50010181825839000af00cc47500bb64cfffb783e8c42f746b4e8b8a70ede9c08c7113acf3bde34d1041f5a2076ef9aa6cf4539ab1a96ed462a0300acbdb65d51a02cf47c8021a00028d89a1068149480100002221200101f5f6").unwrap();