mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-19 15:45:41 +00:00
Removal of execution strategies (#14387)
* Start * More work! * Moar * More changes * More fixes * More worrk * More fixes * More fixes to make it compile * Adds `NoOffchainStorage` * Pass the extensions * Small basti making small progress * Fix merge errors and remove `ExecutionContext` * Move registration of `ReadRuntimeVersionExt` to `ExecutionExtension` Instead of registering `ReadRuntimeVersionExt` in `sp-state-machine` it is moved to `ExecutionExtension` which provides the default extensions. * Fix compilation * Register the global extensions inside runtime api instance * Fixes * Fix `generate_initial_session_keys` by passing the keystore extension * Fix the grandpa tests * Fix more tests * Fix more tests * Don't set any heap pages if there isn't an override * Fix small fallout * FMT * Fix tests * More tests * Offchain worker custom extensions * More fixes * Make offchain tx pool creation reusable Introduces an `OffchainTransactionPoolFactory` for creating offchain transactions pools that can be registered in the runtime externalities context. This factory will be required for a later pr to make the creation of offchain transaction pools easier. * Fixes * Fixes * Set offchain transaction pool in BABE before using it in the runtime * Add the `offchain_tx_pool` to Grandpa as well * Fix the nodes * Print some error when using the old warnings * Fix merge issues * Fix compilation * Rename `babe_link` * Rename to `offchain_tx_pool_factory` * Cleanup * FMT * Fix benchmark name * Fix `try-runtime` * Remove `--execution` CLI args * Make clippy happy * Forward bls functions * Fix docs * Update UI tests * Update client/api/src/execution_extensions.rs Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Koute <koute@users.noreply.github.com> * Update client/cli/src/params/import_params.rs Co-authored-by: Koute <koute@users.noreply.github.com> * Update client/api/src/execution_extensions.rs Co-authored-by: Koute <koute@users.noreply.github.com> * Pass the offchain storage to the MMR RPC * Update client/api/src/execution_extensions.rs Co-authored-by: Sebastian Kunert <skunert49@gmail.com> * Review comments * Fixes --------- Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Co-authored-by: Koute <koute@users.noreply.github.com> Co-authored-by: Sebastian Kunert <skunert49@gmail.com>
This commit is contained in:
@@ -22,10 +22,7 @@
|
||||
pub mod client_ext;
|
||||
|
||||
pub use self::client_ext::{ClientBlockImportExt, ClientExt};
|
||||
pub use sc_client_api::{
|
||||
execution_extensions::{ExecutionExtensions, ExecutionStrategies},
|
||||
BadBlocks, ForkBlocks,
|
||||
};
|
||||
pub use sc_client_api::{execution_extensions::ExecutionExtensions, BadBlocks, ForkBlocks};
|
||||
pub use sc_client_db::{self, Backend, BlocksPruning};
|
||||
pub use sc_executor::{self, NativeElseWasmExecutor, WasmExecutionMethod, WasmExecutor};
|
||||
pub use sc_service::{client, RpcHandlers};
|
||||
@@ -35,7 +32,6 @@ pub use sp_keyring::{
|
||||
};
|
||||
pub use sp_keystore::{Keystore, KeystorePtr};
|
||||
pub use sp_runtime::{Storage, StorageChild};
|
||||
pub use sp_state_machine::ExecutionStrategy;
|
||||
|
||||
use futures::{future::Future, stream::StreamExt};
|
||||
use sc_client_api::BlockchainEvents;
|
||||
@@ -67,14 +63,12 @@ impl GenesisInit for () {
|
||||
|
||||
/// A builder for creating a test client instance.
|
||||
pub struct TestClientBuilder<Block: BlockT, ExecutorDispatch, Backend: 'static, G: GenesisInit> {
|
||||
execution_strategies: ExecutionStrategies,
|
||||
genesis_init: G,
|
||||
/// The key is an unprefixed storage key, this only contains
|
||||
/// default child trie content.
|
||||
child_storage_extension: HashMap<Vec<u8>, StorageChild>,
|
||||
backend: Arc<Backend>,
|
||||
_executor: std::marker::PhantomData<ExecutorDispatch>,
|
||||
keystore: Option<KeystorePtr>,
|
||||
fork_blocks: ForkBlocks<Block>,
|
||||
bad_blocks: BadBlocks<Block>,
|
||||
enable_offchain_indexing_api: bool,
|
||||
@@ -119,11 +113,9 @@ impl<Block: BlockT, ExecutorDispatch, Backend, G: GenesisInit>
|
||||
pub fn with_backend(backend: Arc<Backend>) -> Self {
|
||||
TestClientBuilder {
|
||||
backend,
|
||||
execution_strategies: ExecutionStrategies::default(),
|
||||
child_storage_extension: Default::default(),
|
||||
genesis_init: Default::default(),
|
||||
_executor: Default::default(),
|
||||
keystore: None,
|
||||
fork_blocks: None,
|
||||
bad_blocks: None,
|
||||
enable_offchain_indexing_api: false,
|
||||
@@ -131,12 +123,6 @@ impl<Block: BlockT, ExecutorDispatch, Backend, G: GenesisInit>
|
||||
}
|
||||
}
|
||||
|
||||
/// Set the keystore that should be used by the externalities.
|
||||
pub fn set_keystore(mut self, keystore: KeystorePtr) -> Self {
|
||||
self.keystore = Some(keystore);
|
||||
self
|
||||
}
|
||||
|
||||
/// Alter the genesis storage parameters.
|
||||
pub fn genesis_init_mut(&mut self) -> &mut G {
|
||||
&mut self.genesis_init
|
||||
@@ -162,18 +148,6 @@ impl<Block: BlockT, ExecutorDispatch, Backend, G: GenesisInit>
|
||||
self
|
||||
}
|
||||
|
||||
/// Set the execution strategy that should be used by all contexts.
|
||||
pub fn set_execution_strategy(mut self, execution_strategy: ExecutionStrategy) -> Self {
|
||||
self.execution_strategies = ExecutionStrategies {
|
||||
syncing: execution_strategy,
|
||||
importing: execution_strategy,
|
||||
block_construction: execution_strategy,
|
||||
offchain_worker: execution_strategy,
|
||||
other: execution_strategy,
|
||||
};
|
||||
self
|
||||
}
|
||||
|
||||
/// Sets custom block rules.
|
||||
pub fn set_block_rules(
|
||||
mut self,
|
||||
@@ -296,12 +270,7 @@ impl<Block: BlockT, D, Backend, G: GenesisInit>
|
||||
self.backend.clone(),
|
||||
executor.clone(),
|
||||
Default::default(),
|
||||
ExecutionExtensions::new(
|
||||
self.execution_strategies.clone(),
|
||||
self.keystore.clone(),
|
||||
sc_offchain::OffchainDb::factory_from_backend(&*self.backend),
|
||||
Arc::new(executor),
|
||||
),
|
||||
ExecutionExtensions::new(None, Arc::new(executor)),
|
||||
)
|
||||
.expect("Creates LocalCallExecutor");
|
||||
|
||||
|
||||
@@ -138,10 +138,9 @@ impl GenesisStorageBuilder {
|
||||
.build_storage()
|
||||
.expect("Build storage from substrate-test-runtime GenesisConfig");
|
||||
|
||||
storage.top.insert(
|
||||
well_known_keys::HEAP_PAGES.into(),
|
||||
self.heap_pages_override.unwrap_or(16_u64).encode(),
|
||||
);
|
||||
if let Some(heap_pages) = self.heap_pages_override {
|
||||
storage.top.insert(well_known_keys::HEAP_PAGES.into(), heap_pages.encode());
|
||||
}
|
||||
|
||||
storage.top.extend(self.extra_storage.top.clone());
|
||||
storage.children_default.extend(self.extra_storage.children_default.clone());
|
||||
|
||||
@@ -845,8 +845,12 @@ pub mod storage_key_generator {
|
||||
|
||||
/// Generate the hashed storage keys from the raw literals. These keys are expected to be be in
|
||||
/// storage with given substrate-test runtime.
|
||||
pub fn generate_expected_storage_hashed_keys() -> Vec<String> {
|
||||
let literals: Vec<&[u8]> = vec![b":code", b":extrinsic_index", b":heappages"];
|
||||
pub fn generate_expected_storage_hashed_keys(custom_heap_pages: bool) -> Vec<String> {
|
||||
let mut literals: Vec<&[u8]> = vec![b":code", b":extrinsic_index"];
|
||||
|
||||
if custom_heap_pages {
|
||||
literals.push(b":heappages");
|
||||
}
|
||||
|
||||
let keys: Vec<Vec<&[u8]>> = vec![
|
||||
vec![b"Babe", b"Authorities"],
|
||||
@@ -906,8 +910,11 @@ pub mod storage_key_generator {
|
||||
/// that would be generated by `generate_expected_storage_hashed_keys`. This list is provided
|
||||
/// for the debugging convenience only. Value of each hex-string is documented with the literal
|
||||
/// origin.
|
||||
pub fn get_expected_storage_hashed_keys() -> Vec<String> {
|
||||
[
|
||||
///
|
||||
/// `custom_heap_pages`: Should be set to `true` when the state contains the `:heap_pages` key
|
||||
/// aka when overriding the heap pages to be used by the executor.
|
||||
pub fn get_expected_storage_hashed_keys(custom_heap_pages: bool) -> Vec<&'static str> {
|
||||
let mut res = vec![
|
||||
//System|:__STORAGE_VERSION__:
|
||||
"00771836bebdd29870ff246d305c578c4e7b9012096b41c4eb3aaf947f6ea429",
|
||||
//SubstrateTest|Authorities
|
||||
@@ -977,20 +984,25 @@ pub mod storage_key_generator {
|
||||
"3a636f6465",
|
||||
// :extrinsic_index
|
||||
"3a65787472696e7369635f696e646578",
|
||||
// :heappages
|
||||
"3a686561707061676573",
|
||||
// Balances|:__STORAGE_VERSION__:
|
||||
"c2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429",
|
||||
// Balances|TotalIssuance
|
||||
"c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80",
|
||||
].into_iter().map(String::from).collect::<Vec<_>>()
|
||||
];
|
||||
|
||||
if custom_heap_pages {
|
||||
// :heappages
|
||||
res.push("3a686561707061676573");
|
||||
}
|
||||
|
||||
res
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn expected_keys_vec_are_matching() {
|
||||
assert_eq!(
|
||||
storage_key_generator::get_expected_storage_hashed_keys(),
|
||||
storage_key_generator::generate_expected_storage_hashed_keys(),
|
||||
storage_key_generator::get_expected_storage_hashed_keys(false),
|
||||
storage_key_generator::generate_expected_storage_hashed_keys(false),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1001,15 +1013,14 @@ mod tests {
|
||||
use codec::Encode;
|
||||
use frame_support::dispatch::DispatchInfo;
|
||||
use sc_block_builder::BlockBuilderProvider;
|
||||
use sp_api::ProvideRuntimeApi;
|
||||
use sp_api::{ApiExt, ProvideRuntimeApi};
|
||||
use sp_consensus::BlockOrigin;
|
||||
use sp_core::{storage::well_known_keys::HEAP_PAGES, ExecutionContext};
|
||||
use sp_core::{storage::well_known_keys::HEAP_PAGES, traits::CallContext};
|
||||
use sp_keyring::AccountKeyring;
|
||||
use sp_runtime::{
|
||||
traits::{Hash as _, SignedExtension},
|
||||
transaction_validity::{InvalidTransaction, ValidTransaction},
|
||||
};
|
||||
use sp_state_machine::ExecutionStrategy;
|
||||
use substrate_test_runtime_client::{
|
||||
prelude::*, runtime::TestAPI, DefaultTestClientBuilderExt, TestClientBuilder,
|
||||
};
|
||||
@@ -1019,20 +1030,15 @@ mod tests {
|
||||
// This tests that the on-chain `HEAP_PAGES` parameter is respected.
|
||||
|
||||
// Create a client devoting only 8 pages of wasm memory. This gives us ~512k of heap memory.
|
||||
let mut client = TestClientBuilder::new()
|
||||
.set_execution_strategy(ExecutionStrategy::AlwaysWasm)
|
||||
.set_heap_pages(8)
|
||||
.build();
|
||||
let mut client = TestClientBuilder::new().set_heap_pages(8).build();
|
||||
let best_hash = client.chain_info().best_hash;
|
||||
|
||||
// Try to allocate 1024k of memory on heap. This is going to fail since it is twice larger
|
||||
// than the heap.
|
||||
let ret = client.runtime_api().vec_with_capacity_with_context(
|
||||
best_hash,
|
||||
// Use `BlockImport` to ensure we use the on chain heap pages as configured above.
|
||||
ExecutionContext::Importing,
|
||||
1048576,
|
||||
);
|
||||
let mut runtime_api = client.runtime_api();
|
||||
// This is currently required to allocate the 1024k of memory as configured above.
|
||||
runtime_api.set_call_context(CallContext::Onchain);
|
||||
let ret = runtime_api.vec_with_capacity(best_hash, 1048576);
|
||||
assert!(ret.is_err());
|
||||
|
||||
// Create a block that sets the `:heap_pages` to 32 pages of memory which corresponds to
|
||||
@@ -1054,8 +1060,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_storage() {
|
||||
let client =
|
||||
TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build();
|
||||
let client = TestClientBuilder::new().build();
|
||||
let runtime_api = client.runtime_api();
|
||||
let best_hash = client.chain_info().best_hash;
|
||||
|
||||
@@ -1080,8 +1085,7 @@ mod tests {
|
||||
let backend =
|
||||
sp_state_machine::TrieBackendBuilder::<_, crate::Hashing>::new(db, root).build();
|
||||
let proof = sp_state_machine::prove_read(backend, vec![b"value3"]).unwrap();
|
||||
let client =
|
||||
TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build();
|
||||
let client = TestClientBuilder::new().build();
|
||||
let runtime_api = client.runtime_api();
|
||||
let best_hash = client.chain_info().best_hash;
|
||||
|
||||
@@ -1108,7 +1112,7 @@ mod tests {
|
||||
.cloned()
|
||||
.map(storage_key_generator::hex)
|
||||
.collect::<Vec<_>>(),
|
||||
storage_key_generator::get_expected_storage_hashed_keys()
|
||||
storage_key_generator::get_expected_storage_hashed_keys(false)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
use frame_support::{pallet_prelude::*, storage};
|
||||
use sp_core::sr25519::Public;
|
||||
use sp_runtime::{
|
||||
traits::{BlakeTwo256, Hash},
|
||||
traits::Hash,
|
||||
transaction_validity::{
|
||||
InvalidTransaction, TransactionSource, TransactionValidity, ValidTransaction,
|
||||
},
|
||||
@@ -41,7 +41,7 @@ pub mod pallet {
|
||||
use crate::TransferData;
|
||||
use frame_system::pallet_prelude::*;
|
||||
use sp_core::storage::well_known_keys;
|
||||
use sp_runtime::{transaction_validity::TransactionPriority, Perbill};
|
||||
use sp_runtime::{traits::BlakeTwo256, transaction_validity::TransactionPriority, Perbill};
|
||||
|
||||
#[pallet::pallet]
|
||||
#[pallet::without_storage_info]
|
||||
|
||||
Reference in New Issue
Block a user