mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-20 23:15:42 +00:00
Select header that will be fully refunded in on-demand batch finality relay (#2729)
* select header that will be fully refunded for submission in on-demand **batch** finality relay * added the only possible test * spelling * nl * updated comment
This commit is contained in:
committed by
Bastian Köcher
parent
6d35de23be
commit
6c31cdbe19
@@ -82,8 +82,8 @@ impl<H: HeaderT> GrandpaJustification<H> {
|
||||
.saturating_add(BlockNumberOf::<C>::max_encoded_len().saturated_into())
|
||||
.saturating_add(HashOf::<C>::max_encoded_len().saturated_into());
|
||||
|
||||
let max_expected_votes_ancestries_size = C::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY
|
||||
.saturating_mul(C::AVERAGE_HEADER_SIZE_IN_JUSTIFICATION);
|
||||
let max_expected_votes_ancestries_size =
|
||||
C::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY.saturating_mul(C::AVERAGE_HEADER_SIZE);
|
||||
|
||||
// justification is round number (u64=8b), a signed GRANDPA commit and the
|
||||
// `votes_ancestries` vector
|
||||
|
||||
@@ -266,36 +266,28 @@ pub trait ChainWithGrandpa: Chain {
|
||||
/// to submitter.
|
||||
const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32;
|
||||
|
||||
/// Maximal size of the chain header. The header may be the header that enacts new GRANDPA
|
||||
/// authorities set (so it has large digest inside).
|
||||
/// Maximal size of the mandatory chain header. Mandatory header is the header that enacts new
|
||||
/// GRANDPA authorities set (so it has large digest inside).
|
||||
///
|
||||
/// This isn't a strict limit. The relay may submit larger headers and the pallet will accept
|
||||
/// the call. The limit is only used to compute maximal refund amount and doing calls which
|
||||
/// exceed the limit, may be costly to submitter.
|
||||
const MAX_HEADER_SIZE: u32;
|
||||
const MAX_MANDATORY_HEADER_SIZE: u32;
|
||||
|
||||
/// Average size of the chain header from justification ancestry. We don't expect to see there
|
||||
/// headers that change GRANDPA authorities set (GRANDPA will probably be able to finalize at
|
||||
/// least one additional header per session on non test chains), so this is average size of
|
||||
/// headers that aren't changing the set.
|
||||
/// Average size of the chain header. We don't expect to see there headers that change GRANDPA
|
||||
/// authorities set (GRANDPA will probably be able to finalize at least one additional header
|
||||
/// per session on non test chains), so this is average size of headers that aren't changing the
|
||||
/// set.
|
||||
///
|
||||
/// This isn't a strict limit. The relay may submit justifications with larger headers in its
|
||||
/// ancestry and the pallet will accept the call. The limit is only used to compute fee, paid
|
||||
/// by the user at the sending chain. It covers most of cases, but if the actual header,
|
||||
/// submitted with the messages transaction will be larger than the
|
||||
/// `AVERAGE_HEADER_SIZE_IN_JUSTIFICATION`, the difference (`WORST_HEADER_SIZE_IN_JUSTIFICATION`
|
||||
/// - `AVERAGE_HEADER_SIZE_IN_JUSTIFICATION`) must be covered by the sending chain.
|
||||
const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32;
|
||||
|
||||
/// Worst-case size of the chain header from justification ancestry. We don't expect to see
|
||||
/// there headers that change GRANDPA authorities set (GRANDPA will probably be able to finalize
|
||||
/// at least one additional header per session on non test chains), so this is the worst-case
|
||||
/// size of headers that aren't changing the set.
|
||||
/// This isn't a strict limit. The relay may submit justifications with larger headers and the
|
||||
/// pallet will accept the call. However, if the total size of all `submit_finality_proof`
|
||||
/// arguments exceeds the maximal size, computed using this average size, relayer will only get
|
||||
/// partial refund.
|
||||
///
|
||||
/// This isn't a strict limit. The relay may submit justifications with larger headers in its
|
||||
/// ancestry and the pallet will accept the call. The limit is only used to compute maximal
|
||||
/// refund amount and doing calls which exceed the limit, may be costly to submitter.
|
||||
const WORST_HEADER_SIZE_IN_JUSTIFICATION: u32;
|
||||
/// We expect some headers on production chains that are above this size. But they are rare and
|
||||
/// if rellayer cares about its profitability, we expect it'll select other headers for
|
||||
/// submission.
|
||||
const AVERAGE_HEADER_SIZE: u32;
|
||||
}
|
||||
|
||||
impl<T> ChainWithGrandpa for T
|
||||
@@ -308,9 +300,67 @@ where
|
||||
const MAX_AUTHORITIES_COUNT: u32 = <T::Chain as ChainWithGrandpa>::MAX_AUTHORITIES_COUNT;
|
||||
const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 =
|
||||
<T::Chain as ChainWithGrandpa>::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY;
|
||||
const MAX_HEADER_SIZE: u32 = <T::Chain as ChainWithGrandpa>::MAX_HEADER_SIZE;
|
||||
const AVERAGE_HEADER_SIZE_IN_JUSTIFICATION: u32 =
|
||||
<T::Chain as ChainWithGrandpa>::AVERAGE_HEADER_SIZE_IN_JUSTIFICATION;
|
||||
const WORST_HEADER_SIZE_IN_JUSTIFICATION: u32 =
|
||||
<T::Chain as ChainWithGrandpa>::WORST_HEADER_SIZE_IN_JUSTIFICATION;
|
||||
const MAX_MANDATORY_HEADER_SIZE: u32 =
|
||||
<T::Chain as ChainWithGrandpa>::MAX_MANDATORY_HEADER_SIZE;
|
||||
const AVERAGE_HEADER_SIZE: u32 = <T::Chain as ChainWithGrandpa>::AVERAGE_HEADER_SIZE;
|
||||
}
|
||||
|
||||
/// Returns maximal expected size of `submit_finality_proof` call arguments.
|
||||
pub fn max_expected_submit_finality_proof_arguments_size<C: ChainWithGrandpa>(
|
||||
is_mandatory_finality_target: bool,
|
||||
precommits: u32,
|
||||
) -> u32 {
|
||||
let max_expected_justification_size =
|
||||
GrandpaJustification::<HeaderOf<C>>::max_reasonable_size::<C>(precommits);
|
||||
|
||||
// call arguments are header and justification
|
||||
let max_expected_finality_target_size = if is_mandatory_finality_target {
|
||||
C::MAX_MANDATORY_HEADER_SIZE
|
||||
} else {
|
||||
C::AVERAGE_HEADER_SIZE
|
||||
};
|
||||
max_expected_finality_target_size.saturating_add(max_expected_justification_size)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use frame_support::weights::Weight;
|
||||
use sp_runtime::{testing::H256, traits::BlakeTwo256, MultiSignature};
|
||||
|
||||
struct TestChain;
|
||||
|
||||
impl Chain for TestChain {
|
||||
type BlockNumber = u32;
|
||||
type Hash = H256;
|
||||
type Hasher = BlakeTwo256;
|
||||
type Header = sp_runtime::generic::Header<u32, BlakeTwo256>;
|
||||
type AccountId = u64;
|
||||
type Balance = u64;
|
||||
type Nonce = u64;
|
||||
type Signature = MultiSignature;
|
||||
|
||||
fn max_extrinsic_size() -> u32 {
|
||||
0
|
||||
}
|
||||
fn max_extrinsic_weight() -> Weight {
|
||||
Weight::zero()
|
||||
}
|
||||
}
|
||||
|
||||
impl ChainWithGrandpa for TestChain {
|
||||
const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = "Test";
|
||||
const MAX_AUTHORITIES_COUNT: u32 = 128;
|
||||
const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 2;
|
||||
const MAX_MANDATORY_HEADER_SIZE: u32 = 100_000;
|
||||
const AVERAGE_HEADER_SIZE: u32 = 1_024;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn max_expected_submit_finality_proof_arguments_size_respects_mandatory_argument() {
|
||||
assert!(
|
||||
max_expected_submit_finality_proof_arguments_size::<TestChain>(true, 100) >
|
||||
max_expected_submit_finality_proof_arguments_size::<TestChain>(false, 100),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user