Skip to content

Conversation

@seemantaggarwal
Copy link
Contributor

Follow up from #6362 (comment)

The goal of this PR is to have the scheduler pallet work on a parachain which does not produce blocks on a regular schedule, thus can use the relay chain as a block provider.

Because blocks are not produced regularly, we cannot make the assumption that block number increases monotonically, and thus have new logic to handle multiple spend periods passing between blocks.

Requirement:

instead of using the hard coded system block number. We add an associated type BlockNumberProvider

Copy link
Contributor

@gui1117 gui1117 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Direction is good

#[pallet::storage]
pub type IncompleteSince<T: Config> = StorageValue<_, BlockNumberFor<T>>;

type BlockNumberProvider: BlockNumberProvider;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We will need a doc comment that explains this type, and warns that it must not be too much out of sync with the local block number. More precisely between every block the increment of this number should be reasonably small otherwise performance degrades will degrade a lot as it reads one storage per block number.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I will add it towards the end of the pr for sure, I will look into it. At this moment, I am not entirely sure of the value that needs to be advised, i will get more insights into it, thanks for the reminder :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can suggest people to use the system block number or the relay chain block number (this second option, only if they expect their parachain to execute very regularly).

@gui1117 gui1117 added the T2-pallets This PR/Issue is related to a particular pallet. label Feb 3, 2025
@seemantaggarwal
Copy link
Contributor Author

note: this is a part of #6297

@paritytech-review-bot paritytech-review-bot bot requested a review from a team February 4, 2025 07:28
@seemantaggarwal
Copy link
Contributor Author

seemantaggarwal commented Feb 4, 2025

This is where I am stuck atm:

error[E0277]: the trait bound <<<T as frame_system::Config>::Block as sp_runtime::traits::Block>::Header as sp_runtime::traits::Header>::Number: EncodeLike<<<T as pallet::Config>::BlockNumberProvider as sp_runtime::traits::BlockNumberProvider>::BlockNumber> is not satisfied
     --> /Users/seemantaggarwal/RustroverProjects/polkadot-sdk/substrate/frame/scheduler/src/lib.rs:651:36
      |
  651 | ...                   Lookup::<T>::insert(name, item);
      |                       -------------------       ^^^^ unsatisfied trait bound
      |                       |
      |                       required by a bound introduced by this call

What I have tried:

  1. Convert the block number to match expected type:
    something like: let converted_number: T::BlockNumber = <T::BlockNumberProvider as BlockNumberProvider>::current_block_number().saturated_into(); Lookup::<T>::insert(name, (converted_number, some_value));
    and then something like:
    if let Some(item) = old::Lookup::<T>::take(id) { let converted_item: (u32, u32) = (item.1, item.0.into()); // Convert using .into() Lookup::<T>::insert(name, converted_item); }

  2. I have also tried changing the migration functions by adding
    pub fn migrate_v2_to_v4() -> Weight where <<<T as frame_system::Config>::Block as sp_runtime::traits::Block>::Header as sp_runtime::traits::Header>::Number: parity_scale_codec::EncodeLike<<<T as pallet::Config>::BlockNumberProvider as sp_runtime::traits::BlockNumberProvider>::BlockNumber>{

Now this, makes me think I have 2 following options going ahead:

  1. Implement a new migrate v4_to_v5 for lookup (I am not sure how to do that yet, but can be figured out)
  2. Implement EncodeLike for BlockNumberProvider (as far as I understand this cannot be done since it is coming from codec and not a custom impl)

Would like to get some opinion/help here on the options, or if there is any another thing to try

Note: things I have tried are just a summary of the rabbit hole,if you do leave a comment here, I can try it out and answer if it works for me or not

Signed-off-by: Oliver Tale-Yazdi <[email protected]>
@gui1117
Copy link
Contributor

gui1117 commented Feb 5, 2025

This is where I am stuck atm:

error[E0277]: the trait bound <<<T as frame_system::Config>::Block as sp_runtime::traits::Block>::Header as sp_runtime::traits::Header>::Number: EncodeLike<<<T as pallet::Config>::BlockNumberProvider as sp_runtime::traits::BlockNumberProvider>::BlockNumber> is not satisfied
     --> /Users/seemantaggarwal/RustroverProjects/polkadot-sdk/substrate/frame/scheduler/src/lib.rs:651:36
      |
  651 | ...                   Lookup::<T>::insert(name, item);
      |                       -------------------       ^^^^ unsatisfied trait bound
      |                       |
      |                       required by a bound introduced by this call

What I have tried:

  1. Convert the block number to match expected type:
    something like: let converted_number: T::BlockNumber = <T::BlockNumberProvider as BlockNumberProvider>::current_block_number().saturated_into(); Lookup::<T>::insert(name, (converted_number, some_value));
    and then something like:
    if let Some(item) = old::Lookup::<T>::take(id) { let converted_item: (u32, u32) = (item.1, item.0.into()); // Convert using .into() Lookup::<T>::insert(name, converted_item); }

  2. I have also tried changing the migration functions by adding
    pub fn migrate_v2_to_v4() -> Weight where <<<T as frame_system::Config>::Block as sp_runtime::traits::Block>::Header as sp_runtime::traits::Header>::Number: parity_scale_codec::EncodeLike<<<T as pallet::Config>::BlockNumberProvider as sp_runtime::traits::BlockNumberProvider>::BlockNumber>{

Now this, makes me think I have 2 following options going ahead:

  1. Implement a new migrate v4_to_v5 for lookup (I am not sure how to do that yet, but can be figured out)
  2. Implement EncodeLike for BlockNumberProvider (as far as I understand this cannot be done since it is coming from codec and not a custom impl)

Would like to get some opinion/help here on the options, or if there is any another thing to try

Note: things I have tried are just a summary of the rabbit hole,if you do leave a comment here, I can try it out and answer if it works for me or not

The type:

<<T as frame_system::Config>::Block as sp_runtime::traits::Block>::Header as sp_runtime::traits::Header>::Number

Doesn't implement:

EncodeLike<<<T as pallet::Config>::BlockNumberProvider as sp_runtime::traits::BlockNumberProvider>::BlockNumber>

Because:

<<T as pallet::Config>::BlockNumberProvider as sp_runtime::traits::BlockNumberProvider>::BlockNumber

Is a completely different type.

I think you are trying somewhere to put the system block number into storage, but the type expect the configured provided block number.

@seemantaggarwal seemantaggarwal self-assigned this Feb 5, 2025
@seemantaggarwal
Copy link
Contributor Author

seemantaggarwal commented Feb 6, 2025

Looking at the current failure it fails when running:
cargo nextest run --workspace --features runtime-benchmarks benchmark --locked --cargo-profile testnet --cargo-quiet
with the error:

Error[E0308]: mismatched types --> substrate/frame/scheduler/src/benchmarking.rs:62:40 | 62 | Pallet::<T>::do_schedule_named(name, t, period, 0, origin.clone(), call)?; | ------------------------------ ^ expected sp_runtime::traits::BlockNumberProvider::BlockNumber, found sp_runtime::traits::Header::Number| |

and other similar.
check the error here: https://github.com/paritytech/polkadot-sdk/actions/runs/13163415501/job/36737726646

I tried:
replacing the hardcoded
-const BLOCK_NUMBER: u32 = 2;
and now = BLOCK_NUMBER.into()
with

let now = max_scheduled_blocks::<T>().into();
where
fn max_scheduled_blocks<T: Config>() -> u32 { T::MaxScheduledPerBlock::get() }

@seemantaggarwal
Copy link
Contributor Author

Reverted the last commit, as it did not really solve much, bringing it to attention of @gui1117 @ggwpez
i fixed the test too though.

#7441 (comment) -> read the comment here

@muharem
Copy link
Contributor

muharem commented Feb 7, 2025

Error[E0308]: mismatched types --> substrate/frame/scheduler/src/benchmarking.rs:62:40 | 62 | Pallet::::do_schedule_named(name, t, period, 0, origin.clone(), call)?; | ------------------------------ ^ expected sp_runtime::traits::BlockNumberProvider::BlockNumber, found sp_runtime::traits::Header::Number| |

@seemantaggarwal should be your new block number alias instead

when: frame_system::pallet_prelude::BlockNumberFor<T>,

@paritytech-workflow-stopper
Copy link

All GitHub workflows were cancelled due to failure one of the required jobs.
Failed workflow url: https://github.com/paritytech/polkadot-sdk/actions/runs/13259626868
Failed job name: build-rustdoc

Seemant Aggarwal and others added 8 commits February 11, 2025 15:23
Signed-off-by: Oliver Tale-Yazdi <[email protected]>
Signed-off-by: Oliver Tale-Yazdi <[email protected]>
Signed-off-by: Oliver Tale-Yazdi <[email protected]>
Signed-off-by: Oliver Tale-Yazdi <[email protected]>
Signed-off-by: Oliver Tale-Yazdi <[email protected]>
Copy link
Member

@ggwpez ggwpez left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, had to push some fixes since we want to get this into the next release.

use frame_system::pallet_prelude::BlockNumberFor;

#[cfg(feature = "try-runtime")]
use sp_runtime::TryRuntimeError;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should probably deprecate the migrations. They would not interact so well with changing the BN provider at the same time and it is a lot of legacy code

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, keeping the old migrations around is an aspiration that we gave up on a while ago

@seemantaggarwal seemantaggarwal added this pull request to the merge queue Feb 13, 2025
Merged via the queue into master with commit 645a6f4 Feb 13, 2025
218 of 223 checks passed
@seemantaggarwal seemantaggarwal deleted the seemant/scheduler-bnp branch February 13, 2025 01:03
clangenb pushed a commit to clangenb/polkadot-sdk that referenced this pull request Feb 19, 2025
paritytech#7441)

Follow up from
paritytech#6362 (comment)

The goal of this PR is to have the scheduler pallet work on a parachain
which does not produce blocks on a regular schedule, thus can use the
relay chain as a block provider.

Because blocks are not produced regularly, we cannot make the assumption
that block number increases monotonically, and thus have new logic to
handle multiple spend periods passing between blocks.

Requirement: 

instead of using the hard coded system block number. We add an
associated type BlockNumberProvider

---------

Signed-off-by: Oliver Tale-Yazdi <[email protected]>
Co-authored-by: Oliver Tale-Yazdi <[email protected]>
dnjscksdn98 added a commit to bifrost-platform/bifrost-node that referenced this pull request Jul 29, 2025
alstjd0921 pushed a commit to bifrost-platform/bifrost-node that referenced this pull request Sep 10, 2025
alstjd0921 added a commit to bifrost-platform/bifrost-node that referenced this pull request Sep 10, 2025
* NODE-161, deps: update to stable2503

* NODE-161, fix: node: Replace TxPool RPC with Frontier implementation #moonbeam-foundation/moonbeam#3218

* NODE-161, fix: runtime: Fix weight limits in evm tracing runtimes (moonbeam-foundation/moonbeam#3210)

* NODE-161, deps: update Cargo

* NODE-161, fix: Use DecodeWithMemTracking (paritytech/polkadot-sdk#7360)

* NODE-161, feat: runtime: upgrade to EIP-7702 new APIs

* NODE-161, Introduce a gas-based Storage limit per tx (polkadot-evm/frontier#1142), Support external account provider (polkadot-evm/frontier#1329)

* NODE-161, fix: remove sc_transaction_pool

* NODE-161, fix: add missing crates

* NODE-161, fix: resolve typo

* NODE-161, fix: remove Paramter

* NODE-161, feat: Allow whitleisting contract deployer (polkadot-evm/frontier#1629)

* NODE-161, feat: Update Treasury to Support Relay Chain Block Number Provider (paritytech/polkadot-sdk#3970)

* NODE-161, feat: [Identity] Decouple usernames from identities (paritytech/polkadot-sdk#5554)

* NODE-161, feat: Collective: dynamic deposit based on number of proposals (paritytech/polkadot-sdk#3151)

* NODE-161, fix: add missing DecodeWithMemTracking

* NODE-161, feat: Moves disabling logic into pallet-session (paritytech/polkadot-sdk#7581)

* NODE-161, feat: Update Scheduler to have a configurable block provider (paritytech/polkadot-sdk#7441)

* NODE-161, chore: add WeightInfo to pallet_transaction_payment

* NODE-161, fix: add missing authorization_list

* NODE-161, fix: replace to new_bare

* NODE-161, fix: add missing DecodeWithMemTracking derive

* NODE-161, fix: resolve type mismatch

* NODE-161, fix: use system_version (paritytech/polkadot-sdk#4257)

* NODE-161, fix: use Cow (paritytech/polkadot-sdk#5693)

* NODE-161, feat: Generic slashing side-effects (paritytech/polkadot-sdk#5623)

* NODE-161, feat: impl create_inherent (paritytech/polkadot-sdk#3685)

* NODE-161, fix: remove generic parameter from on_unbalanceds

* NODE-161, fix: update storage_at runtime api

* NODE-161, fix: node: Remove network starter that is no longer needed (paritytech/polkadot-sdk#6400)

* NODE-161, fix: node: update FullNetworkConfiguration params

* NODE-161, fix: node: update TransactionPool

* NODE-161, fix: node: substrate-offchain: upgrade hyper to v1 (paritytech/polkadot-sdk#5919)

* NODE-161, fix: node: update service, rpc

* NODE-161, chore: remove unused imports

* chore: add cargo feature "metadata-hash"

* NODE-161, fix: add cumulus primitives storage proof size HostFunctions

* NODE-161, chore: update dependencies branch

* NODE-161, chore: update to stable2506

* NODE-161, chore: remove `RuntimeEvent` from pallet::Config

* NODE-161, fix: update test code

* NODE-161, fix: make node-lts compatible

* NODE-161, chore: update `test_btc_registration_pool.ts`

* NODE-161, chore: update `test_btc_registration_pool.ts`

* NODE-161, chore: update `test_btc_registration_pool.ts`

* NODE-161, fix: use node.kill()

* NODE-161, fix: resolve test codes

* NODE-161, fix: remove console.log

* NODE-161, chore: update tools package.json

* feat: init blaze

* fix: remove unused crate

* import precompile-blaze

* NODE-161, chore: add mbm migrator into runtimes

* NODE-161, chore: add pallet_session migration

* NODE-161, fix: new_full_parts -> new_full_parts_record_import

* fix: resolve issues

* NODE-161, deps: update runtime version (489)

---------

Co-authored-by: dnjscksdn98 <[email protected]>
alstjd0921 added a commit to bifrost-platform/bifrost-node that referenced this pull request Sep 10, 2025
* Node 161 pectra update (#126)

* NODE-161, deps: update to stable2503

* NODE-161, fix: node: Replace TxPool RPC with Frontier implementation #moonbeam-foundation/moonbeam#3218

* NODE-161, fix: runtime: Fix weight limits in evm tracing runtimes (moonbeam-foundation/moonbeam#3210)

* NODE-161, deps: update Cargo

* NODE-161, fix: Use DecodeWithMemTracking (paritytech/polkadot-sdk#7360)

* NODE-161, feat: runtime: upgrade to EIP-7702 new APIs

* NODE-161, Introduce a gas-based Storage limit per tx (polkadot-evm/frontier#1142), Support external account provider (polkadot-evm/frontier#1329)

* NODE-161, fix: remove sc_transaction_pool

* NODE-161, fix: add missing crates

* NODE-161, fix: resolve typo

* NODE-161, fix: remove Paramter

* NODE-161, feat: Allow whitleisting contract deployer (polkadot-evm/frontier#1629)

* NODE-161, feat: Update Treasury to Support Relay Chain Block Number Provider (paritytech/polkadot-sdk#3970)

* NODE-161, feat: [Identity] Decouple usernames from identities (paritytech/polkadot-sdk#5554)

* NODE-161, feat: Collective: dynamic deposit based on number of proposals (paritytech/polkadot-sdk#3151)

* NODE-161, fix: add missing DecodeWithMemTracking

* NODE-161, feat: Moves disabling logic into pallet-session (paritytech/polkadot-sdk#7581)

* NODE-161, feat: Update Scheduler to have a configurable block provider (paritytech/polkadot-sdk#7441)

* NODE-161, chore: add WeightInfo to pallet_transaction_payment

* NODE-161, fix: add missing authorization_list

* NODE-161, fix: replace to new_bare

* NODE-161, fix: add missing DecodeWithMemTracking derive

* NODE-161, fix: resolve type mismatch

* NODE-161, fix: use system_version (paritytech/polkadot-sdk#4257)

* NODE-161, fix: use Cow (paritytech/polkadot-sdk#5693)

* NODE-161, feat: Generic slashing side-effects (paritytech/polkadot-sdk#5623)

* NODE-161, feat: impl create_inherent (paritytech/polkadot-sdk#3685)

* NODE-161, fix: remove generic parameter from on_unbalanceds

* NODE-161, fix: update storage_at runtime api

* NODE-161, fix: node: Remove network starter that is no longer needed (paritytech/polkadot-sdk#6400)

* NODE-161, fix: node: update FullNetworkConfiguration params

* NODE-161, fix: node: update TransactionPool

* NODE-161, fix: node: substrate-offchain: upgrade hyper to v1 (paritytech/polkadot-sdk#5919)

* NODE-161, fix: node: update service, rpc

* NODE-161, chore: remove unused imports

* chore: add cargo feature "metadata-hash"

* NODE-161, fix: add cumulus primitives storage proof size HostFunctions

* NODE-161, chore: update dependencies branch

* NODE-161, chore: update to stable2506

* NODE-161, chore: remove `RuntimeEvent` from pallet::Config

* NODE-161, fix: update test code

* NODE-161, fix: make node-lts compatible

* NODE-161, chore: update `test_btc_registration_pool.ts`

* NODE-161, chore: update `test_btc_registration_pool.ts`

* NODE-161, chore: update `test_btc_registration_pool.ts`

* NODE-161, fix: use node.kill()

* NODE-161, fix: resolve test codes

* NODE-161, fix: remove console.log

* NODE-161, chore: update tools package.json

* feat: init blaze

* fix: remove unused crate

* import precompile-blaze

* NODE-161, chore: add mbm migrator into runtimes

* NODE-161, chore: add pallet_session migration

* NODE-161, fix: new_full_parts -> new_full_parts_record_import

* fix: resolve issues

* NODE-161, deps: update runtime version (489)

---------

Co-authored-by: dnjscksdn98 <[email protected]>

* NODE-80 branch restructure (#127)

* NODE-179, feat: init pallet storages

* NODE-179, feat: init pallet extrinsics

* NODE-179, chore: add locktime

* NODE-179, feat: finalize fee rate

* NODE-179, feature: impl coin selections

* NODE-179, feat: check blaze activation state

* NODE-179, feature: impl `remove_outbound_messages` for legacy mode

* NODE-80: implement benchmarking (#121)

* NODE-80, feature: impl benchmarking.rs & mock.rs

* NODE-80, fix: benchmark

* NODE-80, fix: benchmark

* NODE-80, chore: update weights

* fix: zero out proof size in weights

* chore: resolve

---------

Co-authored-by: dnjscksdn98 <[email protected]>

* fix: correctly use mocha with tsx (#133)

---------

Co-authored-by: dnjscksdn98 <[email protected]>
alstjd0921 added a commit to bifrost-platform/bifrost-node that referenced this pull request Sep 11, 2025
* Node 161 pectra update (#126)

* NODE-161, deps: update to stable2503

* NODE-161, fix: node: Replace TxPool RPC with Frontier implementation #moonbeam-foundation/moonbeam#3218

* NODE-161, fix: runtime: Fix weight limits in evm tracing runtimes (moonbeam-foundation/moonbeam#3210)

* NODE-161, deps: update Cargo

* NODE-161, fix: Use DecodeWithMemTracking (paritytech/polkadot-sdk#7360)

* NODE-161, feat: runtime: upgrade to EIP-7702 new APIs

* NODE-161, Introduce a gas-based Storage limit per tx (polkadot-evm/frontier#1142), Support external account provider (polkadot-evm/frontier#1329)

* NODE-161, fix: remove sc_transaction_pool

* NODE-161, fix: add missing crates

* NODE-161, fix: resolve typo

* NODE-161, fix: remove Paramter

* NODE-161, feat: Allow whitleisting contract deployer (polkadot-evm/frontier#1629)

* NODE-161, feat: Update Treasury to Support Relay Chain Block Number Provider (paritytech/polkadot-sdk#3970)

* NODE-161, feat: [Identity] Decouple usernames from identities (paritytech/polkadot-sdk#5554)

* NODE-161, feat: Collective: dynamic deposit based on number of proposals (paritytech/polkadot-sdk#3151)

* NODE-161, fix: add missing DecodeWithMemTracking

* NODE-161, feat: Moves disabling logic into pallet-session (paritytech/polkadot-sdk#7581)

* NODE-161, feat: Update Scheduler to have a configurable block provider (paritytech/polkadot-sdk#7441)

* NODE-161, chore: add WeightInfo to pallet_transaction_payment

* NODE-161, fix: add missing authorization_list

* NODE-161, fix: replace to new_bare

* NODE-161, fix: add missing DecodeWithMemTracking derive

* NODE-161, fix: resolve type mismatch

* NODE-161, fix: use system_version (paritytech/polkadot-sdk#4257)

* NODE-161, fix: use Cow (paritytech/polkadot-sdk#5693)

* NODE-161, feat: Generic slashing side-effects (paritytech/polkadot-sdk#5623)

* NODE-161, feat: impl create_inherent (paritytech/polkadot-sdk#3685)

* NODE-161, fix: remove generic parameter from on_unbalanceds

* NODE-161, fix: update storage_at runtime api

* NODE-161, fix: node: Remove network starter that is no longer needed (paritytech/polkadot-sdk#6400)

* NODE-161, fix: node: update FullNetworkConfiguration params

* NODE-161, fix: node: update TransactionPool

* NODE-161, fix: node: substrate-offchain: upgrade hyper to v1 (paritytech/polkadot-sdk#5919)

* NODE-161, fix: node: update service, rpc

* NODE-161, chore: remove unused imports

* chore: add cargo feature "metadata-hash"

* NODE-161, fix: add cumulus primitives storage proof size HostFunctions

* NODE-161, chore: update dependencies branch

* NODE-161, chore: update to stable2506

* NODE-161, chore: remove `RuntimeEvent` from pallet::Config

* NODE-161, fix: update test code

* NODE-161, fix: make node-lts compatible

* NODE-161, chore: update `test_btc_registration_pool.ts`

* NODE-161, chore: update `test_btc_registration_pool.ts`

* NODE-161, chore: update `test_btc_registration_pool.ts`

* NODE-161, fix: use node.kill()

* NODE-161, fix: resolve test codes

* NODE-161, fix: remove console.log

* NODE-161, chore: update tools package.json

* feat: init blaze

* fix: remove unused crate

* import precompile-blaze

* NODE-161, chore: add mbm migrator into runtimes

* NODE-161, chore: add pallet_session migration

* NODE-161, fix: new_full_parts -> new_full_parts_record_import

* fix: resolve issues

* NODE-161, deps: update runtime version (489)

---------

Co-authored-by: dnjscksdn98 <[email protected]>

* NODE-80 branch restructure (#127)

* NODE-179, feat: init pallet storages

* NODE-179, feat: init pallet extrinsics

* NODE-179, chore: add locktime

* NODE-179, feat: finalize fee rate

* NODE-179, feature: impl coin selections

* NODE-179, feat: check blaze activation state

* NODE-179, feature: impl `remove_outbound_messages` for legacy mode

* NODE-80: implement benchmarking (#121)

* NODE-80, feature: impl benchmarking.rs & mock.rs

* NODE-80, fix: benchmark

* NODE-80, fix: benchmark

* NODE-80, chore: update weights

* fix: zero out proof size in weights

* chore: resolve

---------

Co-authored-by: dnjscksdn98 <[email protected]>

* fix: correctly use mocha with tsx (#133)

* chore: version (#134)

---------

Co-authored-by: dnjscksdn98 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

T2-pallets This PR/Issue is related to a particular pallet.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants