From b1da7bcfc181046e22019f5f7da8745db4ba59f2 Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Mon, 1 Jun 2026 16:38:57 +0200 Subject: [PATCH 1/3] changes to use zombie-bite --- .../core/dispute-coordinator/src/scraping/mod.rs | 4 ++-- .../core/dispute-coordinator/src/scraping/tests.rs | 14 +++++++------- polkadot/node/primitives/src/lib.rs | 13 ++++++++++++- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/polkadot/node/core/dispute-coordinator/src/scraping/mod.rs b/polkadot/node/core/dispute-coordinator/src/scraping/mod.rs index cc4140aca7294..0b41d29c57745 100644 --- a/polkadot/node/core/dispute-coordinator/src/scraping/mod.rs +++ b/polkadot/node/core/dispute-coordinator/src/scraping/mod.rs @@ -315,7 +315,7 @@ impl ChainScraper { pub fn process_finalized_block(&mut self, finalized_block_number: &BlockNumber) { // `DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION - 1` because // `finalized_block_number`counts to the candidate lifetime. - match finalized_block_number.checked_sub(DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION - 1) + match finalized_block_number.checked_sub(*DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION - 1) { Some(key_to_prune) => { self.backed_candidates.remove_up_to_height(&key_to_prune); @@ -393,7 +393,7 @@ impl ChainScraper { { let target_ancestor = get_finalized_block_number(sender) .await? - .saturating_sub(DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION); + .saturating_sub(*DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION); let mut ancestors = Vec::new(); diff --git a/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs b/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs index 380148035b57a..f787b1247fa12 100644 --- a/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs +++ b/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs @@ -428,7 +428,7 @@ fn scraper_requests_candidates_of_non_finalized_ancestors() { &chain, finalized_block_number, BLOCKS_TO_SKIP - - (finalized_block_number - DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION) as usize, /* Expect the provider not to go past finalized block. */ + (finalized_block_number - *DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION) as usize, /* Expect the provider not to go past finalized block. */ get_backed_and_included_candidate_events, ); join(process_active_leaves_update(ctx.sender(), &mut ordering, next_update), overseer_fut) @@ -474,7 +474,7 @@ fn scraper_prunes_finalized_candidates() { // After `DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION` blocks the candidate should be // removed finalized_block_number = - TEST_TARGET_BLOCK_NUMBER + DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION; + TEST_TARGET_BLOCK_NUMBER + *DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION; process_finalized_block(&mut scraper, &finalized_block_number); assert!(!scraper.is_candidate_backed(&candidate.hash())); @@ -533,10 +533,10 @@ fn scraper_handles_backed_but_not_included_candidate() { // The candidate should be removed. assert!( finalized_block_number < - TEST_TARGET_BLOCK_NUMBER + DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION + TEST_TARGET_BLOCK_NUMBER + *DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION ); finalized_block_number += - TEST_TARGET_BLOCK_NUMBER + DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION; + TEST_TARGET_BLOCK_NUMBER + *DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION; process_finalized_block(&mut scraper, &finalized_block_number); assert!(!scraper.is_candidate_included(&candidate.hash())); @@ -584,7 +584,7 @@ fn scraper_handles_the_same_candidate_included_in_two_different_block_heights() // The magic candidate was added twice, so it shouldn't be removed if we finalize two more // blocks. finalized_block_number = test_targets.first().expect("there are two block nums") + - DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION; + *DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION; process_finalized_block(&mut scraper, &finalized_block_number); let magic_candidate = make_candidate_receipt(get_magic_candidate_hash()); @@ -650,7 +650,7 @@ fn inclusions_per_candidate_properly_adds_and_prunes() { // After `DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION` blocks the earlier inclusion should // be removed finalized_block_number = - TEST_TARGET_BLOCK_NUMBER + DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION; + TEST_TARGET_BLOCK_NUMBER + *DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION; process_finalized_block(&mut scraper, &finalized_block_number); // The later inclusion should still be present, as we haven't exceeded its lifetime @@ -663,7 +663,7 @@ fn inclusions_per_candidate_properly_adds_and_prunes() { ); finalized_block_number = - TEST_TARGET_BLOCK_NUMBER_2 + DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION; + TEST_TARGET_BLOCK_NUMBER_2 + *DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION; process_finalized_block(&mut scraper, &finalized_block_number); // Now both inclusions have exceeded their lifetimes after finalization and should be purged diff --git a/polkadot/node/primitives/src/lib.rs b/polkadot/node/primitives/src/lib.rs index 3e34c3b40332c..bb475590b1054 100644 --- a/polkadot/node/primitives/src/lib.rs +++ b/polkadot/node/primitives/src/lib.rs @@ -23,6 +23,8 @@ #![deny(missing_docs)] use std::pin::Pin; +use std::sync::LazyLock; +use std::env::var; use bounded_vec::BoundedVec; use codec::{Decode, Encode, Error as CodecError, Input}; @@ -100,7 +102,16 @@ pub const POV_BOMB_LIMIT: usize = (MAX_POV_SIZE * 4u32) as usize; /// /// slot time * `DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION` > `APPROVAL_EXECUTION_TIMEOUT` /// + slot time -pub const DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION: BlockNumber = 10; +/// +/// NOTE: In order to use zombie-bite with the less possible changes in the client we need to set +/// this value to `1` (checking iff the env var `ZOMBIE_DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION` is set). +pub static DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION: LazyLock = LazyLock::new(|| { + if var("ZOMBIE_DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION").is_ok() { + 1 + } else { + 10 + } +}); /// Linked to `MAX_FINALITY_LAG` in relay chain selection, /// `MAX_HEADS_LOOK_BACK` in `approval-voting` and From a12df9be79ed2c0bc1f660f95f38901995c9c681 Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Mon, 1 Jun 2026 19:31:12 +0200 Subject: [PATCH 2/3] fmt --- .../dispute-coordinator/src/scraping/tests.rs | 3 ++- polkadot/node/primitives/src/lib.rs | 22 +++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs b/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs index f787b1247fa12..e9d16c84355b9 100644 --- a/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs +++ b/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs @@ -428,7 +428,8 @@ fn scraper_requests_candidates_of_non_finalized_ancestors() { &chain, finalized_block_number, BLOCKS_TO_SKIP - - (finalized_block_number - *DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION) as usize, /* Expect the provider not to go past finalized block. */ + (finalized_block_number - *DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION) + as usize, // Expect the provider not to go past finalized block. get_backed_and_included_candidate_events, ); join(process_active_leaves_update(ctx.sender(), &mut ordering, next_update), overseer_fut) diff --git a/polkadot/node/primitives/src/lib.rs b/polkadot/node/primitives/src/lib.rs index bb475590b1054..36a46c3f6f72b 100644 --- a/polkadot/node/primitives/src/lib.rs +++ b/polkadot/node/primitives/src/lib.rs @@ -22,9 +22,7 @@ #![deny(missing_docs)] -use std::pin::Pin; -use std::sync::LazyLock; -use std::env::var; +use std::{env::var, pin::Pin, sync::LazyLock}; use bounded_vec::BoundedVec; use codec::{Decode, Encode, Error as CodecError, Input}; @@ -104,14 +102,16 @@ pub const POV_BOMB_LIMIT: usize = (MAX_POV_SIZE * 4u32) as usize; /// + slot time /// /// NOTE: In order to use zombie-bite with the less possible changes in the client we need to set -/// this value to `1` (checking iff the env var `ZOMBIE_DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION` is set). -pub static DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION: LazyLock = LazyLock::new(|| { - if var("ZOMBIE_DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION").is_ok() { - 1 - } else { - 10 - } -}); +/// this value to `1` (checking iff the env var +/// `ZOMBIE_DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION` is set). +pub static DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION: LazyLock = + LazyLock::new(|| { + if var("ZOMBIE_DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION").is_ok() { + 1 + } else { + 10 + } + }); /// Linked to `MAX_FINALITY_LAG` in relay chain selection, /// `MAX_HEADS_LOOK_BACK` in `approval-voting` and From 9035f272f77459fc6a85675831ff0dd6c4eda4e9 Mon Sep 17 00:00:00 2001 From: "cmd[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 18:15:20 +0000 Subject: [PATCH 3/3] Update from github-actions[bot] running command 'prdoc --audience node_operator --bump patch' --- prdoc/pr_12247.prdoc | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 prdoc/pr_12247.prdoc diff --git a/prdoc/pr_12247.prdoc b/prdoc/pr_12247.prdoc new file mode 100644 index 0000000000000..e286acc4d0b30 --- /dev/null +++ b/prdoc/pr_12247.prdoc @@ -0,0 +1,12 @@ +title: changes to use zombie-bite +doc: +- audience: Node Operator + description: |- + In order to use [zombie-bite](https://github.com/paritytech/zombie-bite) (to fork and spawn a live network with the _state_) with the same client binaries (for testing releases), we need to allow to set this value `DISPUTE_CANDIDATE_LIFETIME_AFTER_FINALIZATION` to __1__. I think the best approach here is to use an _env var_, since we _only_ need it for our use case. Cc @eskimor wdyt? + + Thx! +crates: +- name: polkadot-node-core-dispute-coordinator + bump: patch +- name: polkadot-node-primitives + bump: patch