Skip to content
Snippets Groups Projects
Commit 59868693 authored by Tomasz Drwięga's avatar Tomasz Drwięga Committed by Gavin Wood
Browse files

Fix `period` of offchain transactions. (#4521)

* Fix period of offchain transactions.

* Calculate period dynamically.

* Convert to u64.
parent f02e6d68
No related merge requests found
...@@ -500,7 +500,11 @@ impl frame_system::offchain::CreateTransaction<Runtime, UncheckedExtrinsic> for ...@@ -500,7 +500,11 @@ impl frame_system::offchain::CreateTransaction<Runtime, UncheckedExtrinsic> for
account: AccountId, account: AccountId,
index: Index, index: Index,
) -> Option<(Call, <UncheckedExtrinsic as traits::Extrinsic>::SignaturePayload)> { ) -> Option<(Call, <UncheckedExtrinsic as traits::Extrinsic>::SignaturePayload)> {
let period = 1 << 8; // take the biggest period possible.
let period = BlockHashCount::get()
.checked_next_power_of_two()
.map(|c| c / 2)
.unwrap_or(2) as u64;
let current_block = System::block_number().saturated_into::<u64>(); let current_block = System::block_number().saturated_into::<u64>();
let tip = 0; let tip = 0;
let extra: SignedExtra = ( let extra: SignedExtra = (
......
...@@ -40,6 +40,9 @@ pub enum Era { ...@@ -40,6 +40,9 @@ pub enum Era {
/// implies which block hash is included in the signature material). If the `period` is /// implies which block hash is included in the signature material). If the `period` is
/// greater than 1 << 12, then it will be a factor of the times greater than 1<<12 that /// greater than 1 << 12, then it will be a factor of the times greater than 1<<12 that
/// `period` is. /// `period` is.
///
/// When used on `FRAME`-based runtimes, `period` cannot exceed `BlockHashCount` parameter
/// of `system` module.
Mortal(Period, Phase), Mortal(Period, Phase),
} }
...@@ -55,6 +58,10 @@ n = Q(current - phase, period) + phase ...@@ -55,6 +58,10 @@ n = Q(current - phase, period) + phase
impl Era { impl Era {
/// Create a new era based on a period (which should be a power of two between 4 and 65536 inclusive) /// Create a new era based on a period (which should be a power of two between 4 and 65536 inclusive)
/// and a block number on which it should start (or, for long periods, be shortly after the start). /// and a block number on which it should start (or, for long periods, be shortly after the start).
///
/// If using `Era` in the context of `FRAME` runtime, make sure that `period`
/// does not exceed `BlockHashCount` parameter passed to `system` module, since that
/// prunes old blocks and renders transactions immediately invalid.
pub fn mortal(period: u64, current: u64) -> Self { pub fn mortal(period: u64, current: u64) -> Self {
let period = period.checked_next_power_of_two() let period = period.checked_next_power_of_two()
.unwrap_or(1 << 16) .unwrap_or(1 << 16)
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment