Skip to content

Commit

Permalink
feat(traverse): improve protocol update access
Browse files Browse the repository at this point in the history
  • Loading branch information
scarmuega committed Dec 14, 2023
1 parent b4b7b93 commit 603df5d
Show file tree
Hide file tree
Showing 7 changed files with 207 additions and 10 deletions.
10 changes: 5 additions & 5 deletions pallas-configs/src/shelley.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ pub struct ProtocolParams {
pub decentralisation_param: Option<u32>,
pub e_max: Option<u32>,
pub extra_entropy: Option<ExtraEntropy>,
pub max_tx_size: Option<u32>,
pub max_tx_size: u64,
pub max_block_body_size: Option<u32>,
pub max_block_header_size: Option<u32>,
pub min_fee_a: Option<u32>,
pub min_fee_b: Option<u32>,
pub min_u_tx_o_value: Option<u32>,
pub min_fee_a: u64,
pub min_fee_b: u64,
pub min_u_tx_o_value: u64,
pub pool_deposit: Option<u64>,
pub min_pool_cost: Option<u64>,
pub key_deposit: Option<u32>,
Expand Down Expand Up @@ -61,7 +61,7 @@ pub struct GenesisFile {
pub max_lovelace_supply: Option<u64>,
pub network_id: Option<String>,
pub network_magic: Option<u32>,
pub protocol_params: Option<ProtocolParams>,
pub protocol_params: ProtocolParams,
pub security_param: Option<u32>,
pub slot_length: Option<u32>,
pub slots_per_kes_period: Option<u32>,
Expand Down
1 change: 1 addition & 0 deletions pallas-primitives/src/byron/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -860,6 +860,7 @@ mod tests {
include_str!("../../../test_data/byron5.block"),
include_str!("../../../test_data/byron6.block"),
include_str!("../../../test_data/byron7.block"),
include_str!("../../../test_data/byron8.block"),
];

for (idx, block_str) in test_blocks.iter().enumerate() {
Expand Down
1 change: 1 addition & 0 deletions pallas-traverse/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ pallas-crypto = { version = "=0.20.0", path = "../pallas-crypto" }
pallas-codec = { version = "=0.20.0", path = "../pallas-codec" }
hex = "0.4.3"
thiserror = "1.0.31"
paste = "1.0.14"

# TODO: remove once GenesisValue moves into new genesis crate
serde = "1.0.155"
Expand Down
26 changes: 24 additions & 2 deletions pallas-traverse/src/block.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
use std::borrow::Cow;
use std::{borrow::Cow, ops::Deref};

use pallas_codec::minicbor;
use pallas_crypto::hash::Hash;
use pallas_primitives::{alonzo, babbage, byron, conway};

use crate::{probe, support, Era, Error, MultiEraBlock, MultiEraHeader, MultiEraTx};
use crate::{
probe, support, Era, Error, MultiEraBlock, MultiEraHeader, MultiEraTx, MultiEraUpdate,
};

type BlockWrapper<T> = (u16, T);

Expand Down Expand Up @@ -174,6 +176,26 @@ impl<'b> MultiEraBlock<'b> {
}
}

/// Returns any block-level param update proposals (byron-specific)
pub fn update(&self) -> Option<MultiEraUpdate> {
match self {
MultiEraBlock::Byron(x) => {
if let Some(up) = x.body.upd_payload.proposal.deref() {
// TODO: this might be horribly wrong, I'm assuming that the activation epoch
// for a Byron upgrade proposal is always current epoch + 1.
let epoch = x.header.consensus_data.0.epoch + 1;
Some(MultiEraUpdate::Byron(
epoch,
Box::new(Cow::Owned(up.clone())),
))
} else {
None
}
}
_ => None,
}
}

pub fn as_alonzo(&self) -> Option<&alonzo::MintedBlock> {
match self {
MultiEraBlock::AlonzoCompatible(x, _) => Some(x),
Expand Down
1 change: 1 addition & 0 deletions pallas-traverse/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ pub enum MultiEraWithdrawals<'b> {
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum MultiEraUpdate<'b> {
Byron(u64, Box<Cow<'b, byron::UpProp>>),
AlonzoCompatible(Box<Cow<'b, alonzo::Update>>),
Babbage(Box<Cow<'b, babbage::Update>>),
}
Expand Down
177 changes: 174 additions & 3 deletions pallas-traverse/src/update.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,92 @@
use std::borrow::Cow;
use pallas_codec::minicbor;
use paste::paste;
use std::{borrow::Cow, ops::Deref};

use pallas_primitives::{alonzo, babbage};
use pallas_primitives::{alonzo, babbage, byron};

use crate::MultiEraUpdate;
macro_rules! param_boilerplate {
($name:ident: $type_:ty, [$($variant:tt)*]) => {
paste! {
pub fn [<"first_proposed_" $name>](&self) -> Option<$type_> {
#[allow(unreachable_patterns)]
match self {
$(
MultiEraUpdate::$variant(x) => x
.proposed_protocol_parameter_updates
.first()
.and_then(|x| x.1.$name.clone()),
)*

_ => None,
}
}
}

paste! {
pub fn [<"all_proposed_" $name>](&self) -> Vec<$type_> {
#[allow(unreachable_patterns)]
match self {
$(
MultiEraUpdate::$variant(x) => x
.proposed_protocol_parameter_updates
.iter()
.map(|x| x.1.$name.clone())
.flatten()
.collect::<Vec<_>>(),
)*

_ => vec![],
}
}
}
};
}

pub type RationalNumber = alonzo::RationalNumber;
pub type UnitInterval = alonzo::UnitInterval;
pub type Nonce = alonzo::Nonce;
pub type ExUnitPrices = alonzo::ExUnitPrices;
pub type ExUnits = alonzo::ExUnits;
pub type CostMdls = alonzo::CostMdls;
pub type ProtocolVersion = alonzo::ProtocolVersion;

use crate::{Era, MultiEraUpdate};

impl<'b> MultiEraUpdate<'b> {
pub fn decode_for_era(era: Era, cbor: &'b [u8]) -> Result<Self, minicbor::decode::Error> {
match era {
Era::Byron => {
let (epoch, up) = minicbor::decode(cbor)?;
let up = Box::new(Cow::Owned(up));
Ok(MultiEraUpdate::Byron(epoch, up))
}
Era::Shelley | Era::Allegra | Era::Mary | Era::Alonzo => {
let up = minicbor::decode(cbor)?;
let up = Box::new(Cow::Owned(up));
Ok(MultiEraUpdate::AlonzoCompatible(up))
}
Era::Babbage => {
let up = minicbor::decode(cbor)?;
let up = Box::new(Cow::Owned(up));
Ok(MultiEraUpdate::Babbage(up))
}
_ => unimplemented!("unimplemented era"),
}
}

pub fn encode(&self) -> Vec<u8> {
// to_vec is infallible
match self {
MultiEraUpdate::AlonzoCompatible(x) => minicbor::to_vec(x).unwrap(),
MultiEraUpdate::Babbage(x) => minicbor::to_vec(x).unwrap(),
MultiEraUpdate::Byron(a, b) => minicbor::to_vec((a, b)).unwrap(),
}
}

pub fn from_byron(epoch: u64, update: &'b byron::UpProp) -> Self {
Self::Byron(epoch, Box::new(Cow::Borrowed(update)))
}

pub fn from_alonzo_compatible(update: &'b alonzo::Update) -> Self {
Self::AlonzoCompatible(Box::new(Cow::Borrowed(update)))
}
Expand All @@ -13,6 +95,13 @@ impl<'b> MultiEraUpdate<'b> {
Self::Babbage(Box::new(Cow::Borrowed(update)))
}

pub fn as_byron(&self) -> Option<&byron::UpProp> {
match self {
Self::Byron(_, x) => Some(x),
_ => None,
}
}

pub fn as_alonzo(&self) -> Option<&alonzo::Update> {
match self {
Self::AlonzoCompatible(x) => Some(x),
Expand All @@ -26,4 +115,86 @@ impl<'b> MultiEraUpdate<'b> {
_ => None,
}
}

pub fn epoch(&self) -> u64 {
match self {
MultiEraUpdate::Byron(x, _) => *x,
MultiEraUpdate::AlonzoCompatible(x) => x.epoch,
MultiEraUpdate::Babbage(x) => x.epoch,
}
}

pub fn byron_proposed_fee_policy(&self) -> Option<byron::TxFeePol> {
match self {
MultiEraUpdate::Byron(_, x) => {
x.block_version_mod.as_ref()?.tx_fee_policy.deref().clone()
}
_ => None,
}
}

pub fn byron_proposed_max_tx_size(&self) -> Option<u64> {
match self {
MultiEraUpdate::Byron(_, x) => {
x.block_version_mod.as_ref()?.max_tx_size.deref().clone()

Check failure on line 139 in pallas-traverse/src/update.rs

View workflow job for this annotation

GitHub Actions / Lints

using `clone` on type `Option<u64>` which implements the `Copy` trait
}
_ => None,
}
}

pub fn byron_proposed_block_version(&self) -> Option<(u16, u16, u8)> {
match self {
MultiEraUpdate::Byron(_, x) => x.block_version.clone(),

Check failure on line 147 in pallas-traverse/src/update.rs

View workflow job for this annotation

GitHub Actions / Lints

using `clone` on type `Option<(u16, u16, u8)>` which implements the `Copy` trait
_ => None,
}
}

param_boilerplate!(minfee_a: u32, [AlonzoCompatible Babbage]);

param_boilerplate!(minfee_b: u32, [AlonzoCompatible Babbage]);

param_boilerplate!(max_block_body_size: u32, [AlonzoCompatible Babbage]);

param_boilerplate!(max_transaction_size: u32, [AlonzoCompatible Babbage]);

param_boilerplate!(max_block_header_size: u32, [AlonzoCompatible Babbage]);

param_boilerplate!(key_deposit: u64, [AlonzoCompatible Babbage]);

param_boilerplate!(pool_deposit: u64, [AlonzoCompatible Babbage]);

param_boilerplate!(maximum_epoch: u64, [AlonzoCompatible Babbage]);

param_boilerplate!(desired_number_of_stake_pools: u32, [AlonzoCompatible Babbage]);

param_boilerplate!(pool_pledge_influence: RationalNumber, [AlonzoCompatible Babbage]);

param_boilerplate!(expansion_rate: UnitInterval, [AlonzoCompatible Babbage]);

param_boilerplate!(treasury_growth_rate: UnitInterval, [AlonzoCompatible Babbage]);

param_boilerplate!(decentralization_constant: UnitInterval, [AlonzoCompatible]);

param_boilerplate!(extra_entropy: Nonce, [AlonzoCompatible]);

param_boilerplate!(protocol_version: ProtocolVersion, [AlonzoCompatible Babbage]);

param_boilerplate!(min_pool_cost: u64, [AlonzoCompatible Babbage]);

param_boilerplate!(ada_per_utxo_byte: u64, [AlonzoCompatible Babbage]);

//param_boilerplate!(cost_models_for_script_languages: CostMdls,
// [AlonzoCompatible Babbage]);

param_boilerplate!(execution_costs: ExUnitPrices, [AlonzoCompatible Babbage]);

param_boilerplate!(max_tx_ex_units: ExUnits, [AlonzoCompatible Babbage]);

param_boilerplate!(max_block_ex_units: ExUnits, [AlonzoCompatible Babbage]);

param_boilerplate!(max_value_size: u32, [AlonzoCompatible Babbage]);

param_boilerplate!(collateral_percentage: u32, [AlonzoCompatible Babbage]);

param_boilerplate!(max_collateral_inputs: u32, [AlonzoCompatible Babbage]);
}
1 change: 1 addition & 0 deletions test_data/byron8.block
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
82018385015820fbe86b20620034b5f68978cdd34044d0efda4f4de81578a1c34b22579eb6663d84830058200e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a85820afc0da64183bf2664f3d4eec7238d524ba607faeeab24fc100eb861dba69971b82035820d36a2619a672494604e11bb447cbcf5231e9f2ba25c2169177edc941bd50ad6c5820afc0da64183bf2664f3d4eec7238d524ba607faeeab24fc100eb861dba69971b5820846512c3c2273a4bbb62ad6a50f587fd86bf0178535f76a35d69c7b5c7c835c28482020b5840505b237a1cb140020cc442f6e51c6a0f48ad3344427735a9ad5b755bece8a4ce5bed4f6bbbd00caffcdff6502359a16534ea5182badbcfbaf9b516edf305264a811782028284005840505b237a1cb140020cc442f6e51c6a0f48ad3344427735a9ad5b755bece8a4ce5bed4f6bbbd00caffcdff6502359a16534ea5182badbcfbaf9b516edf305264a58408b0960d234bda67d52432c5d1a26aca2bfb5b9a09f966d9592a7bf0c728a1ecd840eac5c3fe8a7edda024a7403b6d37705990828b3548332a3f850221c2098bf5840633fc347138ee155d038b9d1040ee1e45cea5b1e8627046c95f7fe4ba949b0569437962568eadef9d49e22becbf30192425c008d10e03004612633dbc307340b58405dcbce14f395d166d85218596b4156cd77c7a5b815dd834428d2102ad8e62a2c69b3eb97dd062975a9d009a7cb700e3f7b309e44c82796bb84f5d43ddc6a03038483010000826a63617264616e6f2d736c01a058204ba92aa320c60acc9ad7b9a64f2eda55c4d2ec28e604faf186708b4f0c4e8edf849fff8203d90102809fff828187830200008e8080808080808080808080808080826a63617264616e6f2d736c01a1656c696e757884582003170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c11131458200fd923ca5e7218c4ba3c3801c26a617ecdbfdaebb9c76ce2eca166e7855efbb8582003170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314582003170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314a058408ef320c2df6654a6188c45e9c639c0a686bf5a865295587d399dfeb05fe74ab67961a696b268c8bcec9372bc73aa9b1365ec007b3dfa0539eac00d154a31518c5840b430b0ec0229f81d4e7c1cecaa7a761a39b39ac50ed04836f66ebdd219b9507cf210be70ce4e80dae86537456eda808793b32b996d817f565fba30d02f704d089f8458408ef320c2df6654a6188c45e9c639c0a686bf5a865295587d399dfeb05fe74ab67961a696b268c8bcec9372bc73aa9b1365ec007b3dfa0539eac00d154a31518c58205474e0cf8e8f6b97b6fb962cc1d144c31707279cb655b6f0f83bda64d396fbebf5584033655b54795f33cc91b1ff08e6f993301f4223d55959184e13ecfff0d41048629225acc9429b37413774af239782d1e5132ec16b029478d3dc1dbd61413270098458408b0960d234bda67d52432c5d1a26aca2bfb5b9a09f966d9592a7bf0c728a1ecd840eac5c3fe8a7edda024a7403b6d37705990828b3548332a3f850221c2098bf58205474e0cf8e8f6b97b6fb962cc1d144c31707279cb655b6f0f83bda64d396fbebf55840119fff374eb5bdc63c2e1821d6160148ea32c9fe6fbaefc9c8767b2f3973fd03595e8ea44da35ab93efdc9cddb67a7e4be2572affc3078c4df17e9ce65de5a06845840d4dd69a41071bc2dc8e64a97f4bd6379524ce0c2b665728043a067e34d3e218af89a1e334d87220ac4c94f2bd8f0828804111c4f71985ba665698cbb5db6399258205474e0cf8e8f6b97b6fb962cc1d144c31707279cb655b6f0f83bda64d396fbebf558408d95536d7c13984eb307d252f13e95c5dc25317e411025b24fb07b3e3c6b0b1370ac17cac68be40db4f9925249887886584e524fe9c1af88b17a5cdabd713b01845840618b625df30de53895ff29e7a3770dca56c2ff066d4aa05a6971905deecef6dbb7dd10ea1f9175e5293eadec97bf16b167af379a7b3ed4af032cd07b99ecc1ea58205474e0cf8e8f6b97b6fb962cc1d144c31707279cb655b6f0f83bda64d396fbebf55840f90f110c272bcbd61d1dec1b4b9348dd7effbd545d32abd996c164a82cdd031302187022cda78ab52c0930ecbc05f914c18a26f794985a8aa04c3fdb4715ea028458409aae625d4d15bcb3733d420e064f1cd338f386e0af049fcd42b455a69d28ad366483d177ba2b801b4136e0d6662e5e9e0a24f2c80a0e78d4c235b4c08f201f4c58205474e0cf8e8f6b97b6fb962cc1d144c31707279cb655b6f0f83bda64d396fbebf558403b379b8aa896a3dc67d3e83259d45f854e5a75462f48140095e393c9da7e5c3bc544bf17f8f9a42cf57e5e6ee0c2bcd202c2019e3162305f2b0bed16e0a5ee05845840d1a8de6caa8fd9b175c59862ecdd5abcd0477b84b82a0e52faecc6b3c85100a475216ffb64ea74537021405bb328b0f706e4aad7157795e316781cca120dac9658205474e0cf8e8f6b97b6fb962cc1d144c31707279cb655b6f0f83bda64d396fbebf55840c62e97832e62aabc9aa342c505f1648eac8d48bbbd81501261cbbad9dd2b860d68046c1d43e4c5199057024960404386541ff9d6fc0f29cd7546c85bfd973a05845840942bb3aaab0f6442b906b65ba6ddbf7969caa662d90968926211a3d56532f11d8e8cb4adc3f5034fbc6257fa5b1086689dc7d024df7226aa501fc28eba2d1f6358205474e0cf8e8f6b97b6fb962cc1d144c31707279cb655b6f0f83bda64d396fbebf558403b9fba68276d594824d77948885088c2614d334e7b381579837eea43184151c6f28a1361e706e0898728532f95c37347d53fb0ef340638a7eb9cfdec3622e005ff81a0

0 comments on commit 603df5d

Please sign in to comment.