Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: integration to preprod and preview networks #422

Merged
merged 7 commits into from
Apr 1, 2024
6 changes: 5 additions & 1 deletion pallas-applying/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Pallas Applying

Crate for performing transaction validation according to the Cardano protocol.
Crate for performing transaction validation according to the Cardano protocol. Generally speaking, this crate is structured in multiple modules, each one handling a specific Cardano era. These eras are: Byron, ShelleyMA, Alonzo and Babbage.

Refer to *docs/<era>.md* to see the mathematical specifications regarding *<era>*.

Refer to *tests/README.md* for explanations regarding the test suite in any era.
2 changes: 2 additions & 0 deletions pallas-applying/src/alonzo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -897,6 +897,8 @@ fn compute_script_integrity_hash(plutus_data: &[PlutusData], redeemer: &[Redeeme
}

fn cost_model_cbor() -> Vec<u8> {
// Mainnet, preprod and preview all have the same cost model during the Alonzo
// era.
hex::decode(
"a141005901d59f1a000302590001011a00060bc719026d00011a000249f01903e800011a000249f018201a0025cea81971f70419744d186419744d186419744d186419744d186419744d186419744d18641864186419744d18641a000249f018201a000249f018201a000249f018201a000249f01903e800011a000249f018201a000249f01903e800081a000242201a00067e2318760001011a000249f01903e800081a000249f01a0001b79818f7011a000249f0192710011a0002155e19052e011903e81a000249f01903e8011a000249f018201a000249f018201a000249f0182001011a000249f0011a000249f0041a000194af18f8011a000194af18f8011a0002377c190556011a0002bdea1901f1011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000242201a00067e23187600010119f04c192bd200011a000249f018201a000242201a00067e2318760001011a000242201a00067e2318760001011a0025cea81971f704001a000141bb041a000249f019138800011a000249f018201a000302590001011a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a000249f018201a00330da70101ff"
).unwrap()
Expand Down
269 changes: 215 additions & 54 deletions pallas-applying/src/babbage.rs

Large diffs are not rendered by default.

11 changes: 8 additions & 3 deletions pallas-applying/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,14 @@ pub fn validate(metx: &MultiEraTx, utxos: &UTxOs, env: &Environment) -> Validati
_ => Err(TxAndProtParamsDiffer),
},
MultiEraProtParams::Babbage(bpp) => match metx {
MultiEraTx::Babbage(mtx) => {
validate_babbage_tx(mtx, utxos, bpp, env.block_slot(), env.network_id())
}
MultiEraTx::Babbage(mtx) => validate_babbage_tx(
mtx,
utxos,
bpp,
env.block_slot(),
env.prot_magic(),
env.network_id(),
),
_ => Err(TxAndProtParamsDiffer),
},
}
Expand Down
6 changes: 3 additions & 3 deletions pallas-applying/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,8 @@ pub fn get_lovelace_from_alonzo_val(val: &Value) -> Coin {

pub fn get_network_id_value(network_id: NetworkId) -> u8 {
match network_id {
NetworkId::One => 1,
NetworkId::Two => 2,
NetworkId::One => 0,
NetworkId::Two => 1,
}
}

Expand Down Expand Up @@ -333,6 +333,6 @@ pub fn compute_plutus_script_hash(script: &PlutusScript) -> PolicyId {

pub fn compute_plutus_v2_script_hash(script: &PlutusV2Script) -> PolicyId {
let mut payload: Vec<u8> = Vec::from(script.as_ref());
payload.insert(0, 1);
payload.insert(0, 2);
pallas_crypto::hash::Hasher::<224>::hash(&payload)
}
4 changes: 3 additions & 1 deletion pallas-applying/tests/alonzo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1247,7 +1247,9 @@ mod alonzo_tests {
let cbor_bytes: Vec<u8> = cbor_to_bytes(include_str!("../../test_data/alonzo1.tx"));
let mut mtx: MintedTx = minted_tx_from_cbor(&cbor_bytes);
let mut tx_body: TransactionBody = (*mtx.transaction_body).clone();
tx_body.network_id = Some(NetworkId::Two);
// Note that NetworkId::One maps to 0 through
// crate::utils::get_network_id_value, which is not correct in mainnet.
tx_body.network_id = Some(NetworkId::One);
let mut tx_buf: Vec<u8> = Vec::new();
let _ = encode(tx_body, &mut tx_buf);
mtx.transaction_body =
Expand Down
181 changes: 180 additions & 1 deletion pallas-applying/tests/babbage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,183 @@ mod babbage_tests {
}
}

#[test]
// Transaction hash:
// 69d925ee5327bf98cbea8cb3aee3274abb5053d10bf2c51a4fd018f15904ec8e
fn successful_preview_tx_with_plutus_v2_script() {
let cbor_bytes: Vec<u8> = cbor_to_bytes(include_str!("../../test_data/babbage12.tx"));
let mtx: MintedTx = babbage_minted_tx_from_cbor(&cbor_bytes);
let metx: MultiEraTx = MultiEraTx::from_babbage(&mtx);
let tx_outs_info: &[(
String,
Value,
Option<MintedDatumOption>,
Option<CborWrap<MintedScriptRef>>,
)] = &[
(
String::from("60b5f82aaebdc942bb0c8774dc712338b82e5133fe69ebbc3b6312098e"),
Value::Coin(20000000),
None,
None,
),
(
String::from("708D73F125395466F1D68570447E4F4B87CD633C6728F3802B2DCFCA20"),
Value::Multiasset(
2000000,
KeyValuePairs::from(Vec::from([(
"7F5AC1926607F0D6C000E088CEA67A1EDFDF5CB21F8B7F73412319B0"
.parse()
.unwrap(),
KeyValuePairs::from(Vec::from([(
Bytes::from(
hex::decode(
"B5F82AAEBDC942BB0C8774DC712338B82E5133FE69EBBC3B6312098E",
)
.unwrap(),
),
1,
)])),
)])),
),
Some(PseudoDatumOption::Hash(
hex::decode("923918E403BF43C34B4EF6B48EB2EE04BABED17320D8D1B9FF9AD086E86F44EC")
.unwrap()
.as_slice()
.into(),
)),
None,
),
];
let mut utxos: UTxOs = mk_utxo_for_babbage_tx(&mtx.transaction_body, tx_outs_info);
let collateral_info: &[(
String,
Value,
Option<MintedDatumOption>,
Option<CborWrap<MintedScriptRef>>,
)] = &[(
String::from("60b5f82aaebdc942bb0c8774dc712338b82e5133fe69ebbc3b6312098e"),
Value::Coin(20000000),
None,
None,
)];
add_collateral_babbage(&mtx.transaction_body, &mut utxos, collateral_info);
let env: Environment = Environment {
prot_params: MultiEraProtParams::Babbage(BabbageProtParams {
fee_policy: FeePolicy {
summand: 155381,
multiplier: 44,
},
max_tx_size: 16384,
max_block_ex_mem: 62000000,
max_block_ex_steps: 40000000000,
max_tx_ex_mem: 14000000,
max_tx_ex_steps: 10000000000,
max_val_size: 5000,
collateral_percent: 150,
max_collateral_inputs: 3,
coins_per_utxo_word: 4310,
}),
prot_magic: 2,
block_slot: 2592005,
network_id: 0,
};
match validate(&metx, &utxos, &env) {
Ok(()) => (),
Err(err) => assert!(false, "Unexpected error ({:?})", err),
}
}

#[test]
// Transaction hash:
// 1825d08e4496cca673fd9e47898b92cf97fdc293a40cf5cff99c5b123b364384
fn successful_preprod_tx_with_plutus_v2_script() {
let cbor_bytes: Vec<u8> = cbor_to_bytes(include_str!("../../test_data/babbage13.tx"));
let mtx: MintedTx = babbage_minted_tx_from_cbor(&cbor_bytes);
let metx: MultiEraTx = MultiEraTx::from_babbage(&mtx);
let plutus_data_cbor: Vec<u8> = hex::decode(
"D8799FD8799F1A1DCD650019300BFF1B0000018B2B449D97581C28B3E2B8259FAABB566361635C4F8BBF31FE1388B15565F917C33C85FF"
).unwrap();
let tx_outs_info: &[(
String,
Value,
Option<MintedDatumOption>,
Option<CborWrap<MintedScriptRef>>,
)] = &[
(
String::from("30DAB18165AE50399C5E477E0CFB38D0B35B32C75F7EB150EBC7874A5EDAB18165AE50399C5E477E0CFB38D0B35B32C75F7EB150EBC7874A5E"),
Value::Multiasset(
2000000,
KeyValuePairs::from(Vec::from([(
"CCFC2EFE9C1C360EF60D7D2E35CDD359FAD373A62A8905345F8A8BC4"
.parse()
.unwrap(),
KeyValuePairs::from(Vec::from([(
Bytes::from(
hex::decode(
"4F7261636C65546872656164546F6B656E",
)
.unwrap(),
),
1,
)])),
)])),
),
Some(PseudoDatumOption::Data(
CborWrap(
KeepRaw::<PlutusData>::decode(
&mut Decoder::new(&plutus_data_cbor),
&mut (),
).unwrap(),
)
)),
None,
),
(
String::from("0028B3E2B8259FAABB566361635C4F8BBF31FE1388B15565F917C33C85700D57DE08040F55793195E7ED87E693DBFCF4A62CF3597B1BC93567"),
Value::Coin(86112645),
None,
None,
),
];
let mut utxos: UTxOs = mk_utxo_for_babbage_tx(&mtx.transaction_body, tx_outs_info);
let collateral_info: &[(
String,
Value,
Option<MintedDatumOption>,
Option<CborWrap<MintedScriptRef>>,
)] = &[(
String::from("0028B3E2B8259FAABB566361635C4F8BBF31FE1388B15565F917C33C85700D57DE08040F55793195E7ED87E693DBFCF4A62CF3597B1BC93567"),
Value::Coin(70884589),
None,
None,
)];
add_collateral_babbage(&mtx.transaction_body, &mut utxos, collateral_info);
let env: Environment = Environment {
prot_params: MultiEraProtParams::Babbage(BabbageProtParams {
fee_policy: FeePolicy {
summand: 155381,
multiplier: 44,
},
max_tx_size: 16384,
max_block_ex_mem: 62000000,
max_block_ex_steps: 40000000000,
max_tx_ex_mem: 14000000,
max_tx_ex_steps: 10000000000,
max_val_size: 5000,
collateral_percent: 150,
max_collateral_inputs: 3,
coins_per_utxo_word: 4310,
}),
prot_magic: 1,
block_slot: 41558438,
network_id: 0,
};
match validate(&metx, &utxos, &env) {
Ok(()) => (),
Err(err) => assert!(false, "Unexpected error ({:?})", err),
}
}

#[test]
// Transaction hash:
// 8702b0a5835c16663101f68295e33e3b3868c487f736d3c8a0a4246242675a15
Expand Down Expand Up @@ -1523,7 +1700,9 @@ mod babbage_tests {
)];
let utxos: UTxOs = mk_utxo_for_babbage_tx(&mtx.transaction_body, tx_outs_info);
let mut tx_body: MintedTransactionBody = (*mtx.transaction_body).clone();
tx_body.network_id = Some(NetworkId::Two);
// Note that NetworkId::One maps to 0 through
// crate::utils::get_network_id_value, which is not correct in mainnet.
tx_body.network_id = Some(NetworkId::One);
let mut tx_buf: Vec<u8> = Vec::new();
let _ = encode(tx_body, &mut tx_buf);
mtx.transaction_body =
Expand Down