mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 13:27:57 +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:
@@ -613,6 +613,49 @@ pub trait RuntimeApiInfo {
|
||||
const VERSION: u32;
|
||||
}
|
||||
|
||||
/// The number of bytes required to encode a [`RuntimeApiInfo`].
|
||||
///
|
||||
/// 8 bytes for `ID` and 4 bytes for a version.
|
||||
pub const RUNTIME_API_INFO_SIZE: usize = 12;
|
||||
|
||||
/// Crude and simple way to serialize the `RuntimeApiInfo` into a bunch of bytes.
|
||||
pub const fn serialize_runtime_api_info(id: [u8; 8], version: u32) -> [u8; RUNTIME_API_INFO_SIZE] {
|
||||
let version = version.to_le_bytes();
|
||||
|
||||
let mut r = [0; RUNTIME_API_INFO_SIZE];
|
||||
r[0] = id[0];
|
||||
r[1] = id[1];
|
||||
r[2] = id[2];
|
||||
r[3] = id[3];
|
||||
r[4] = id[4];
|
||||
r[5] = id[5];
|
||||
r[6] = id[6];
|
||||
r[7] = id[7];
|
||||
|
||||
r[8] = version[0];
|
||||
r[9] = version[1];
|
||||
r[10] = version[2];
|
||||
r[11] = version[3];
|
||||
r
|
||||
}
|
||||
|
||||
/// Deserialize the runtime API info serialized by [`serialize_runtime_api_info`].
|
||||
pub fn deserialize_runtime_api_info(bytes: [u8; RUNTIME_API_INFO_SIZE]) -> ([u8; 8], u32) {
|
||||
use sp_std::convert::TryInto;
|
||||
|
||||
let id: [u8; 8] = bytes[0..8]
|
||||
.try_into()
|
||||
.expect("the source slice size is equal to the dest array length; qed");
|
||||
|
||||
let version = u32::from_le_bytes(
|
||||
bytes[8..12]
|
||||
.try_into()
|
||||
.expect("the source slice size is equal to the array length; qed"),
|
||||
);
|
||||
|
||||
(id, version)
|
||||
}
|
||||
|
||||
#[derive(codec::Encode, codec::Decode)]
|
||||
pub struct OldRuntimeVersion {
|
||||
pub spec_name: RuntimeString,
|
||||
|
||||
Reference in New Issue
Block a user