mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 04:41:02 +00:00
Embed runtime version as a custom section (#8688)
* emit a custom section from impl_runtime_apis! This change emits a custom section from the impl_runtime_apis! proc macro. Each implemented API will result to emitting a link section `runtime_apis`. During linking all sections with this name will be concatenated and placed into the final wasm binary under the same name. * Introduce `runtime_version` proc macro This macro takes an existing `RuntimeVersion` const declaration, parses it and emits the version information in form of a linking section. Ultimately such a linking section will result into a custom wasm section. * Parse custom wasm section for runtime version * Apply suggestions from code review Co-authored-by: David <dvdplm@gmail.com> * Fix sc-executor integration tests * Nits Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Refactor apis section deserialization * Fix version decoding * Reuse uncompressed value for CallInWasm * Log on decompression error * Simplify if * Reexport proc-macro from sp_version * Merge ReadRuntimeVersionExt * Export `read_embedded_version` * Fix test * Simplify searching for custom section Co-authored-by: David <dvdplm@gmail.com> Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
@@ -38,7 +38,7 @@ use tracing;
|
||||
#[cfg(feature = "std")]
|
||||
use sp_core::{
|
||||
crypto::Pair,
|
||||
traits::{CallInWasmExt, TaskExecutorExt, RuntimeSpawnExt},
|
||||
traits::{TaskExecutorExt, RuntimeSpawnExt},
|
||||
offchain::{OffchainDbExt, OffchainWorkerExt, TransactionPoolExt},
|
||||
hexdisplay::HexDisplay,
|
||||
storage::ChildInfo,
|
||||
@@ -70,6 +70,8 @@ mod batch_verifier;
|
||||
#[cfg(feature = "std")]
|
||||
use batch_verifier::BatchVerifier;
|
||||
|
||||
const LOG_TARGET: &str = "runtime::io";
|
||||
|
||||
/// Error verifying ECDSA signature
|
||||
#[derive(Encode, Decode)]
|
||||
pub enum EcdsaVerifyError {
|
||||
@@ -432,6 +434,9 @@ pub trait Trie {
|
||||
/// Interface that provides miscellaneous functions for communicating between the runtime and the node.
|
||||
#[runtime_interface]
|
||||
pub trait Misc {
|
||||
// NOTE: We use the target 'runtime' for messages produced by general printing functions, instead
|
||||
// of LOG_TARGET.
|
||||
|
||||
/// Print a number.
|
||||
fn print_num(val: u64) {
|
||||
log::debug!(target: "runtime", "{}", val);
|
||||
@@ -456,28 +461,34 @@ pub trait Misc {
|
||||
///
|
||||
/// # Performance
|
||||
///
|
||||
/// Calling this function is very expensive and should only be done very occasionally.
|
||||
/// For getting the runtime version, it requires instantiating the wasm blob and calling a
|
||||
/// function in this blob.
|
||||
/// This function may be very expensive to call depending on the wasm binary. It may be
|
||||
/// relatively cheap if the wasm binary contains version information. In that case, uncompression
|
||||
/// of the wasm blob is the dominating factor.
|
||||
///
|
||||
/// If the wasm binary does not have the version information attached, then a legacy mechanism
|
||||
/// may be involved. This means that a runtime call will be performed to query the version.
|
||||
///
|
||||
/// Calling into the runtime may be incredible expensive and should be approached with care.
|
||||
fn runtime_version(&mut self, wasm: &[u8]) -> Option<Vec<u8>> {
|
||||
// Create some dummy externalities, `Core_version` should not write data anyway.
|
||||
use sp_core::traits::ReadRuntimeVersionExt;
|
||||
|
||||
let mut ext = sp_state_machine::BasicExternalities::default();
|
||||
|
||||
self.extension::<CallInWasmExt>()
|
||||
.expect("No `CallInWasmExt` associated for the current context!")
|
||||
.call_in_wasm(
|
||||
wasm,
|
||||
None,
|
||||
"Core_version",
|
||||
&[],
|
||||
&mut ext,
|
||||
// If a runtime upgrade introduces new host functions that are not provided by
|
||||
// the node, we should not fail at instantiation. Otherwise nodes that are
|
||||
// updated could run this successfully and it could lead to a storage root
|
||||
// mismatch when importing this block.
|
||||
sp_core::traits::MissingHostFunctions::Allow,
|
||||
)
|
||||
.ok()
|
||||
match self
|
||||
.extension::<ReadRuntimeVersionExt>()
|
||||
.expect("No `ReadRuntimeVersionExt` associated for the current context!")
|
||||
.read_runtime_version(wasm, &mut ext)
|
||||
{
|
||||
Ok(v) => Some(v),
|
||||
Err(err) => {
|
||||
log::debug!(
|
||||
target: LOG_TARGET,
|
||||
"cannot read version from the given runtime: {}",
|
||||
err,
|
||||
);
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user