From d1e309f37dac37901aad6149c308c571898020e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 5 Apr 2023 14:27:26 +0200 Subject: [PATCH] Move registration of `ReadRuntimeVersionExt` to `ExecutionExtension` (#13820) Instead of registering `ReadRuntimeVersionExt` in `sp-state-machine` it is moved to `ExecutionExtension` which provides the default extensions. --- bin/node/testing/src/bench.rs | 9 +++++++-- client/api/src/execution_extensions.rs | 18 ++++++------------ client/service/src/builder.rs | 1 + client/service/src/client/call_executor.rs | 1 + client/service/src/client/client.rs | 1 + primitives/core/src/traits.rs | 10 ++++++++++ primitives/state-machine/src/lib.rs | 6 ++---- test-utils/client/src/lib.rs | 3 ++- .../benchmarking-cli/src/pallet/command.rs | 3 ++- .../cli/src/commands/execute_block.rs | 2 +- .../cli/src/commands/fast_forward.rs | 4 ++-- .../cli/src/commands/follow_chain.rs | 2 +- .../cli/src/commands/offchain_worker.rs | 2 +- utils/frame/try-runtime/cli/src/lib.rs | 5 +++-- 14 files changed, 40 insertions(+), 27 deletions(-) diff --git a/bin/node/testing/src/bench.rs b/bin/node/testing/src/bench.rs index d6bcf6e252fe0..392b78241d288 100644 --- a/bin/node/testing/src/bench.rs +++ b/bin/node/testing/src/bench.rs @@ -411,11 +411,16 @@ impl BenchDb { let client = sc_service::new_client( backend.clone(), - executor, + executor.clone(), genesis_block_builder, None, None, - ExecutionExtensions::new(profile.into_execution_strategies(), None, None), + ExecutionExtensions::new( + profile.into_execution_strategies(), + None, + None, + Arc::new(executor), + ), Box::new(task_executor.clone()), None, None, diff --git a/client/api/src/execution_extensions.rs b/client/api/src/execution_extensions.rs index ffa670f7bc628..9344afbd3e6dd 100644 --- a/client/api/src/execution_extensions.rs +++ b/client/api/src/execution_extensions.rs @@ -27,6 +27,7 @@ use parking_lot::RwLock; use sc_transaction_pool_api::OffchainSubmitTransaction; use sp_core::{ offchain::{self, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt}, + traits::{ReadRuntimeVersion, ReadRuntimeVersionExt}, ExecutionContext, }; use sp_externalities::{Extension, Extensions}; @@ -173,18 +174,7 @@ pub struct ExecutionExtensions { // during initialization. transaction_pool: RwLock>>>, extensions_factory: RwLock>>, -} - -impl Default for ExecutionExtensions { - fn default() -> Self { - Self { - strategies: Default::default(), - keystore: None, - offchain_db: None, - transaction_pool: RwLock::new(None), - extensions_factory: RwLock::new(Box::new(())), - } - } + read_runtime_version: Arc, } impl ExecutionExtensions { @@ -193,6 +183,7 @@ impl ExecutionExtensions { strategies: ExecutionStrategies, keystore: Option, offchain_db: Option>, + read_runtime_version: Arc, ) -> Self { let transaction_pool = RwLock::new(None); let extensions_factory = Box::new(()); @@ -202,6 +193,7 @@ impl ExecutionExtensions { offchain_db, extensions_factory: RwLock::new(extensions_factory), transaction_pool, + read_runtime_version, } } @@ -271,6 +263,8 @@ impl ExecutionExtensions { ))); } + extensions.register(ReadRuntimeVersionExt::new(self.read_runtime_version.clone())); + extensions } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 5d639431f427b..d399b315414f8 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -181,6 +181,7 @@ where config.execution_strategies.clone(), Some(keystore_container.keystore()), sc_offchain::OffchainDb::factory_from_backend(&*backend), + Arc::new(executor.clone()), ); let wasm_runtime_substitutes = config diff --git a/client/service/src/client/call_executor.rs b/client/service/src/client/call_executor.rs index 4d019be908b86..ef36768febdbd 100644 --- a/client/service/src/client/call_executor.rs +++ b/client/service/src/client/call_executor.rs @@ -427,6 +427,7 @@ mod tests { Default::default(), None, None, + Arc::new(executor.clone()), )), }; diff --git a/client/service/src/client/client.rs b/client/service/src/client/client.rs index 3adb6d8976969..eee7e6b82363c 100644 --- a/client/service/src/client/client.rs +++ b/client/service/src/client/client.rs @@ -243,6 +243,7 @@ where Default::default(), keystore, sc_offchain::OffchainDb::factory_from_backend(&*backend), + Arc::new(executor.clone()), ); let call_executor = diff --git a/primitives/core/src/traits.rs b/primitives/core/src/traits.rs index 51327868474a0..40137053ab752 100644 --- a/primitives/core/src/traits.rs +++ b/primitives/core/src/traits.rs @@ -157,6 +157,16 @@ pub trait ReadRuntimeVersion: Send + Sync { ) -> Result, String>; } +impl ReadRuntimeVersion for std::sync::Arc { + fn read_runtime_version( + &self, + wasm_code: &[u8], + ext: &mut dyn Externalities, + ) -> Result, String> { + (**self).read_runtime_version(wasm_code, ext) + } +} + sp_externalities::decl_extension! { /// An extension that provides functionality to read version information from a given wasm blob. pub struct ReadRuntimeVersionExt(Box); diff --git a/primitives/state-machine/src/lib.rs b/primitives/state-machine/src/lib.rs index c68cf4d004529..0001d0026c394 100644 --- a/primitives/state-machine/src/lib.rs +++ b/primitives/state-machine/src/lib.rs @@ -163,7 +163,7 @@ mod execution { use sp_core::{ hexdisplay::HexDisplay, storage::{ChildInfo, ChildType, PrefixedStorageKey}, - traits::{CallContext, CodeExecutor, ReadRuntimeVersionExt, RuntimeCode}, + traits::{CallContext, CodeExecutor, RuntimeCode}, }; use sp_externalities::Extensions; use std::{ @@ -322,12 +322,10 @@ mod execution { exec: &'a Exec, method: &'a str, call_data: &'a [u8], - mut extensions: Extensions, + extensions: Extensions, runtime_code: &'a RuntimeCode, context: CallContext, ) -> Self { - extensions.register(ReadRuntimeVersionExt::new(exec.clone())); - Self { backend, exec, diff --git a/test-utils/client/src/lib.rs b/test-utils/client/src/lib.rs index 5e3c9f703fea1..c4572061c48af 100644 --- a/test-utils/client/src/lib.rs +++ b/test-utils/client/src/lib.rs @@ -290,12 +290,13 @@ impl }); let executor = LocalCallExecutor::new( self.backend.clone(), - executor, + executor.clone(), Default::default(), ExecutionExtensions::new( self.execution_strategies.clone(), self.keystore.clone(), sc_offchain::OffchainDb::factory_from_backend(&*self.backend), + Arc::new(executor), ), ) .expect("Creates LocalCallExecutor"); diff --git a/utils/frame/benchmarking-cli/src/pallet/command.rs b/utils/frame/benchmarking-cli/src/pallet/command.rs index 5016d65b89beb..4d583950d7b3e 100644 --- a/utils/frame/benchmarking-cli/src/pallet/command.rs +++ b/utils/frame/benchmarking-cli/src/pallet/command.rs @@ -35,7 +35,7 @@ use sp_core::{ testing::{TestOffchainExt, TestTransactionPoolExt}, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt, }, - traits::CallContext, + traits::{CallContext, ReadRuntimeVersionExt}, }; use sp_externalities::Extensions; use sp_keystore::{testing::MemoryKeystore, KeystoreExt}; @@ -225,6 +225,7 @@ impl PalletCmd { extensions.register(OffchainWorkerExt::new(offchain.clone())); extensions.register(OffchainDbExt::new(offchain)); extensions.register(TransactionPoolExt::new(pool)); + extensions.register(ReadRuntimeVersionExt::new(executor.clone())); extensions }; diff --git a/utils/frame/try-runtime/cli/src/commands/execute_block.rs b/utils/frame/try-runtime/cli/src/commands/execute_block.rs index 561bc57c70c5a..48dab6b9bd1b3 100644 --- a/utils/frame/try-runtime/cli/src/commands/execute_block.rs +++ b/utils/frame/try-runtime/cli/src/commands/execute_block.rs @@ -133,7 +133,7 @@ where &executor, "TryRuntime_execute_block", &payload, - full_extensions(), + full_extensions(executor.clone()), shared.export_proof, )?; diff --git a/utils/frame/try-runtime/cli/src/commands/fast_forward.rs b/utils/frame/try-runtime/cli/src/commands/fast_forward.rs index 75c48c3c402f3..0c517c02fbe81 100644 --- a/utils/frame/try-runtime/cli/src/commands/fast_forward.rs +++ b/utils/frame/try-runtime/cli/src/commands/fast_forward.rs @@ -103,7 +103,7 @@ async fn dry_run( executor, method, data, - full_extensions(), + full_extensions(executor.clone()), )?; Ok(::decode(&mut &*result)?) @@ -121,7 +121,7 @@ async fn run( executor, method, data, - full_extensions(), + full_extensions(executor.clone()), )?; let storage_changes = changes.drain_storage_changes( diff --git a/utils/frame/try-runtime/cli/src/commands/follow_chain.rs b/utils/frame/try-runtime/cli/src/commands/follow_chain.rs index 2a67d269c87f1..413c68550b76d 100644 --- a/utils/frame/try-runtime/cli/src/commands/follow_chain.rs +++ b/utils/frame/try-runtime/cli/src/commands/follow_chain.rs @@ -149,7 +149,7 @@ where &executor, "TryRuntime_execute_block", (block, command.state_root_check, command.try_state.clone()).encode().as_ref(), - full_extensions(), + full_extensions(executor.clone()), shared .export_proof .as_ref() diff --git a/utils/frame/try-runtime/cli/src/commands/offchain_worker.rs b/utils/frame/try-runtime/cli/src/commands/offchain_worker.rs index 352d552a3f358..4da6f07836cd1 100644 --- a/utils/frame/try-runtime/cli/src/commands/offchain_worker.rs +++ b/utils/frame/try-runtime/cli/src/commands/offchain_worker.rs @@ -97,7 +97,7 @@ where &executor, "OffchainWorkerApi_offchain_worker", &payload, - full_extensions(), + full_extensions(executor.clone()), )?; Ok(()) diff --git a/utils/frame/try-runtime/cli/src/lib.rs b/utils/frame/try-runtime/cli/src/lib.rs index 733eab7f5a262..db690e5086a6c 100644 --- a/utils/frame/try-runtime/cli/src/lib.rs +++ b/utils/frame/try-runtime/cli/src/lib.rs @@ -377,7 +377,7 @@ use sp_core::{ OffchainDbExt, OffchainWorkerExt, TransactionPoolExt, }, storage::well_known_keys, - traits::{CallContext, ReadRuntimeVersion}, + traits::{CallContext, ReadRuntimeVersion, ReadRuntimeVersionExt}, twox_128, H256, }; use sp_externalities::Extensions; @@ -810,7 +810,7 @@ where } /// Build all extensions that we typically use. -pub(crate) fn full_extensions() -> Extensions { +pub(crate) fn full_extensions(wasm_executor: WasmExecutor) -> Extensions { let mut extensions = Extensions::default(); let (offchain, _offchain_state) = TestOffchainExt::new(); let (pool, _pool_state) = TestTransactionPoolExt::new(); @@ -819,6 +819,7 @@ pub(crate) fn full_extensions() -> Extensions { extensions.register(OffchainWorkerExt::new(offchain)); extensions.register(KeystoreExt::new(keystore)); extensions.register(TransactionPoolExt::new(pool)); + extensions.register(ReadRuntimeVersionExt::new(wasm_executor)); extensions }