Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UncheckedExtrinsic: lazily decode and limit the call #7902

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Original file line number Diff line number Diff line change
@@ -29,11 +29,13 @@ use polkadot_parachain_primitives::primitives::{
use alloc::vec::Vec;
use codec::Encode;

use frame_support::traits::{ExecuteBlock, ExtrinsicCall, Get, IsSubType};
use frame_support::traits::{BaseExtrinsicCall, ExecuteBlock, Get, IsSubType};
use sp_core::storage::{ChildInfo, StateVersion};
use sp_externalities::{set_and_run_with_externalities, Externalities};
use sp_io::KillStorageResult;
use sp_runtime::traits::{Block as BlockT, ExtrinsicLike, HashingFor, Header as HeaderT};
use sp_runtime::traits::{
Block as BlockT, ExtrinsicLike, HashingFor, Header as HeaderT, LazyExtrinsicCall,
};
use sp_trie::{MemoryDB, ProofSizeProvider};
use trie_recorder::SizeOnlyRecorderProvider;

@@ -95,8 +97,8 @@ pub fn validate_block<
}: MemoryOptimizedValidationParams,
) -> ValidationResult
where
B::Extrinsic: ExtrinsicCall,
<B::Extrinsic as ExtrinsicCall>::Call: IsSubType<crate::Call<PSC>>,
B::Extrinsic: LazyExtrinsicCall,
<B::Extrinsic as BaseExtrinsicCall>::Call: IsSubType<crate::Call<PSC>>,
{
let block_data = codec::decode_from_bytes::<ParachainBlockData<B>>(block_data)
.expect("Invalid parachain block data");
@@ -106,10 +108,10 @@ where

let (header, extrinsics, storage_proof) = block_data.deconstruct();

let block = B::new(header, extrinsics);
let mut block = B::new(header, extrinsics);
assert!(parent_header.hash() == *block.header().parent_hash(), "Invalid parent hash");

let inherent_data = extract_parachain_inherent_data(&block);
let inherent_data = extract_parachain_inherent_data(&mut block);

validate_validation_data(
&inherent_data.validation_data,
@@ -179,11 +181,13 @@ where
.replace_implementation(host_storage_proof_size),
);

let relay_parent_storage_root = inherent_data.validation_data.relay_parent_storage_root;
let relay_chain_state = inherent_data.relay_chain_state.clone();
run_with_externalities_and_recorder::<B, _, _>(&backend, &mut recorder, || {
let relay_chain_proof = crate::RelayChainStateProof::new(
PSC::SelfParaId::get(),
inherent_data.validation_data.relay_parent_storage_root,
inherent_data.relay_chain_state.clone(),
relay_parent_storage_root,
relay_chain_state,
)
.expect("Invalid relay chain state proof");

@@ -236,18 +240,22 @@ where

/// Extract the [`ParachainInherentData`].
fn extract_parachain_inherent_data<B: BlockT, PSC: crate::Config>(
block: &B,
block: &mut B,
) -> &ParachainInherentData
where
B::Extrinsic: ExtrinsicCall,
<B::Extrinsic as ExtrinsicCall>::Call: IsSubType<crate::Call<PSC>>,
B::Extrinsic: LazyExtrinsicCall,
<B::Extrinsic as BaseExtrinsicCall>::Call: IsSubType<crate::Call<PSC>>,
{
block
.extrinsics()
.iter()
.extrinsics_mut()
.iter_mut()
// Inherents are at the front of the block and are unsigned.
.take_while(|e| e.is_bare())
.filter_map(|e| e.call().is_sub_type())
.filter_map(|e| {
e.try_get_or_decode_call()
.expect("Could not decode extrinsic call")
.is_sub_type()
})
.find_map(|c| match c {
crate::Call::set_validation_data { data: validation_data } => Some(validation_data),
_ => None,
15 changes: 9 additions & 6 deletions cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs
Original file line number Diff line number Diff line change
@@ -44,7 +44,9 @@ use sp_api::impl_runtime_apis;
use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
use sp_runtime::{
generic, impl_opaque_keys,
traits::{AccountIdConversion, BlakeTwo256, Block as BlockT, Saturating, Verify},
traits::{
AccountIdConversion, BlakeTwo256, Block as BlockT, LazyExtrinsic, Saturating, Verify,
},
transaction_validity::{TransactionSource, TransactionValidity},
ApplyExtrinsicResult, Permill,
};
@@ -1402,7 +1404,8 @@ impl_runtime_apis! {
block: Block,
data: sp_inherents::InherentData,
) -> sp_inherents::CheckInherentsResult {
data.check_extrinsics(&block)
let mut block = block;
data.expect_decode_and_check_extrinsics(&mut block)
}
}

@@ -1459,16 +1462,16 @@ impl_runtime_apis! {

impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance> for Runtime {
fn query_info(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo<Balance> {
TransactionPayment::query_info(uxt, len)
TransactionPayment::query_info(uxt.expect_as_ref(), len)
}
fn query_fee_details(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment::FeeDetails<Balance> {
TransactionPayment::query_fee_details(uxt, len)
TransactionPayment::query_fee_details(uxt.expect_as_ref(), len)
}
fn query_weight_to_fee(weight: Weight) -> Balance {
TransactionPayment::weight_to_fee(weight)
14 changes: 8 additions & 6 deletions cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs
Original file line number Diff line number Diff line change
@@ -74,7 +74,8 @@ use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H160, U256};
use sp_runtime::{
generic, impl_opaque_keys,
traits::{
AccountIdConversion, BlakeTwo256, Block as BlockT, Saturating, TransactionExtension, Verify,
AccountIdConversion, BlakeTwo256, Block as BlockT, LazyExtrinsic, Saturating,
TransactionExtension, Verify,
},
transaction_validity::{TransactionSource, TransactionValidity},
ApplyExtrinsicResult, Perbill, Permill, RuntimeDebug,
@@ -1557,7 +1558,8 @@ impl_runtime_apis! {
block: Block,
data: sp_inherents::InherentData,
) -> sp_inherents::CheckInherentsResult {
data.check_extrinsics(&block)
let mut block = block;
data.expect_decode_and_check_extrinsics(&mut block)
}
}

@@ -1660,16 +1662,16 @@ impl_runtime_apis! {

impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance> for Runtime {
fn query_info(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo<Balance> {
TransactionPayment::query_info(uxt, len)
TransactionPayment::query_info(uxt.expect_as_ref(), len)
}
fn query_fee_details(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment::FeeDetails<Balance> {
TransactionPayment::query_fee_details(uxt, len)
TransactionPayment::query_fee_details(uxt.expect_as_ref(), len)
}
fn query_weight_to_fee(weight: Weight) -> Balance {
TransactionPayment::weight_to_fee(weight)
Original file line number Diff line number Diff line change
@@ -48,7 +48,7 @@ use sp_api::impl_runtime_apis;
use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
use sp_runtime::{
generic, impl_opaque_keys,
traits::Block as BlockT,
traits::{Block as BlockT, LazyExtrinsic},
transaction_validity::{TransactionSource, TransactionValidity},
ApplyExtrinsicResult,
};
@@ -773,7 +773,8 @@ impl_runtime_apis! {
block: Block,
data: sp_inherents::InherentData,
) -> sp_inherents::CheckInherentsResult {
data.check_extrinsics(&block)
let mut block = block;
data.expect_decode_and_check_extrinsics(&mut block)
}
}

@@ -813,16 +814,16 @@ impl_runtime_apis! {

impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance> for Runtime {
fn query_info(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo<Balance> {
TransactionPayment::query_info(uxt, len)
TransactionPayment::query_info(uxt.expect_as_ref(), len)
}
fn query_fee_details(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment::FeeDetails<Balance> {
TransactionPayment::query_fee_details(uxt, len)
TransactionPayment::query_fee_details(uxt.expect_as_ref(), len)
}
fn query_weight_to_fee(weight: Weight) -> Balance {
TransactionPayment::weight_to_fee(weight)
Original file line number Diff line number Diff line change
@@ -46,7 +46,7 @@ use sp_api::impl_runtime_apis;
use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
use sp_runtime::{
generic, impl_opaque_keys,
traits::Block as BlockT,
traits::{Block as BlockT, LazyExtrinsic},
transaction_validity::{TransactionSource, TransactionValidity},
ApplyExtrinsicResult,
};
@@ -724,7 +724,8 @@ impl_runtime_apis! {
block: Block,
data: sp_inherents::InherentData,
) -> sp_inherents::CheckInherentsResult {
data.check_extrinsics(&block)
let mut block = block;
data.expect_decode_and_check_extrinsics(&mut block)
}
}

@@ -764,16 +765,16 @@ impl_runtime_apis! {

impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance> for Runtime {
fn query_info(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo<Balance> {
TransactionPayment::query_info(uxt, len)
TransactionPayment::query_info(uxt.expect_as_ref(), len)
}
fn query_fee_details(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment::FeeDetails<Balance> {
TransactionPayment::query_fee_details(uxt, len)
TransactionPayment::query_fee_details(uxt.expect_as_ref(), len)
}
fn query_weight_to_fee(weight: Weight) -> Balance {
TransactionPayment::weight_to_fee(weight)
Original file line number Diff line number Diff line change
@@ -57,7 +57,7 @@ use sp_api::impl_runtime_apis;
use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
use sp_runtime::{
generic, impl_opaque_keys,
traits::{AccountIdConversion, BlakeTwo256, Block as BlockT},
traits::{AccountIdConversion, BlakeTwo256, Block as BlockT, LazyExtrinsic},
transaction_validity::{TransactionSource, TransactionValidity},
ApplyExtrinsicResult, Perbill,
};
@@ -895,7 +895,8 @@ impl_runtime_apis! {
block: Block,
data: sp_inherents::InherentData,
) -> sp_inherents::CheckInherentsResult {
data.check_extrinsics(&block)
let mut block = block;
data.expect_decode_and_check_extrinsics(&mut block)
}
}

@@ -935,16 +936,16 @@ impl_runtime_apis! {

impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance> for Runtime {
fn query_info(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo<Balance> {
TransactionPayment::query_info(uxt, len)
TransactionPayment::query_info(uxt.expect_as_ref(), len)
}
fn query_fee_details(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment::FeeDetails<Balance> {
TransactionPayment::query_fee_details(uxt, len)
TransactionPayment::query_fee_details(uxt.expect_as_ref(), len)
}
fn query_weight_to_fee(weight: Weight) -> Balance {
TransactionPayment::weight_to_fee(weight)
13 changes: 7 additions & 6 deletions cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs
Original file line number Diff line number Diff line change
@@ -69,7 +69,7 @@ use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
pub use sp_runtime::BuildStorage;
use sp_runtime::{
generic, impl_opaque_keys,
traits::{BlakeTwo256, Block as BlockT, BlockNumberProvider},
traits::{BlakeTwo256, Block as BlockT, BlockNumberProvider, LazyExtrinsic},
transaction_validity::{TransactionSource, TransactionValidity},
ApplyExtrinsicResult, DispatchError, MultiAddress, Perbill, RuntimeDebug,
};
@@ -756,7 +756,8 @@ impl_runtime_apis! {
block: Block,
data: sp_inherents::InherentData,
) -> sp_inherents::CheckInherentsResult {
data.check_extrinsics(&block)
let mut block = block;
data.expect_decode_and_check_extrinsics(&mut block)
}
}

@@ -802,16 +803,16 @@ impl_runtime_apis! {

impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance> for Runtime {
fn query_info(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo<Balance> {
TransactionPayment::query_info(uxt, len)
TransactionPayment::query_info(uxt.expect_as_ref(), len)
}
fn query_fee_details(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment::FeeDetails<Balance> {
TransactionPayment::query_fee_details(uxt, len)
TransactionPayment::query_fee_details(uxt.expect_as_ref(), len)
}
fn query_weight_to_fee(weight: Weight) -> Balance {
TransactionPayment::weight_to_fee(weight)
13 changes: 7 additions & 6 deletions cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs
Original file line number Diff line number Diff line change
@@ -69,7 +69,7 @@ use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
pub use sp_runtime::BuildStorage;
use sp_runtime::{
generic, impl_opaque_keys,
traits::{BlakeTwo256, Block as BlockT, BlockNumberProvider},
traits::{BlakeTwo256, Block as BlockT, BlockNumberProvider, LazyExtrinsic},
transaction_validity::{TransactionSource, TransactionValidity},
ApplyExtrinsicResult, DispatchError, MultiAddress, Perbill, RuntimeDebug,
};
@@ -757,7 +757,8 @@ impl_runtime_apis! {
block: Block,
data: sp_inherents::InherentData,
) -> sp_inherents::CheckInherentsResult {
data.check_extrinsics(&block)
let mut block = block;
data.expect_decode_and_check_extrinsics(&mut block)
}
}

@@ -803,16 +804,16 @@ impl_runtime_apis! {

impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance> for Runtime {
fn query_info(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo<Balance> {
TransactionPayment::query_info(uxt, len)
TransactionPayment::query_info(uxt.expect_as_ref(), len)
}
fn query_fee_details(
uxt: <Block as BlockT>::Extrinsic,
mut uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment::FeeDetails<Balance> {
TransactionPayment::query_fee_details(uxt, len)
TransactionPayment::query_fee_details(uxt.expect_as_ref(), len)
}
fn query_weight_to_fee(weight: Weight) -> Balance {
TransactionPayment::weight_to_fee(weight)
Original file line number Diff line number Diff line change
@@ -389,8 +389,8 @@ impl_runtime_apis! {
data.create_extrinsics()
}

fn check_inherents(block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult {
data.check_extrinsics(&block)
fn check_inherents(mut block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult {
data.expect_decode_and_check_extrinsics(&mut block)
}
}

Loading