From 39d6c95c0daa4e42c30836919150a67317f0e408 Mon Sep 17 00:00:00 2001
From: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com>
Date: Wed, 29 Nov 2023 10:30:09 +0100
Subject: [PATCH] substrate-node: `NativeElseWasmExecutor` is no longer used
 (#2521)

This PR removes `NativeElseWasmExecutor` usage from substrate node.
Instead [`WasmExecutor<(sp_io::SubstrateHostFunctions,
sp_statement_store::runtime_api::HostFunctions)>`](https://github.com/paritytech/polkadot-sdk/blob/49a41ab3bb3f630c20e5b24cec8d92382404631c/substrate/bin/node/executor/src/lib.rs#L26)
is used.

Related to #2358.

---------

Co-authored-by: Davide Galassi <davxy@datawok.net>
---
 Cargo.lock                                    |  57 +++------
 Cargo.toml                                    |   1 -
 .../bin/node-template/node/src/service.rs     |  30 +----
 substrate/bin/node/cli/Cargo.toml             |  40 ++++++-
 .../bench.rs => cli/benches/executor.rs}      | 109 +++++++-----------
 substrate/bin/node/cli/src/command.rs         |   3 +-
 substrate/bin/node/cli/src/service.rs         |  24 +++-
 .../bin/node/{executor => cli}/tests/basic.rs |   0
 .../node/{executor => cli}/tests/common.rs    |   9 +-
 .../bin/node/{executor => cli}/tests/fees.rs  |   0
 .../tests/res/default_genesis_config.json     |   0
 .../tests/submit_transaction.rs               |   0
 substrate/bin/node/executor/Cargo.toml        |  57 ---------
 substrate/bin/node/executor/src/lib.rs        |  40 -------
 substrate/bin/node/inspect/Cargo.toml         |   8 ++
 substrate/bin/node/inspect/src/command.rs     |  10 +-
 substrate/bin/node/testing/Cargo.toml         |   2 +-
 substrate/bin/node/testing/src/bench.rs       |  14 +--
 substrate/bin/node/testing/src/client.rs      |  19 ++-
 19 files changed, 164 insertions(+), 259 deletions(-)
 rename substrate/bin/node/{executor/benches/bench.rs => cli/benches/executor.rs} (71%)
 rename substrate/bin/node/{executor => cli}/tests/basic.rs (100%)
 rename substrate/bin/node/{executor => cli}/tests/common.rs (95%)
 rename substrate/bin/node/{executor => cli}/tests/fees.rs (100%)
 rename substrate/bin/node/{executor => cli}/tests/res/default_genesis_config.json (100%)
 rename substrate/bin/node/{executor => cli}/tests/submit_transaction.rs (100%)
 delete mode 100644 substrate/bin/node/executor/Cargo.toml
 delete mode 100644 substrate/bin/node/executor/src/lib.rs

diff --git a/Cargo.lock b/Cargo.lock
index 871d46ea844..bf4efa60ad7 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -8928,7 +8928,7 @@ dependencies = [
  "sp-keyring",
  "sp-runtime",
  "sp-timestamp",
- "staging-node-executor",
+ "staging-node-cli",
  "substrate-test-client",
  "tempfile",
 ]
@@ -18358,7 +18358,9 @@ dependencies = [
  "clap 4.4.6",
  "clap_complete",
  "criterion 0.4.0",
+ "frame-benchmarking",
  "frame-benchmarking-cli",
+ "frame-support",
  "frame-system",
  "frame-system-rpc-runtime-api",
  "futures",
@@ -18368,13 +18370,20 @@ dependencies = [
  "nix 0.26.2",
  "node-primitives",
  "node-rpc",
+ "node-testing",
  "pallet-asset-conversion-tx-payment",
  "pallet-asset-tx-payment",
  "pallet-assets",
  "pallet-balances",
+ "pallet-contracts",
+ "pallet-glutton",
  "pallet-im-online",
+ "pallet-root-testing",
  "pallet-skip-feeless-payment",
+ "pallet-sudo",
  "pallet-timestamp",
+ "pallet-transaction-payment",
+ "pallet-treasury",
  "parity-scale-codec",
  "platforms",
  "rand 0.8.5",
@@ -18409,27 +18418,31 @@ dependencies = [
  "sc-telemetry",
  "sc-transaction-pool",
  "sc-transaction-pool-api",
+ "scale-info",
  "serde",
  "serde_json",
  "soketto",
  "sp-api",
+ "sp-application-crypto",
  "sp-authority-discovery",
  "sp-blockchain",
  "sp-consensus",
  "sp-consensus-babe",
  "sp-consensus-grandpa",
  "sp-core",
+ "sp-externalities 0.19.0",
  "sp-inherents",
  "sp-io",
  "sp-keyring",
  "sp-keystore",
  "sp-mixnet",
  "sp-runtime",
+ "sp-state-machine",
  "sp-statement-store",
  "sp-timestamp",
  "sp-tracing 10.0.0",
  "sp-transaction-storage-proof",
- "staging-node-executor",
+ "sp-trie",
  "staging-node-inspect",
  "substrate-build-script-utils",
  "substrate-cli-test-utils",
@@ -18440,44 +18453,6 @@ dependencies = [
  "tokio-util",
  "try-runtime-cli",
  "wait-timeout",
-]
-
-[[package]]
-name = "staging-node-executor"
-version = "3.0.0-dev"
-dependencies = [
- "criterion 0.4.0",
- "frame-benchmarking",
- "frame-support",
- "frame-system",
- "futures",
- "kitchensink-runtime",
- "node-primitives",
- "node-testing",
- "pallet-balances",
- "pallet-contracts",
- "pallet-glutton",
- "pallet-im-online",
- "pallet-root-testing",
- "pallet-sudo",
- "pallet-timestamp",
- "pallet-transaction-payment",
- "pallet-treasury",
- "parity-scale-codec",
- "sc-executor",
- "scale-info",
- "serde_json",
- "sp-application-crypto",
- "sp-consensus-babe",
- "sp-core",
- "sp-externalities 0.19.0",
- "sp-keyring",
- "sp-keystore",
- "sp-runtime",
- "sp-state-machine",
- "sp-statement-store",
- "sp-tracing 10.0.0",
- "sp-trie",
  "wat",
 ]
 
@@ -18492,7 +18467,9 @@ dependencies = [
  "sc-service",
  "sp-blockchain",
  "sp-core",
+ "sp-io",
  "sp-runtime",
+ "sp-statement-store",
  "thiserror",
 ]
 
diff --git a/Cargo.toml b/Cargo.toml
index 6af3ea4c3cb..f16c8393183 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -200,7 +200,6 @@ members = [
 	"substrate/bin/node-template/runtime",
 	"substrate/bin/node/bench",
 	"substrate/bin/node/cli",
-	"substrate/bin/node/executor",
 	"substrate/bin/node/inspect",
 	"substrate/bin/node/primitives",
 	"substrate/bin/node/rpc",
diff --git a/substrate/bin/node-template/node/src/service.rs b/substrate/bin/node-template/node/src/service.rs
index e69428d8190..c4a2b2f39d2 100644
--- a/substrate/bin/node-template/node/src/service.rs
+++ b/substrate/bin/node-template/node/src/service.rs
@@ -5,35 +5,17 @@ use node_template_runtime::{self, opaque::Block, RuntimeApi};
 use sc_client_api::{Backend, BlockBackend};
 use sc_consensus_aura::{ImportQueueParams, SlotProportion, StartAuraParams};
 use sc_consensus_grandpa::SharedVoterState;
-pub use sc_executor::NativeElseWasmExecutor;
 use sc_service::{error::Error as ServiceError, Configuration, TaskManager, WarpSyncParams};
 use sc_telemetry::{Telemetry, TelemetryWorker};
 use sc_transaction_pool_api::OffchainTransactionPoolFactory;
 use sp_consensus_aura::sr25519::AuthorityPair as AuraPair;
 use std::{sync::Arc, time::Duration};
 
-// Our native executor instance.
-pub struct ExecutorDispatch;
-
-impl sc_executor::NativeExecutionDispatch for ExecutorDispatch {
-	/// Only enable the benchmarking host functions when we actually want to benchmark.
-	#[cfg(feature = "runtime-benchmarks")]
-	type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions;
-	/// Otherwise we only use the default Substrate host functions.
-	#[cfg(not(feature = "runtime-benchmarks"))]
-	type ExtendHostFunctions = ();
-
-	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-		node_template_runtime::api::dispatch(method, data)
-	}
-
-	fn native_version() -> sc_executor::NativeVersion {
-		node_template_runtime::native_version()
-	}
-}
-
-pub(crate) type FullClient =
-	sc_service::TFullClient<Block, RuntimeApi, NativeElseWasmExecutor<ExecutorDispatch>>;
+pub(crate) type FullClient = sc_service::TFullClient<
+	Block,
+	RuntimeApi,
+	sc_executor::WasmExecutor<sp_io::SubstrateHostFunctions>,
+>;
 type FullBackend = sc_service::TFullBackend<Block>;
 type FullSelectChain = sc_consensus::LongestChain<FullBackend, Block>;
 
@@ -75,7 +57,7 @@ pub fn new_partial(
 		})
 		.transpose()?;
 
-	let executor = sc_service::new_native_or_wasm_executor(config);
+	let executor = sc_service::new_wasm_executor::<sp_io::SubstrateHostFunctions>(config);
 	let (client, backend, keystore_container, task_manager) =
 		sc_service::new_full_parts::<Block, RuntimeApi, _>(
 			config,
diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml
index 8f3c2185deb..656d6f86505 100644
--- a/substrate/bin/node/cli/Cargo.toml
+++ b/substrate/bin/node/cli/Cargo.toml
@@ -90,6 +90,7 @@ sc-storage-monitor = { path = "../../../client/storage-monitor" }
 sc-offchain = { path = "../../../client/offchain" }
 
 # frame dependencies
+frame-benchmarking = { path = "../../../frame/benchmarking" }
 frame-system = { path = "../../../frame/system" }
 frame-system-rpc-runtime-api = { path = "../../../frame/system/rpc/runtime-api" }
 pallet-assets = { path = "../../../frame/assets" }
@@ -102,7 +103,6 @@ pallet-skip-feeless-payment = { path = "../../../frame/transaction-payment/skip-
 kitchensink-runtime = { path = "../runtime" }
 node-rpc = { path = "../rpc" }
 node-primitives = { path = "../primitives" }
-node-executor = { package = "staging-node-executor", path = "../executor" }
 
 # CLI-specific dependencies
 sc-cli = { path = "../../../client/cli", optional = true}
@@ -136,6 +136,26 @@ substrate-rpc-client = { path = "../../../utils/frame/rpc/client" }
 pallet-timestamp = { path = "../../../frame/timestamp" }
 substrate-cli-test-utils = { path = "../../../test-utils/cli" }
 
+wat = "1.0"
+frame-support = { path = "../../../frame/support" }
+node-testing = { path = "../testing" }
+pallet-balances = { path = "../../../frame/balances" }
+pallet-contracts = { path = "../../../frame/contracts" }
+pallet-glutton = { path = "../../../frame/glutton" }
+pallet-sudo = { path = "../../../frame/sudo" }
+pallet-treasury = { path = "../../../frame/treasury" }
+pallet-transaction-payment = { path = "../../../frame/transaction-payment" }
+sp-application-crypto = { path = "../../../primitives/application-crypto" }
+pallet-root-testing = { path = "../../../frame/root-testing" }
+sp-consensus-babe = { path = "../../../primitives/consensus/babe" }
+sp-externalities = { path = "../../../primitives/externalities" }
+sp-keyring = { path = "../../../primitives/keyring" }
+sp-runtime = { path = "../../../primitives/runtime" }
+serde_json = "1.0.108"
+scale-info = { version = "2.10.0", features = ["derive", "serde"] }
+sp-trie = { path = "../../../primitives/trie" }
+sp-state-machine = { path = "../../../primitives/state-machine" }
+
 [build-dependencies]
 clap = { version = "4.4.6", optional = true }
 clap_complete = { version = "4.0.2", optional = true }
@@ -163,14 +183,21 @@ cli = [
 ]
 runtime-benchmarks = [
 	"frame-benchmarking-cli/runtime-benchmarks",
+	"frame-benchmarking/runtime-benchmarks",
+	"frame-support/runtime-benchmarks",
 	"frame-system/runtime-benchmarks",
 	"kitchensink-runtime/runtime-benchmarks",
+	"node-inspect?/runtime-benchmarks",
 	"pallet-asset-tx-payment/runtime-benchmarks",
 	"pallet-assets/runtime-benchmarks",
 	"pallet-balances/runtime-benchmarks",
+	"pallet-contracts/runtime-benchmarks",
+	"pallet-glutton/runtime-benchmarks",
 	"pallet-im-online/runtime-benchmarks",
 	"pallet-skip-feeless-payment/runtime-benchmarks",
+	"pallet-sudo/runtime-benchmarks",
 	"pallet-timestamp/runtime-benchmarks",
+	"pallet-treasury/runtime-benchmarks",
 	"sc-client-db/runtime-benchmarks",
 	"sc-service/runtime-benchmarks",
 	"sp-runtime/runtime-benchmarks",
@@ -178,15 +205,22 @@ runtime-benchmarks = [
 # Enable features that allow the runtime to be tried and debugged. Name might be subject to change
 # in the near future.
 try-runtime = [
+	"frame-support/try-runtime",
 	"frame-system/try-runtime",
 	"kitchensink-runtime/try-runtime",
 	"pallet-asset-conversion-tx-payment/try-runtime",
 	"pallet-asset-tx-payment/try-runtime",
 	"pallet-assets/try-runtime",
 	"pallet-balances/try-runtime",
+	"pallet-contracts/try-runtime",
+	"pallet-glutton/try-runtime",
 	"pallet-im-online/try-runtime",
+	"pallet-root-testing/try-runtime",
 	"pallet-skip-feeless-payment/try-runtime",
+	"pallet-sudo/try-runtime",
 	"pallet-timestamp/try-runtime",
+	"pallet-transaction-payment/try-runtime",
+	"pallet-treasury/try-runtime",
 	"sp-runtime/try-runtime",
 	"substrate-cli-test-utils/try-runtime",
 	"try-runtime-cli/try-runtime",
@@ -199,3 +233,7 @@ harness = false
 [[bench]]
 name = "block_production"
 harness = false
+
+[[bench]]
+name = "executor"
+harness = false
diff --git a/substrate/bin/node/executor/benches/bench.rs b/substrate/bin/node/cli/benches/executor.rs
similarity index 71%
rename from substrate/bin/node/executor/benches/bench.rs
rename to substrate/bin/node/cli/benches/executor.rs
index 587e76af867..d654646904b 100644
--- a/substrate/bin/node/executor/benches/bench.rs
+++ b/substrate/bin/node/cli/benches/executor.rs
@@ -22,20 +22,16 @@ use kitchensink_runtime::{
 	constants::currency::*, Block, BuildStorage, CheckedExtrinsic, Header, RuntimeCall,
 	RuntimeGenesisConfig, UncheckedExtrinsic,
 };
-use node_executor::ExecutorDispatch;
 use node_primitives::{BlockNumber, Hash};
 use node_testing::keyring::*;
-use sc_executor::{
-	Externalities, NativeElseWasmExecutor, RuntimeVersionOf, WasmExecutionMethod, WasmExecutor,
-	WasmtimeInstantiationStrategy,
-};
+use sc_executor::{Externalities, RuntimeVersionOf};
 use sp_core::{
 	storage::well_known_keys,
 	traits::{CallContext, CodeExecutor, RuntimeCode},
 };
 use sp_runtime::traits::BlakeTwo256;
 use sp_state_machine::TestExternalities as CoreTestExternalities;
-use staging_node_executor as node_executor;
+use staging_node_cli::service::RuntimeExecutor;
 
 criterion_group!(benches, bench_execute_block);
 criterion_main!(benches);
@@ -58,12 +54,6 @@ const HEAP_PAGES: u64 = 20;
 
 type TestExternalities<H> = CoreTestExternalities<H>;
 
-#[derive(Debug)]
-enum ExecutionMethod {
-	Native,
-	Wasm(WasmExecutionMethod),
-}
-
 fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic {
 	node_testing::keyring::sign(xt, SPEC_VERSION, TRANSACTION_VERSION, GENESIS_HASH)
 }
@@ -80,7 +70,7 @@ fn new_test_ext(genesis_config: &RuntimeGenesisConfig) -> TestExternalities<Blak
 }
 
 fn construct_block<E: Externalities>(
-	executor: &NativeElseWasmExecutor<ExecutorDispatch>,
+	executor: &RuntimeExecutor,
 	ext: &mut E,
 	number: BlockNumber,
 	parent_hash: Hash,
@@ -159,7 +149,7 @@ fn construct_block<E: Externalities>(
 
 fn test_blocks(
 	genesis_config: &RuntimeGenesisConfig,
-	executor: &NativeElseWasmExecutor<ExecutorDispatch>,
+	executor: &RuntimeExecutor,
 ) -> Vec<(Vec<u8>, Hash)> {
 	let mut test_ext = new_test_ext(genesis_config);
 	let mut block1_extrinsics = vec![CheckedExtrinsic {
@@ -181,56 +171,43 @@ fn test_blocks(
 
 fn bench_execute_block(c: &mut Criterion) {
 	let mut group = c.benchmark_group("execute blocks");
-	let execution_methods = vec![
-		ExecutionMethod::Native,
-		ExecutionMethod::Wasm(WasmExecutionMethod::Compiled {
-			instantiation_strategy: WasmtimeInstantiationStrategy::PoolingCopyOnWrite,
-		}),
-	];
-
-	for strategy in execution_methods {
-		group.bench_function(format!("{:?}", strategy), |b| {
-			let genesis_config = node_testing::genesis::config();
-			let use_native = match strategy {
-				ExecutionMethod::Native => true,
-				ExecutionMethod::Wasm(..) => false,
-			};
-
-			let executor =
-				NativeElseWasmExecutor::new_with_wasm_executor(WasmExecutor::builder().build());
-			let runtime_code = RuntimeCode {
-				code_fetcher: &sp_core::traits::WrappedRuntimeCode(compact_code_unwrap().into()),
-				hash: vec![1, 2, 3],
-				heap_pages: None,
-			};
-
-			// Get the runtime version to initialize the runtimes cache.
-			{
-				let mut test_ext = new_test_ext(&genesis_config);
-				executor.runtime_version(&mut test_ext.ext(), &runtime_code).unwrap();
-			}
-
-			let blocks = test_blocks(&genesis_config, &executor);
-
-			b.iter_batched_ref(
-				|| new_test_ext(&genesis_config),
-				|test_ext| {
-					for block in blocks.iter() {
-						executor
-							.call(
-								&mut test_ext.ext(),
-								&runtime_code,
-								"Core_execute_block",
-								&block.0,
-								use_native,
-								CallContext::Offchain,
-							)
-							.0
-							.unwrap();
-					}
-				},
-				BatchSize::LargeInput,
-			);
-		});
-	}
+
+	group.bench_function("wasm", |b| {
+		let genesis_config = node_testing::genesis::config();
+
+		let executor = RuntimeExecutor::builder().build();
+		let runtime_code = RuntimeCode {
+			code_fetcher: &sp_core::traits::WrappedRuntimeCode(compact_code_unwrap().into()),
+			hash: vec![1, 2, 3],
+			heap_pages: None,
+		};
+
+		// Get the runtime version to initialize the runtimes cache.
+		{
+			let mut test_ext = new_test_ext(&genesis_config);
+			executor.runtime_version(&mut test_ext.ext(), &runtime_code).unwrap();
+		}
+
+		let blocks = test_blocks(&genesis_config, &executor);
+
+		b.iter_batched_ref(
+			|| new_test_ext(&genesis_config),
+			|test_ext| {
+				for block in blocks.iter() {
+					executor
+						.call(
+							&mut test_ext.ext(),
+							&runtime_code,
+							"Core_execute_block",
+							&block.0,
+							false,
+							CallContext::Offchain,
+						)
+						.0
+						.unwrap();
+				}
+			},
+			BatchSize::LargeInput,
+		);
+	});
 }
diff --git a/substrate/bin/node/cli/src/command.rs b/substrate/bin/node/cli/src/command.rs
index 16d0415ff26..dc28705c2ae 100644
--- a/substrate/bin/node/cli/src/command.rs
+++ b/substrate/bin/node/cli/src/command.rs
@@ -24,7 +24,6 @@ use crate::{
 };
 use frame_benchmarking_cli::*;
 use kitchensink_runtime::{ExistentialDeposit, RuntimeApi};
-use node_executor::ExecutorDispatch;
 use node_primitives::Block;
 use sc_cli::{Result, SubstrateCli};
 use sc_service::PartialComponents;
@@ -89,7 +88,7 @@ pub fn run() -> Result<()> {
 		Some(Subcommand::Inspect(cmd)) => {
 			let runner = cli.create_runner(cmd)?;
 
-			runner.sync_run(|config| cmd.run::<Block, RuntimeApi, ExecutorDispatch>(config))
+			runner.sync_run(|config| cmd.run::<Block, RuntimeApi>(config))
 		},
 		Some(Subcommand::Benchmark(cmd)) => {
 			let runner = cli.create_runner(cmd)?;
diff --git a/substrate/bin/node/cli/src/service.rs b/substrate/bin/node/cli/src/service.rs
index a746de8de84..4f8c6198cdc 100644
--- a/substrate/bin/node/cli/src/service.rs
+++ b/substrate/bin/node/cli/src/service.rs
@@ -26,11 +26,9 @@ use frame_benchmarking_cli::SUBSTRATE_REFERENCE_HARDWARE;
 use frame_system_rpc_runtime_api::AccountNonceApi;
 use futures::prelude::*;
 use kitchensink_runtime::RuntimeApi;
-use node_executor::ExecutorDispatch;
 use node_primitives::Block;
 use sc_client_api::{Backend, BlockBackend};
 use sc_consensus_babe::{self, SlotProportion};
-use sc_executor::NativeElseWasmExecutor;
 use sc_network::{event::Event, NetworkEventStream, NetworkService};
 use sc_network_sync::{warp::WarpSyncParams, SyncingService};
 use sc_service::{config::Configuration, error::Error as ServiceError, RpcHandlers, TaskManager};
@@ -42,9 +40,25 @@ use sp_core::crypto::Pair;
 use sp_runtime::{generic, traits::Block as BlockT, SaturatedConversion};
 use std::sync::Arc;
 
+/// Host functions required for kitchensink runtime and Substrate node.
+#[cfg(not(feature = "runtime-benchmarks"))]
+pub type HostFunctions =
+	(sp_io::SubstrateHostFunctions, sp_statement_store::runtime_api::HostFunctions);
+
+/// Host functions required for kitchensink runtime and Substrate node.
+#[cfg(feature = "runtime-benchmarks")]
+pub type HostFunctions = (
+	sp_io::SubstrateHostFunctions,
+	sp_statement_store::runtime_api::HostFunctions,
+	frame_benchmarking::benchmarking::HostFunctions,
+);
+
+/// A specialized `WasmExecutor` intended to use accross substrate node. It provides all required
+/// HostFunctions.
+pub type RuntimeExecutor = sc_executor::WasmExecutor<HostFunctions>;
+
 /// The full client type definition.
-pub type FullClient =
-	sc_service::TFullClient<Block, RuntimeApi, NativeElseWasmExecutor<ExecutorDispatch>>;
+pub type FullClient = sc_service::TFullClient<Block, RuntimeApi, RuntimeExecutor>;
 type FullBackend = sc_service::TFullBackend<Block>;
 type FullSelectChain = sc_consensus::LongestChain<FullBackend, Block>;
 type FullGrandpaBlockImport =
@@ -174,7 +188,7 @@ pub fn new_partial(
 		})
 		.transpose()?;
 
-	let executor = sc_service::new_native_or_wasm_executor(&config);
+	let executor = sc_service::new_wasm_executor(&config);
 
 	let (client, backend, keystore_container, task_manager) =
 		sc_service::new_full_parts::<Block, RuntimeApi, _>(
diff --git a/substrate/bin/node/executor/tests/basic.rs b/substrate/bin/node/cli/tests/basic.rs
similarity index 100%
rename from substrate/bin/node/executor/tests/basic.rs
rename to substrate/bin/node/cli/tests/basic.rs
diff --git a/substrate/bin/node/executor/tests/common.rs b/substrate/bin/node/cli/tests/common.rs
similarity index 95%
rename from substrate/bin/node/executor/tests/common.rs
rename to substrate/bin/node/cli/tests/common.rs
index 2d68c88db92..7d8f6a9a0e7 100644
--- a/substrate/bin/node/executor/tests/common.rs
+++ b/substrate/bin/node/cli/tests/common.rs
@@ -18,7 +18,7 @@
 use codec::{Decode, Encode};
 use frame_support::Hashable;
 use frame_system::offchain::AppCrypto;
-use sc_executor::{error::Result, NativeElseWasmExecutor, WasmExecutor};
+use sc_executor::error::Result;
 use sp_consensus_babe::{
 	digests::{PreDigest, SecondaryPlainPreDigest},
 	Slot, BABE_ENGINE_ID,
@@ -38,11 +38,10 @@ use kitchensink_runtime::{
 	constants::currency::*, Block, BuildStorage, CheckedExtrinsic, Header, Runtime,
 	UncheckedExtrinsic,
 };
-use node_executor::ExecutorDispatch;
 use node_primitives::{BlockNumber, Hash};
 use node_testing::keyring::*;
 use sp_externalities::Externalities;
-use staging_node_executor as node_executor;
+use staging_node_cli::service::RuntimeExecutor;
 
 pub const TEST_KEY_TYPE_ID: KeyTypeId = KeyTypeId(*b"test");
 
@@ -98,8 +97,8 @@ pub fn from_block_number(n: u32) -> Header {
 	Header::new(n, Default::default(), Default::default(), [69; 32].into(), Default::default())
 }
 
-pub fn executor() -> NativeElseWasmExecutor<ExecutorDispatch> {
-	NativeElseWasmExecutor::new_with_wasm_executor(WasmExecutor::builder().build())
+pub fn executor() -> RuntimeExecutor {
+	RuntimeExecutor::builder().build()
 }
 
 pub fn executor_call(
diff --git a/substrate/bin/node/executor/tests/fees.rs b/substrate/bin/node/cli/tests/fees.rs
similarity index 100%
rename from substrate/bin/node/executor/tests/fees.rs
rename to substrate/bin/node/cli/tests/fees.rs
diff --git a/substrate/bin/node/executor/tests/res/default_genesis_config.json b/substrate/bin/node/cli/tests/res/default_genesis_config.json
similarity index 100%
rename from substrate/bin/node/executor/tests/res/default_genesis_config.json
rename to substrate/bin/node/cli/tests/res/default_genesis_config.json
diff --git a/substrate/bin/node/executor/tests/submit_transaction.rs b/substrate/bin/node/cli/tests/submit_transaction.rs
similarity index 100%
rename from substrate/bin/node/executor/tests/submit_transaction.rs
rename to substrate/bin/node/cli/tests/submit_transaction.rs
diff --git a/substrate/bin/node/executor/Cargo.toml b/substrate/bin/node/executor/Cargo.toml
deleted file mode 100644
index 595a313d2cb..00000000000
--- a/substrate/bin/node/executor/Cargo.toml
+++ /dev/null
@@ -1,57 +0,0 @@
-[package]
-name = "staging-node-executor"
-version = "3.0.0-dev"
-authors.workspace = true
-description = "Substrate node implementation in Rust."
-edition.workspace = true
-license = "Apache-2.0"
-homepage = "https://substrate.io"
-repository.workspace = true
-publish = false
-
-[package.metadata.docs.rs]
-targets = ["x86_64-unknown-linux-gnu"]
-
-[dependencies]
-codec = { package = "parity-scale-codec", version = "3.6.1" }
-scale-info = { version = "2.10.0", features = ["derive", "serde"] }
-frame-benchmarking = { path = "../../../frame/benchmarking" }
-node-primitives = { path = "../primitives" }
-kitchensink-runtime = { path = "../runtime" }
-sc-executor = { path = "../../../client/executor" }
-sp-core = { path = "../../../primitives/core", features=["serde"] }
-sp-keystore = { path = "../../../primitives/keystore" }
-sp-state-machine = { path = "../../../primitives/state-machine" }
-sp-tracing = { path = "../../../primitives/tracing" }
-sp-trie = { path = "../../../primitives/trie" }
-sp-statement-store = { path = "../../../primitives/statement-store", features=["serde"] }
-
-[dev-dependencies]
-criterion = "0.4.0"
-futures = "0.3.21"
-wat = "1.0"
-frame-support = { path = "../../../frame/support" }
-frame-system = { path = "../../../frame/system" }
-node-testing = { path = "../testing" }
-pallet-balances = { path = "../../../frame/balances" }
-pallet-contracts = { path = "../../../frame/contracts" }
-pallet-im-online = { path = "../../../frame/im-online" }
-pallet-glutton = { path = "../../../frame/glutton" }
-pallet-sudo = { path = "../../../frame/sudo" }
-pallet-timestamp = { path = "../../../frame/timestamp" }
-pallet-treasury = { path = "../../../frame/treasury" }
-pallet-transaction-payment = { path = "../../../frame/transaction-payment" }
-sp-application-crypto = { path = "../../../primitives/application-crypto" }
-pallet-root-testing = { path = "../../../frame/root-testing" }
-sp-consensus-babe = { path = "../../../primitives/consensus/babe" }
-sp-externalities = { path = "../../../primitives/externalities" }
-sp-keyring = { path = "../../../primitives/keyring" }
-sp-runtime = { path = "../../../primitives/runtime" }
-serde_json = "1.0.108"
-
-[features]
-stress-test = []
-
-[[bench]]
-name = "bench"
-harness = false
diff --git a/substrate/bin/node/executor/src/lib.rs b/substrate/bin/node/executor/src/lib.rs
deleted file mode 100644
index 3557a16740b..00000000000
--- a/substrate/bin/node/executor/src/lib.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-// This file is part of Substrate.
-
-// Copyright (C) Parity Technologies (UK) Ltd.
-// SPDX-License-Identifier: Apache-2.0
-
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// 	http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//! A `CodeExecutor` specialization which uses natively compiled runtime when the wasm to be
-//! executed is equivalent to the natively compiled code.
-
-pub use sc_executor::NativeElseWasmExecutor;
-
-// Declare an instance of the native executor named `ExecutorDispatch`. Include the wasm binary as
-// the equivalent wasm code.
-pub struct ExecutorDispatch;
-
-impl sc_executor::NativeExecutionDispatch for ExecutorDispatch {
-	type ExtendHostFunctions = (
-		frame_benchmarking::benchmarking::HostFunctions,
-		sp_statement_store::runtime_api::HostFunctions,
-	);
-
-	fn dispatch(method: &str, data: &[u8]) -> Option<Vec<u8>> {
-		kitchensink_runtime::api::dispatch(method, data)
-	}
-
-	fn native_version() -> sc_executor::NativeVersion {
-		kitchensink_runtime::native_version()
-	}
-}
diff --git a/substrate/bin/node/inspect/Cargo.toml b/substrate/bin/node/inspect/Cargo.toml
index 30cc22b0e8c..cfdec6af5de 100644
--- a/substrate/bin/node/inspect/Cargo.toml
+++ b/substrate/bin/node/inspect/Cargo.toml
@@ -20,4 +20,12 @@ sc-client-api = { path = "../../../client/api" }
 sc-service = { path = "../../../client/service", default-features = false}
 sp-blockchain = { path = "../../../primitives/blockchain" }
 sp-core = { path = "../../../primitives/core" }
+sp-io = { path = "../../../primitives/io" }
 sp-runtime = { path = "../../../primitives/runtime" }
+sp-statement-store = { path = "../../../primitives/statement-store" }
+
+[features]
+runtime-benchmarks = [
+	"sc-service/runtime-benchmarks",
+	"sp-runtime/runtime-benchmarks",
+]
diff --git a/substrate/bin/node/inspect/src/command.rs b/substrate/bin/node/inspect/src/command.rs
index dcecfd78826..e0e25707e31 100644
--- a/substrate/bin/node/inspect/src/command.rs
+++ b/substrate/bin/node/inspect/src/command.rs
@@ -23,18 +23,20 @@ use crate::{
 	Inspector,
 };
 use sc_cli::{CliConfiguration, ImportParams, Result, SharedParams};
-use sc_service::{Configuration, NativeExecutionDispatch};
+use sc_service::Configuration;
 use sp_runtime::traits::Block;
 
+type HostFunctions =
+	(sp_io::SubstrateHostFunctions, sp_statement_store::runtime_api::HostFunctions);
+
 impl InspectCmd {
 	/// Run the inspect command, passing the inspector.
-	pub fn run<B, RA, D>(&self, config: Configuration) -> Result<()>
+	pub fn run<B, RA>(&self, config: Configuration) -> Result<()>
 	where
 		B: Block,
 		RA: Send + Sync + 'static,
-		D: NativeExecutionDispatch + 'static,
 	{
-		let executor = sc_service::new_native_or_wasm_executor::<D>(&config);
+		let executor = sc_service::new_wasm_executor::<HostFunctions>(&config);
 		let client = sc_service::new_full_client::<B, RA, _>(&config, None, executor)?;
 		let inspect = Inspector::<B>::new(client);
 
diff --git a/substrate/bin/node/testing/Cargo.toml b/substrate/bin/node/testing/Cargo.toml
index e4fb06b5dcd..dba5016fb3e 100644
--- a/substrate/bin/node/testing/Cargo.toml
+++ b/substrate/bin/node/testing/Cargo.toml
@@ -19,7 +19,7 @@ futures = "0.3.21"
 log = "0.4.17"
 tempfile = "3.1.0"
 frame-system = { path = "../../../frame/system" }
-node-executor = { package = "staging-node-executor", path = "../executor" }
+node-cli = { package = "staging-node-cli", path = "../cli" }
 node-primitives = { path = "../primitives" }
 kitchensink-runtime = { path = "../runtime" }
 pallet-asset-conversion = { path = "../../../frame/asset-conversion" }
diff --git a/substrate/bin/node/testing/src/bench.rs b/substrate/bin/node/testing/src/bench.rs
index 89b96c0191c..98d3b968a35 100644
--- a/substrate/bin/node/testing/src/bench.rs
+++ b/substrate/bin/node/testing/src/bench.rs
@@ -43,7 +43,7 @@ use sc_block_builder::BlockBuilderBuilder;
 use sc_client_api::{execution_extensions::ExecutionExtensions, UsageProvider};
 use sc_client_db::PruningMode;
 use sc_consensus::{BlockImport, BlockImportParams, ForkChoiceStrategy, ImportResult, ImportedAux};
-use sc_executor::{NativeElseWasmExecutor, WasmExecutionMethod, WasmtimeInstantiationStrategy};
+use sc_executor::{WasmExecutionMethod, WasmtimeInstantiationStrategy};
 use sp_api::ProvideRuntimeApi;
 use sp_block_builder::BlockBuilder;
 use sp_consensus::BlockOrigin;
@@ -388,13 +388,11 @@ impl BenchDb {
 		let task_executor = TaskExecutor::new();
 
 		let backend = sc_service::new_db_backend(db_config).expect("Should not fail");
-		let executor = NativeElseWasmExecutor::new_with_wasm_executor(
-			sc_executor::WasmExecutor::builder()
-				.with_execution_method(WasmExecutionMethod::Compiled {
-					instantiation_strategy: WasmtimeInstantiationStrategy::PoolingCopyOnWrite,
-				})
-				.build(),
-		);
+		let executor = sc_executor::WasmExecutor::builder()
+			.with_execution_method(WasmExecutionMethod::Compiled {
+				instantiation_strategy: WasmtimeInstantiationStrategy::PoolingCopyOnWrite,
+			})
+			.build();
 
 		let client_config = sc_service::ClientConfig::default();
 		let genesis_block_builder = sc_service::GenesisBlockBuilder::new(
diff --git a/substrate/bin/node/testing/src/client.rs b/substrate/bin/node/testing/src/client.rs
index 22276833fb6..07ba1cdbbfb 100644
--- a/substrate/bin/node/testing/src/client.rs
+++ b/substrate/bin/node/testing/src/client.rs
@@ -23,7 +23,7 @@ use sp_runtime::BuildStorage;
 pub use substrate_test_client::*;
 
 /// Call executor for `kitchensink-runtime` `TestClient`.
-pub type ExecutorDispatch = sc_executor::NativeElseWasmExecutor<node_executor::ExecutorDispatch>;
+use node_cli::service::RuntimeExecutor;
 
 /// Default backend type.
 pub type Backend = sc_client_db::Backend<node_primitives::Block>;
@@ -31,7 +31,7 @@ pub type Backend = sc_client_db::Backend<node_primitives::Block>;
 /// Test client type.
 pub type Client = client::Client<
 	Backend,
-	client::LocalCallExecutor<node_primitives::Block, Backend, ExecutorDispatch>,
+	client::LocalCallExecutor<node_primitives::Block, Backend, RuntimeExecutor>,
 	node_primitives::Block,
 	kitchensink_runtime::RuntimeApi,
 >;
@@ -63,7 +63,7 @@ pub trait TestClientBuilderExt: Sized {
 impl TestClientBuilderExt
 	for substrate_test_client::TestClientBuilder<
 		node_primitives::Block,
-		client::LocalCallExecutor<node_primitives::Block, Backend, ExecutorDispatch>,
+		client::LocalCallExecutor<node_primitives::Block, Backend, RuntimeExecutor>,
 		Backend,
 		GenesisParameters,
 	>
@@ -71,8 +71,17 @@ impl TestClientBuilderExt
 	fn new() -> Self {
 		Self::default()
 	}
-
 	fn build(self) -> Client {
-		self.build_with_native_executor(None).0
+		let executor = RuntimeExecutor::builder().build();
+		use sc_service::client::LocalCallExecutor;
+		use std::sync::Arc;
+		let executor = LocalCallExecutor::new(
+			self.backend().clone(),
+			executor.clone(),
+			Default::default(),
+			ExecutionExtensions::new(None, Arc::new(executor)),
+		)
+		.expect("Creates LocalCallExecutor");
+		self.build_with_executor(executor).0
 	}
 }
-- 
GitLab