From 11ff6e09bfef951092653b03f7bece3cf0265154 Mon Sep 17 00:00:00 2001 From: Santiago Carmuega Date: Thu, 23 Jan 2025 16:31:28 -0300 Subject: [PATCH] feat: use hacks to keep gov action pparams updated (#436) --- Cargo.lock | 36 ++++++++++---------- src/ledger/mod.rs | 5 +-- src/ledger/pparams/hacks/mainnet_epoch526.rs | 34 ++++++++++++++++++ src/ledger/pparams/hacks/mod.rs | 23 +++++++++++++ src/ledger/pparams/hacks/preprod_epoch191.rs | 34 ++++++++++++++++++ src/ledger/pparams/hacks/preview_epoch736.rs | 34 ++++++++++++++++++ src/ledger/pparams/mod.rs | 25 ++++++++++++++ src/ledger/pparams/summary.rs | 18 ++++++++++ src/mempool.rs | 12 +++++-- src/serve/grpc/query.rs | 2 +- 10 files changed, 200 insertions(+), 23 deletions(-) create mode 100644 src/ledger/pparams/hacks/mainnet_epoch526.rs create mode 100644 src/ledger/pparams/hacks/mod.rs create mode 100644 src/ledger/pparams/hacks/preprod_epoch191.rs create mode 100644 src/ledger/pparams/hacks/preview_epoch736.rs diff --git a/Cargo.lock b/Cargo.lock index 8ec3955..8107b52 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -365,7 +365,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" dependencies = [ "bitcoin_hashes 0.11.0", - "rand_core 0.5.1", + "rand_core 0.6.4", "serde", "unicode-normalization", ] @@ -2239,7 +2239,7 @@ checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f" [[package]] name = "pallas" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "pallas-addresses 0.32.0", "pallas-applying", @@ -2273,7 +2273,7 @@ dependencies = [ [[package]] name = "pallas-addresses" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "base58", "bech32 0.9.1", @@ -2288,7 +2288,7 @@ dependencies = [ [[package]] name = "pallas-applying" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "chrono", "hex", @@ -2316,7 +2316,7 @@ dependencies = [ [[package]] name = "pallas-codec" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "hex", "minicbor", @@ -2327,7 +2327,7 @@ dependencies = [ [[package]] name = "pallas-configs" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "base64 0.22.1", "hex", @@ -2359,7 +2359,7 @@ dependencies = [ [[package]] name = "pallas-crypto" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "cryptoxide", "hex", @@ -2387,7 +2387,7 @@ dependencies = [ [[package]] name = "pallas-hardano" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "binary-layout", "pallas-network 0.32.0", @@ -2418,7 +2418,7 @@ dependencies = [ [[package]] name = "pallas-network" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "byteorder", "hex", @@ -2451,7 +2451,7 @@ dependencies = [ [[package]] name = "pallas-primitives" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "base58", "bech32 0.9.1", @@ -2483,7 +2483,7 @@ dependencies = [ [[package]] name = "pallas-traverse" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "hex", "itertools 0.13.0", @@ -2499,7 +2499,7 @@ dependencies = [ [[package]] name = "pallas-txbuilder" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "hex", "pallas-addresses 0.32.0", @@ -2516,7 +2516,7 @@ dependencies = [ [[package]] name = "pallas-utxorpc" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "pallas-applying", "pallas-codec 0.32.0", @@ -2530,7 +2530,7 @@ dependencies = [ [[package]] name = "pallas-wallet" version = "0.32.0" -source = "git+https://github.com/txpipe/pallas.git#305c5c562285b5a6b81e91eba18e72444481bd23" +source = "git+https://github.com/txpipe/pallas.git#f53ecb3d80d3cf1a70a0330df65e3baf2ed5c0fe" dependencies = [ "bech32 0.9.1", "bip39", @@ -2748,7 +2748,7 @@ checksum = "5bb182580f71dd070f88d01ce3de9f4da5021db7115d2e1c3605a754153b77c1" dependencies = [ "bytes", "heck", - "itertools 0.12.1", + "itertools 0.13.0", "log", "multimap", "once_cell", @@ -2781,7 +2781,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.13.0", "proc-macro2", "quote", "syn", @@ -4247,9 +4247,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "utxorpc-spec" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c73cb3e15766a14cbc99fbd6dbbee04496fc9c64b47b088ae1d7698d43e357" +checksum = "7148c5cd211c397a41245cfbd8d4cb8371d748ed5e3cf131ebcd9cacfa794206" dependencies = [ "bytes", "futures-core", diff --git a/src/ledger/mod.rs b/src/ledger/mod.rs index 79e971b..98a2f43 100644 --- a/src/ledger/mod.rs +++ b/src/ledger/mod.rs @@ -1,3 +1,4 @@ +use pallas::ledger::primitives::conway::GovAction; use pallas::ledger::traverse::{Era, MultiEraBlock, MultiEraInput, MultiEraUpdate}; use pallas::{crypto::hash::Hash, ledger::traverse::MultiEraOutput}; use pparams::Genesis; @@ -119,8 +120,8 @@ pub struct LedgerDelta { /// higher-layers to retry the logic if required. /// /// This method assumes that the block has already been validated, it will -/// return an error if any of the assumed invariant have been broken in the -/// process of computing the delta, but it own't provide a comprehensive +/// return an error if any of the assumed invariants have been broken in the +/// process of computing the delta, but it doesn't provide a comprehensive /// validation of the ledger rules. pub fn compute_delta( block: &MultiEraBlock, diff --git a/src/ledger/pparams/hacks/mainnet_epoch526.rs b/src/ledger/pparams/hacks/mainnet_epoch526.rs new file mode 100644 index 0000000..a4ced25 --- /dev/null +++ b/src/ledger/pparams/hacks/mainnet_epoch526.rs @@ -0,0 +1,34 @@ +use crate::ledger::pparams::EraSummary; + +pub const SLOT: u64 = 141868807; + +pub fn change(era: &mut EraSummary) { + let costs = vec![ + 100788, 420, 1, 1, 1000, 173, 0, 1, 1000, 59957, 4, 1, 11183, 32, 201305, 8356, 4, 16000, + 100, 16000, 100, 16000, 100, 16000, 100, 16000, 100, 16000, 100, 100, 100, 16000, 100, + 94375, 32, 132994, 32, 61462, 4, 72010, 178, 0, 1, 22151, 32, 91189, 769, 4, 2, 85848, + 123203, 7305, -900, 1716, 549, 57, 85848, 0, 1, 1, 1000, 42921, 4, 2, 24548, 29498, 38, 1, + 898148, 27279, 1, 51775, 558, 1, 39184, 1000, 60594, 1, 141895, 32, 83150, 32, 15299, 32, + 76049, 1, 13169, 4, 22100, 10, 28999, 74, 1, 28999, 74, 1, 43285, 552, 1, 44749, 541, 1, + 33852, 32, 68246, 32, 72362, 32, 7243, 32, 7391, 32, 11546, 32, 85848, 123203, 7305, -900, + 1716, 549, 57, 85848, 0, 1, 90434, 519, 0, 1, 74433, 32, 85848, 123203, 7305, -900, 1716, + 549, 57, 85848, 0, 1, 1, 85848, 123203, 7305, -900, 1716, 549, 57, 85848, 0, 1, 955506, + 213312, 0, 2, 270652, 22588, 4, 1457325, 64566, 4, 20467, 1, 4, 0, 141992, 32, 100788, 420, + 1, 1, 81663, 32, 59498, 32, 20142, 32, 24588, 32, 20744, 32, 25933, 32, 24623, 32, + 43053543, 10, 53384111, 14333, 10, 43574283, 26308, 10, 16000, 100, 16000, 100, 962335, 18, + 2780678, 6, 442008, 1, 52538055, 3756, 18, 267929, 18, 76433006, 8868, 18, 52948122, 18, + 1995836, 36, 3227919, 12, 901022, 1, 166917843, 4307, 36, 284546, 36, 158221314, 26549, 36, + 74698472, 36, 333849714, 1, 254006273, 72, 2174038, 72, 2261318, 64571, 4, 207616, 8310, 4, + 1293828, 28716, 63, 0, 1, 1006041, 43623, 251, 0, 1, 100181, 726, 719, 0, 1, 100181, 726, + 719, 0, 1, 100181, 726, 719, 0, 1, 107878, 680, 0, 1, 95336, 1, 281145, 18848, 0, 1, + 180194, 159, 1, 1, 158519, 8942, 0, 1, 159378, 8813, 0, 1, 107490, 3298, 1, 106057, 655, 1, + 1964219, 24520, 3, + ]; + + match &mut era.pparams { + pallas::applying::MultiEraProtocolParameters::Conway(x) => { + x.cost_models_for_script_languages.plutus_v3 = Some(costs) + } + _ => (), + } +} diff --git a/src/ledger/pparams/hacks/mod.rs b/src/ledger/pparams/hacks/mod.rs new file mode 100644 index 0000000..0cc68be --- /dev/null +++ b/src/ledger/pparams/hacks/mod.rs @@ -0,0 +1,23 @@ +use super::ChainSummary; + +mod mainnet_epoch526; +mod preprod_epoch191; +mod preview_epoch736; + +pub fn mainnet(eras: &mut ChainSummary, current_slot: u64) { + if current_slot >= mainnet_epoch526::SLOT { + eras.apply_hacks(mainnet_epoch526::SLOT, mainnet_epoch526::change); + } +} + +pub fn preprod(eras: &mut ChainSummary, current_slot: u64) { + if current_slot >= preprod_epoch191::SLOT { + eras.apply_hacks(preprod_epoch191::SLOT, preprod_epoch191::change); + } +} + +pub fn preview(eras: &mut ChainSummary, current_slot: u64) { + if current_slot >= preview_epoch736::SLOT { + eras.apply_hacks(preview_epoch736::SLOT, preview_epoch736::change); + } +} diff --git a/src/ledger/pparams/hacks/preprod_epoch191.rs b/src/ledger/pparams/hacks/preprod_epoch191.rs new file mode 100644 index 0000000..b0d5b4b --- /dev/null +++ b/src/ledger/pparams/hacks/preprod_epoch191.rs @@ -0,0 +1,34 @@ +use crate::ledger::pparams::EraSummary; + +pub const SLOT: u64 = 80870419; + +pub fn change(era: &mut EraSummary) { + let costs = vec![ + 100788, 420, 1, 1, 1000, 173, 0, 1, 1000, 59957, 4, 1, 11183, 32, 201305, 8356, 4, 16000, + 100, 16000, 100, 16000, 100, 16000, 100, 16000, 100, 16000, 100, 100, 100, 16000, 100, + 94375, 32, 132994, 32, 61462, 4, 72010, 178, 0, 1, 22151, 32, 91189, 769, 4, 2, 85848, + 123203, 7305, -900, 1716, 549, 57, 85848, 0, 1, 1, 1000, 42921, 4, 2, 24548, 29498, 38, 1, + 898148, 27279, 1, 51775, 558, 1, 39184, 1000, 60594, 1, 141895, 32, 83150, 32, 15299, 32, + 76049, 1, 13169, 4, 22100, 10, 28999, 74, 1, 28999, 74, 1, 43285, 552, 1, 44749, 541, 1, + 33852, 32, 68246, 32, 72362, 32, 7243, 32, 7391, 32, 11546, 32, 85848, 123203, 7305, -900, + 1716, 549, 57, 85848, 0, 1, 90434, 519, 0, 1, 74433, 32, 85848, 123203, 7305, -900, 1716, + 549, 57, 85848, 0, 1, 1, 85848, 123203, 7305, -900, 1716, 549, 57, 85848, 0, 1, 955506, + 213312, 0, 2, 270652, 22588, 4, 1457325, 64566, 4, 20467, 1, 4, 0, 141992, 32, 100788, 420, + 1, 1, 81663, 32, 59498, 32, 20142, 32, 24588, 32, 20744, 32, 25933, 32, 24623, 32, + 43053543, 10, 53384111, 14333, 10, 43574283, 26308, 10, 16000, 100, 16000, 100, 962335, 18, + 2780678, 6, 442008, 1, 52538055, 3756, 18, 267929, 18, 76433006, 8868, 18, 52948122, 18, + 1995836, 36, 3227919, 12, 901022, 1, 166917843, 4307, 36, 284546, 36, 158221314, 26549, 36, + 74698472, 36, 333849714, 1, 254006273, 72, 2174038, 72, 2261318, 64571, 4, 207616, 8310, 4, + 1293828, 28716, 63, 0, 1, 1006041, 43623, 251, 0, 1, 100181, 726, 719, 0, 1, 100181, 726, + 719, 0, 1, 100181, 726, 719, 0, 1, 107878, 680, 0, 1, 95336, 1, 281145, 18848, 0, 1, + 180194, 159, 1, 1, 158519, 8942, 0, 1, 159378, 8813, 0, 1, 107490, 3298, 1, 106057, 655, 1, + 1964219, 24520, 3, + ]; + + match &mut era.pparams { + pallas::applying::MultiEraProtocolParameters::Conway(x) => { + x.cost_models_for_script_languages.plutus_v3 = Some(costs) + } + _ => (), + } +} diff --git a/src/ledger/pparams/hacks/preview_epoch736.rs b/src/ledger/pparams/hacks/preview_epoch736.rs new file mode 100644 index 0000000..346563b --- /dev/null +++ b/src/ledger/pparams/hacks/preview_epoch736.rs @@ -0,0 +1,34 @@ +use crate::ledger::pparams::EraSummary; + +pub const SLOT: u64 = 63590427; + +pub fn change(era: &mut EraSummary) { + let costs = vec![ + 100788, 420, 1, 1, 1000, 173, 0, 1, 1000, 59957, 4, 1, 11183, 32, 201305, 8356, 4, 16000, + 100, 16000, 100, 16000, 100, 16000, 100, 16000, 100, 16000, 100, 100, 100, 16000, 100, + 94375, 32, 132994, 32, 61462, 4, 72010, 178, 0, 1, 22151, 32, 91189, 769, 4, 2, 85848, + 123203, 7305, -900, 1716, 549, 57, 85848, 0, 1, 1, 1000, 42921, 4, 2, 24548, 29498, 38, 1, + 898148, 27279, 1, 51775, 558, 1, 39184, 1000, 60594, 1, 141895, 32, 83150, 32, 15299, 32, + 76049, 1, 13169, 4, 22100, 10, 28999, 74, 1, 28999, 74, 1, 43285, 552, 1, 44749, 541, 1, + 33852, 32, 68246, 32, 72362, 32, 7243, 32, 7391, 32, 11546, 32, 85848, 123203, 7305, -900, + 1716, 549, 57, 85848, 0, 1, 90434, 519, 0, 1, 74433, 32, 85848, 123203, 7305, -900, 1716, + 549, 57, 85848, 0, 1, 1, 85848, 123203, 7305, -900, 1716, 549, 57, 85848, 0, 1, 955506, + 213312, 0, 2, 270652, 22588, 4, 1457325, 64566, 4, 20467, 1, 4, 0, 141992, 32, 100788, 420, + 1, 1, 81663, 32, 59498, 32, 20142, 32, 24588, 32, 20744, 32, 25933, 32, 24623, 32, + 43053543, 10, 53384111, 14333, 10, 43574283, 26308, 10, 16000, 100, 16000, 100, 962335, 18, + 2780678, 6, 442008, 1, 52538055, 3756, 18, 267929, 18, 76433006, 8868, 18, 52948122, 18, + 1995836, 36, 3227919, 12, 901022, 1, 166917843, 4307, 36, 284546, 36, 158221314, 26549, 36, + 74698472, 36, 333849714, 1, 254006273, 72, 2174038, 72, 2261318, 64571, 4, 207616, 8310, 4, + 1293828, 28716, 63, 0, 1, 1006041, 43623, 251, 0, 1, 100181, 726, 719, 0, 1, 100181, 726, + 719, 0, 1, 100181, 726, 719, 0, 1, 107878, 680, 0, 1, 95336, 1, 281145, 18848, 0, 1, + 180194, 159, 1, 1, 158519, 8942, 0, 1, 159378, 8813, 0, 1, 107490, 3298, 1, 106057, 655, 1, + 1964219, 24520, 3, + ]; + + match &mut era.pparams { + pallas::applying::MultiEraProtocolParameters::Conway(x) => { + x.cost_models_for_script_languages.plutus_v3 = Some(costs) + } + _ => (), + } +} diff --git a/src/ledger/pparams/mod.rs b/src/ledger/pparams/mod.rs index 100e2e9..01a30c8 100644 --- a/src/ledger/pparams/mod.rs +++ b/src/ledger/pparams/mod.rs @@ -11,6 +11,7 @@ use pallas::{ }; use tracing::{debug, trace, warn}; +mod hacks; mod summary; pub use summary::*; @@ -522,6 +523,30 @@ pub fn fold(genesis: &Genesis, updates: &[MultiEraUpdate]) -> ChainSummary { summary } +/// Fold pparams, applying hacks as necessary +/// +/// Until we have all of the governance-related logic in place, there's no way +/// to keep pparams updated. While we implement this, we'll just apply the hacks +/// manually. Hacks are available in `hacks` folder. +pub fn fold_with_hacks( + genesis: &Genesis, + updates: &[MultiEraUpdate], + current_slot: u64, +) -> ChainSummary { + let mut summary = fold(genesis, updates); + + let network_magic = genesis.shelley.network_magic.unwrap_or_default(); + + match network_magic { + 764824073 => hacks::mainnet(&mut summary, current_slot), + 1 => hacks::preprod(&mut summary, current_slot), + 2 => hacks::preview(&mut summary, current_slot), + _ => (), + } + + summary +} + #[cfg(test)] mod tests { use std::{io::Read, path::Path}; diff --git a/src/ledger/pparams/summary.rs b/src/ledger/pparams/summary.rs index 9458010..7e22185 100644 --- a/src/ledger/pparams/summary.rs +++ b/src/ledger/pparams/summary.rs @@ -135,4 +135,22 @@ impl ChainSummary { .find(|e| slot >= e.start.slot && e.end.as_ref().unwrap().slot > slot) .unwrap() } + + pub(crate) fn apply_hacks(&mut self, epoch: u64, change: F) + where + F: Fn(&mut EraSummary), + { + if epoch >= self.edge().start.epoch { + change(self.edge.as_mut().unwrap()); + } + + let era = self + .past + .iter_mut() + .find(|e| epoch >= e.start.epoch && e.end.as_ref().unwrap().epoch > epoch); + + if let Some(era) = era { + change(era); + } + } } diff --git a/src/mempool.rs b/src/mempool.rs index 6ce0b7b..b3fd16e 100644 --- a/src/mempool.rs +++ b/src/mempool.rs @@ -138,7 +138,11 @@ impl Mempool { let updates: Vec<_> = updates.into_iter().map(TryInto::try_into).try_collect()?; - let eras = crate::ledger::pparams::fold(&self.genesis, &updates); + let eras = crate::ledger::pparams::fold_with_hacks( + &self.genesis, + &updates, + tip.as_ref().unwrap().0, + ); let era = eras.era_for_slot(tip.as_ref().unwrap().0); @@ -187,7 +191,11 @@ impl Mempool { let updates: Vec<_> = updates.into_iter().map(TryInto::try_into).try_collect()?; - let eras = crate::ledger::pparams::fold(&self.genesis, &updates); + let eras = crate::ledger::pparams::fold_with_hacks( + &self.genesis, + &updates, + tip.as_ref().unwrap().0, + ); let slot_config = SlotConfig { slot_length: eras.edge().pparams.slot_length(), diff --git a/src/serve/grpc/query.rs b/src/serve/grpc/query.rs index a7c51c2..b46dbc1 100644 --- a/src/serve/grpc/query.rs +++ b/src/serve/grpc/query.rs @@ -237,7 +237,7 @@ impl u5c::query::query_service_server::QueryService for QueryServiceImpl { .try_collect::<_, _, pallas::codec::minicbor::decode::Error>() .map_err(|e| Status::internal(e.to_string()))?; - let summary = pparams::fold(&self.genesis, &updates); + let summary = pparams::fold_with_hacks(&self.genesis, &updates, tip.as_ref().unwrap().0); let era = summary.era_for_slot(tip.as_ref().unwrap().0);