Allow missing functions when checking the new runtime's version (#5741)

This commit is contained in:
Bastian Köcher
2020-04-23 14:54:52 +02:00
committed by GitHub
parent fd65c3807c
commit 46677555ac
13 changed files with 73 additions and 16 deletions
@@ -20,7 +20,9 @@ use crate::{
};
use sp_version::{NativeVersion, RuntimeVersion};
use codec::{Decode, Encode};
use sp_core::{NativeOrEncoded, traits::{CodeExecutor, Externalities, RuntimeCode}};
use sp_core::{
NativeOrEncoded, traits::{CodeExecutor, Externalities, RuntimeCode, MissingHostFunctions},
};
use log::trace;
use std::{result, panic::{UnwindSafe, AssertUnwindSafe}, sync::Arc};
use sp_wasm_interface::{HostFunctions, Function};
@@ -83,8 +85,6 @@ pub struct WasmExecutor {
host_functions: Arc<Vec<&'static dyn Function>>,
/// WASM runtime cache.
cache: Arc<RuntimeCache>,
/// Allow missing function imports.
allow_missing_func_imports: bool,
/// The size of the instances cache.
max_runtime_instances: usize,
}
@@ -102,7 +102,6 @@ impl WasmExecutor {
method: WasmExecutionMethod,
default_heap_pages: Option<u64>,
host_functions: Vec<&'static dyn Function>,
allow_missing_func_imports: bool,
max_runtime_instances: usize,
) -> Self {
WasmExecutor {
@@ -110,7 +109,6 @@ impl WasmExecutor {
default_heap_pages: default_heap_pages.unwrap_or(DEFAULT_HEAP_PAGES),
host_functions: Arc::new(host_functions),
cache: Arc::new(RuntimeCache::new(max_runtime_instances)),
allow_missing_func_imports,
max_runtime_instances,
}
}
@@ -132,6 +130,7 @@ impl WasmExecutor {
&self,
runtime_code: &RuntimeCode,
ext: &mut dyn Externalities,
allow_missing_host_functions: bool,
f: F,
) -> Result<R>
where F: FnOnce(
@@ -146,7 +145,7 @@ impl WasmExecutor {
self.method,
self.default_heap_pages,
&*self.host_functions,
self.allow_missing_func_imports,
allow_missing_host_functions,
|instance, version, ext| {
let instance = AssertUnwindSafe(instance);
let ext = AssertUnwindSafe(ext);
@@ -167,7 +166,10 @@ impl sp_core::traits::CallInWasm for WasmExecutor {
method: &str,
call_data: &[u8],
ext: &mut dyn Externalities,
missing_host_functions: MissingHostFunctions,
) -> std::result::Result<Vec<u8>, String> {
let allow_missing_host_functions = missing_host_functions.allowed();
if let Some(hash) = code_hash {
let code = RuntimeCode {
code_fetcher: &sp_core::traits::WrappedRuntimeCode(wasm_code.into()),
@@ -175,7 +177,7 @@ impl sp_core::traits::CallInWasm for WasmExecutor {
heap_pages: None,
};
self.with_instance(&code, ext, |instance, _, mut ext| {
self.with_instance(&code, ext, allow_missing_host_functions, |instance, _, mut ext| {
with_externalities_safe(
&mut **ext,
move || instance.call(method, call_data),
@@ -187,7 +189,7 @@ impl sp_core::traits::CallInWasm for WasmExecutor {
self.default_heap_pages,
&wasm_code,
self.host_functions.to_vec(),
self.allow_missing_func_imports,
allow_missing_host_functions,
)
.map_err(|e| format!("Failed to create module: {:?}", e))?;
@@ -240,7 +242,6 @@ impl<D: NativeExecutionDispatch> NativeExecutor<D> {
fallback_method,
default_heap_pages,
host_functions,
false,
max_runtime_instances,
);
@@ -265,8 +266,9 @@ impl<D: NativeExecutionDispatch> RuntimeInfo for NativeExecutor<D> {
self.wasm.with_instance(
runtime_code,
ext,
false,
|_instance, version, _ext|
Ok(version.cloned().ok_or_else(|| Error::ApiError("Unknown version".into())))
Ok(version.cloned().ok_or_else(|| Error::ApiError("Unknown version".into()))),
)
}
}
@@ -290,6 +292,7 @@ impl<D: NativeExecutionDispatch + 'static> CodeExecutor for NativeExecutor<D> {
let result = self.wasm.with_instance(
runtime_code,
ext,
false,
|instance, onchain_version, mut ext| {
let onchain_version = onchain_version.ok_or_else(
|| Error::ApiError("Unknown version".into())
@@ -372,8 +375,9 @@ impl<D: NativeExecutionDispatch> sp_core::traits::CallInWasm for NativeExecutor<
method: &str,
call_data: &[u8],
ext: &mut dyn Externalities,
missing_host_functions: MissingHostFunctions,
) -> std::result::Result<Vec<u8>, String> {
self.wasm.call_in_wasm(wasm_blob, code_hash, method, call_data, ext)
self.wasm.call_in_wasm(wasm_blob, code_hash, method, call_data, ext, missing_host_functions)
}
}