mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-07 23:38:00 +00:00
49b6dfd2e5
* Cargo.lock after merge * Restore scale-info feature * Fully qualify TypeInfo derive * Skip PendingSwap T * Add missing skip_type_params attr * metadata docs features * Reduce pallet event attribute to struct * Cargo.lock * Update frame/balances/src/tests_composite.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Line widths check * Cargo.lock * Add scale-info/std * Update frame/system/src/lib.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Use `skip_type_params` to remove `TypeInfo` requirements on checks * Revert "Remove unused Call metadata stuff" This reverts commit 41311f85 * Skip BalanceSwapAction type parameter * Remove unused event metadata macro * Update frame-metadata * Update primitives/npos-elections/compact/src/codec.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Manual TypeInfo for Header * Remove TypeInfo requirement for consts in BoundedVec etc. * Another TypeInfo bound removed * review: fix indentation * TypeInfo impls for Identity types * Add some todos to add custom TypeInfo impls * Update frame/support/procedural/src/pallet/expand/pallet_struct.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Add some todos to add custom TypeInfo impls * Add a test for manual Data TypeInfo impl * Add custom TypeInfo impl for Vote * Era custom TypeInfo crimes * Revert finality-grandpa version to 0.14.z * review: renamed module to pallet_constants_metadata * New line at end of file * Add missing scale-info/std * Update frame/support/src/storage/types/mod.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Remove StorageEntryType::Map unused flag * Add missing scale-info dependency after merge * SignedExtension::AdditionalSigned metadata * Update frame-metadata, use abbreviated docs and args fields * Update frame/example/Cargo.toml Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> * Add scale_info/std and remove unused scale-info dependency * Remove scale-info dependency * Remove treasury pallet::metadata * Remove redundant Event test * Add back scale-info as dev dependency * fix error metadata when no error defined in decl_module * Add Module3 to tests * Fix metadata test * Add docs feature to frame-support test * WIP fixing pallet metadata test * Remove redundant FunctionMetadata, FunctionArgumentMetadata as per https://github.com/paritytech/frame-metadata/pull/20 * Use main branch of frame-metadata * Use patch of scale-info for latest changes * Use latest patched scale-info * Manual TypeInfo for DigestItem * Manual TypeInfo for DigestItem * Update scale-info * Skip __Ignore variants for Error, depends on https://github.com/paritytech/scale-info/pull/117 * Named fields for FRAME v2 pallet Call variants * Named fields for FRAME v1 pallet Call variants * Add missing scale-info dependency * WIP expand benchmark call variant * fix benchmark with new function create a new function for each variant of a pallet call. This function is called by benchmarking macro in order not to break call creation with unnamed argument * fix tests * more fix * Fix staking tests * Fix offchain workers calls * Cherry pick rustfmt.toml from master * cargo +nightly-2021-06-22 fmt --all * Update to new call variant structs * More call variant struct updates * Remove unused import * More call variant structs * More call variant structs * Even more call variant structs * Mooar variant structs * Evermore variant structs * Call variant structs ad infinitum * Fmt * More call variants * Last call variant * Call variants all done? * Fix SS58Prefix type * Potential workaround for BitFlags<IdentityFields> TypeInfo * Enable docs capturing for Call, Event, and Error types * Fix IdentityFields TypeInfo * Remove metadata-docs feature * Add capture_docs = true for legacy Call, Event and Error types * Fmt * Fix metadata test type * Update benchmarks with call struct variants * Fmt * More test fixes * Fmt * Fix benches * Use latest capture_docs attr * Latest scale_info * Fmt * review: change &Vec to &[] * Remove pallet metadata attr * review: remove commented out test code * review: skip_type_params trailing comma suggestion * Update to scale-info 0.10.0 * Update construct_runtime ui tests, different because of metadata TypeInfo impls * Add some TypeInfo derives for UI tests * Update storage ensure span ui stderrs * Update call argument bound ui tests Possibly changed because change from tuple to struct variants? * Add scale-info dev dependency * Update to latest finality-grandpa release * review: missing newline * review: missing scale-info/std * review: remove duplicate scale-info/std * review: remove fully qualified TypeInfo * review: add missing scale-info/std * review: remove unnecessary imports. * Fmt * Use crates.io RC version of frame-metadata * Remove scale-info/std because it is a dev dependency * Add missing scale_info dev-dependency for test * Delete empty metadata folder * Fix sp_std import * review: improve manual UncheckedExtrinsic TypeInfo impl * review: use full scale-info for dev-dependency * Remove DefaultByteGetter impl * review: derive TypeInfo for generic header * Fmt * Update primitives/runtime/src/generic/unchecked_extrinsic.rs Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> * Update primitives/runtime/src/generic/unchecked_extrinsic.rs Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> * Update bin/node/executor/Cargo.toml Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update frame/identity/src/types.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update frame/support/src/dispatch.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Remove redundant derive * Simplify scale-info dependency * Strip underscore prefix from call variant struct names * Another underscore field * More underscore fields * Another underscore field * Update to frame-metadata 14.0.0-rc.2 with combined StorageEntryType::Map * Fmt * Revert weights formatting * Fix up some tests * Fix up some tests for StorageEntryTypeMetadata * scale-info dev dependency * Fix test error * Add missing TypeInfo derives * Add back missing scale-info dependency * Add back missing scale-info dependency * Fix npos compact impls * Cargo.lock * Fmt * Fix errors * Fmt * Fix renamed raw_solution field * Fix error * Fmt * Fix some benchmarks * Fmt * Stray R * Fix * Add missing TypeInfos * ui test fix * Fix line widths * Revert "ui test fix" This reverts commit 2d15ec058a216e3f92d713f1174603a2bb1eac65. * Upgrade to scale-info 0.11.0 * Revert "Upgrade to scale-info 0.11.0" This reverts commit 047bb179085a0059c36cd20ab405f55cf0867e28. * Add Runtime type * Update to scale-info 0.12 * Update to scale-info 1.0 * Update frame-metadata to version 14.0.0 * Patch finality-grandpa until release available * Fix metadata tests * Fix metadata tests * Fmt * Remove patched finality-grandpa * Fix tests, use scale_info imports * Fix pallet tests * Add BlockNumber TypeInfo bound * ui test fix * Cargo.lock * Remove pallet metadata * Cargo.lock * Add missing scale-info dependency * Remove pallet event metadata * Fix error * Fix collective errors * Semicolol * Fmt * Remove another metadata attribute * Add new variant to custom digest TypeInfo * Fmt * Cargo.lock from master * Remove comma lol * Fix example call error * Fix example call error properly Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
353 lines
12 KiB
Rust
353 lines
12 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) 2017-2021 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.
|
|
|
|
//! Version module for the Substrate runtime; Provides a function that returns the runtime version.
|
|
|
|
#![cfg_attr(not(feature = "std"), no_std)]
|
|
|
|
#[cfg(feature = "std")]
|
|
use serde::{Deserialize, Serialize};
|
|
#[cfg(feature = "std")]
|
|
use std::collections::HashSet;
|
|
#[cfg(feature = "std")]
|
|
use std::fmt;
|
|
|
|
use codec::{Decode, Encode};
|
|
use scale_info::TypeInfo;
|
|
pub use sp_runtime::create_runtime_str;
|
|
use sp_runtime::RuntimeString;
|
|
#[doc(hidden)]
|
|
pub use sp_std;
|
|
|
|
#[cfg(feature = "std")]
|
|
use sp_runtime::{generic::BlockId, traits::Block as BlockT};
|
|
|
|
#[cfg(feature = "std")]
|
|
pub mod embed;
|
|
|
|
/// An attribute that accepts a version declaration of a runtime and generates a custom wasm
|
|
/// section with the equivalent contents.
|
|
///
|
|
/// The custom section allows to read the version of the runtime without having to execute any
|
|
/// code. Instead, the generated custom section can be relatively easily parsed from the wasm
|
|
/// binary. The identifier of the custom section is "runtime_version".
|
|
///
|
|
/// A shortcoming of this macro is that it is unable to embed information regarding supported
|
|
/// APIs. This is supported by the `construct_runtime!` macro.
|
|
///
|
|
/// # Usage
|
|
///
|
|
/// This macro accepts a const item like the following:
|
|
///
|
|
/// ```rust
|
|
/// use sp_version::{create_runtime_str, RuntimeVersion};
|
|
///
|
|
/// #[sp_version::runtime_version]
|
|
/// pub const VERSION: RuntimeVersion = RuntimeVersion {
|
|
/// spec_name: create_runtime_str!("test"),
|
|
/// impl_name: create_runtime_str!("test"),
|
|
/// authoring_version: 10,
|
|
/// spec_version: 265,
|
|
/// impl_version: 1,
|
|
/// apis: RUNTIME_API_VERSIONS,
|
|
/// transaction_version: 2,
|
|
/// };
|
|
///
|
|
/// # const RUNTIME_API_VERSIONS: sp_version::ApisVec = sp_version::create_apis_vec!([]);
|
|
/// ```
|
|
///
|
|
/// It will pass it through and add code required for emitting a custom section. The
|
|
/// information that will go into the custom section is parsed from the item declaration. Due
|
|
/// to that, the macro is somewhat rigid in terms of the code it accepts. There are the
|
|
/// following considerations:
|
|
///
|
|
/// - The `spec_name` and `impl_name` must be set by a macro-like expression. The name of the
|
|
/// macro doesn't matter though.
|
|
///
|
|
/// - `authoring_version`, `spec_version`, `impl_version` and `transaction_version` must be set
|
|
/// by a literal. Literal must be an integer. No other expressions are allowed there. In
|
|
/// particular, you can't supply a constant variable.
|
|
///
|
|
/// - `apis` doesn't have any specific constraints. This is because this information doesn't
|
|
/// get into the custom section and is not parsed.
|
|
///
|
|
/// # Compilation Target & "std" feature
|
|
///
|
|
/// This macro assumes it will be used within a runtime. By convention, a runtime crate defines
|
|
/// a feature named "std". This feature is enabled when the runtime is compiled to native code
|
|
/// and disabled when it is compiled to the wasm code.
|
|
///
|
|
/// The custom section can only be emitted while compiling to wasm. In order to detect the
|
|
/// compilation target we use the "std" feature. This macro will emit the custom section only
|
|
/// if the "std" feature is **not** enabled.
|
|
///
|
|
/// Including this macro in the context where there is no "std" feature and the code is not
|
|
/// compiled to wasm can lead to cryptic linking errors.
|
|
pub use sp_version_proc_macro::runtime_version;
|
|
|
|
/// The identity of a particular API interface that the runtime might provide.
|
|
///
|
|
/// The id is generated by hashing the name of the runtime api with BLAKE2 using a hash size
|
|
/// of 8 bytes.
|
|
///
|
|
/// The name of the runtime api is the name of the trait when using `decl_runtime_apis!` macro.
|
|
pub type ApiId = [u8; 8];
|
|
|
|
/// A vector of pairs of `ApiId` and a `u32` for version.
|
|
pub type ApisVec = sp_std::borrow::Cow<'static, [(ApiId, u32)]>;
|
|
|
|
/// Create a vector of Api declarations.
|
|
#[macro_export]
|
|
macro_rules! create_apis_vec {
|
|
( $y:expr ) => {
|
|
$crate::sp_std::borrow::Cow::Borrowed(&$y)
|
|
};
|
|
}
|
|
|
|
/// Runtime version.
|
|
/// This should not be thought of as classic Semver (major/minor/tiny).
|
|
/// This triplet have different semantics and mis-interpretation could cause problems.
|
|
/// In particular: bug fixes should result in an increment of `spec_version` and possibly
|
|
/// `authoring_version`, absolutely not `impl_version` since they change the semantics of the
|
|
/// runtime.
|
|
#[derive(Clone, PartialEq, Eq, Encode, Decode, Default, sp_runtime::RuntimeDebug, TypeInfo)]
|
|
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
|
|
#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))]
|
|
pub struct RuntimeVersion {
|
|
/// Identifies the different Substrate runtimes. There'll be at least polkadot and node.
|
|
/// A different on-chain spec_name to that of the native runtime would normally result
|
|
/// in node not attempting to sync or author blocks.
|
|
pub spec_name: RuntimeString,
|
|
|
|
/// Name of the implementation of the spec. This is of little consequence for the node
|
|
/// and serves only to differentiate code of different implementation teams. For this
|
|
/// codebase, it will be parity-polkadot. If there were a non-Rust implementation of the
|
|
/// Polkadot runtime (e.g. C++), then it would identify itself with an accordingly different
|
|
/// `impl_name`.
|
|
pub impl_name: RuntimeString,
|
|
|
|
/// `authoring_version` is the version of the authorship interface. An authoring node
|
|
/// will not attempt to author blocks unless this is equal to its native runtime.
|
|
pub authoring_version: u32,
|
|
|
|
/// Version of the runtime specification. A full-node will not attempt to use its native
|
|
/// runtime in substitute for the on-chain Wasm runtime unless all of `spec_name`,
|
|
/// `spec_version` and `authoring_version` are the same between Wasm and native.
|
|
pub spec_version: u32,
|
|
|
|
/// Version of the implementation of the specification. Nodes are free to ignore this; it
|
|
/// serves only as an indication that the code is different; as long as the other two versions
|
|
/// are the same then while the actual code may be different, it is nonetheless required to
|
|
/// do the same thing.
|
|
/// Non-consensus-breaking optimizations are about the only changes that could be made which
|
|
/// would result in only the `impl_version` changing.
|
|
pub impl_version: u32,
|
|
|
|
/// List of supported API "features" along with their versions.
|
|
#[cfg_attr(
|
|
feature = "std",
|
|
serde(
|
|
serialize_with = "apis_serialize::serialize",
|
|
deserialize_with = "apis_serialize::deserialize",
|
|
)
|
|
)]
|
|
pub apis: ApisVec,
|
|
|
|
/// All existing dispatches are fully compatible when this number doesn't change. If this
|
|
/// number changes, then `spec_version` must change, also.
|
|
///
|
|
/// This number must change when an existing dispatchable (module ID, dispatch ID) is changed,
|
|
/// either through an alteration in its user-level semantics, a parameter
|
|
/// added/removed/changed, a dispatchable being removed, a module being removed, or a
|
|
/// dispatchable/module changing its index.
|
|
///
|
|
/// It need *not* change when a new module is added or when a dispatchable is added.
|
|
pub transaction_version: u32,
|
|
}
|
|
|
|
#[cfg(feature = "std")]
|
|
impl fmt::Display for RuntimeVersion {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
write!(
|
|
f,
|
|
"{}-{} ({}-{}.tx{}.au{})",
|
|
self.spec_name,
|
|
self.spec_version,
|
|
self.impl_name,
|
|
self.impl_version,
|
|
self.transaction_version,
|
|
self.authoring_version,
|
|
)
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "std")]
|
|
impl RuntimeVersion {
|
|
/// Check if this version matches other version for calling into runtime.
|
|
pub fn can_call_with(&self, other: &RuntimeVersion) -> bool {
|
|
self.spec_version == other.spec_version &&
|
|
self.spec_name == other.spec_name &&
|
|
self.authoring_version == other.authoring_version
|
|
}
|
|
|
|
/// Check if the given api with `api_id` is implemented and the version passes the given
|
|
/// `predicate`.
|
|
pub fn has_api_with<P: Fn(u32) -> bool>(&self, id: &ApiId, predicate: P) -> bool {
|
|
self.apis.iter().any(|(s, v)| s == id && predicate(*v))
|
|
}
|
|
|
|
/// Returns the api version found for api with `id`.
|
|
pub fn api_version(&self, id: &ApiId) -> Option<u32> {
|
|
self.apis.iter().find_map(|a| (a.0 == *id).then(|| a.1))
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "std")]
|
|
#[derive(Debug)]
|
|
pub struct NativeVersion {
|
|
/// Basic runtime version info.
|
|
pub runtime_version: RuntimeVersion,
|
|
/// Authoring runtimes that this native runtime supports.
|
|
pub can_author_with: HashSet<u32>,
|
|
}
|
|
|
|
#[cfg(feature = "std")]
|
|
impl NativeVersion {
|
|
/// Check if this version matches other version for authoring blocks.
|
|
///
|
|
/// # Return
|
|
///
|
|
/// - Returns `Ok(())` when authoring is supported.
|
|
/// - Returns `Err(_)` with a detailed error when authoring is not supported.
|
|
pub fn can_author_with(&self, other: &RuntimeVersion) -> Result<(), String> {
|
|
if self.runtime_version.spec_name != other.spec_name {
|
|
Err(format!(
|
|
"`spec_name` does not match `{}` vs `{}`",
|
|
self.runtime_version.spec_name, other.spec_name,
|
|
))
|
|
} else if self.runtime_version.authoring_version != other.authoring_version &&
|
|
!self.can_author_with.contains(&other.authoring_version)
|
|
{
|
|
Err(format!(
|
|
"`authoring_version` does not match `{version}` vs `{other_version}` and \
|
|
`can_author_with` not contains `{other_version}`",
|
|
version = self.runtime_version.authoring_version,
|
|
other_version = other.authoring_version,
|
|
))
|
|
} else {
|
|
Ok(())
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "std")]
|
|
/// Returns the version of the native runtime.
|
|
pub trait GetNativeVersion {
|
|
/// Returns the version of the native runtime.
|
|
fn native_version(&self) -> &NativeVersion;
|
|
}
|
|
|
|
/// Something that can provide the runtime version at a given block.
|
|
#[cfg(feature = "std")]
|
|
pub trait GetRuntimeVersionAt<Block: BlockT> {
|
|
/// Returns the version of runtime at the given block.
|
|
fn runtime_version(&self, at: &BlockId<Block>) -> Result<RuntimeVersion, String>;
|
|
}
|
|
|
|
#[cfg(feature = "std")]
|
|
impl<T: GetRuntimeVersionAt<Block>, Block: BlockT> GetRuntimeVersionAt<Block>
|
|
for std::sync::Arc<T>
|
|
{
|
|
fn runtime_version(&self, at: &BlockId<Block>) -> Result<RuntimeVersion, String> {
|
|
(&**self).runtime_version(at)
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "std")]
|
|
impl<T: GetNativeVersion> GetNativeVersion for std::sync::Arc<T> {
|
|
fn native_version(&self) -> &NativeVersion {
|
|
(&**self).native_version()
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "std")]
|
|
mod apis_serialize {
|
|
use super::*;
|
|
use impl_serde::serialize as bytes;
|
|
use serde::{de, ser::SerializeTuple, Serializer};
|
|
|
|
#[derive(Serialize)]
|
|
struct ApiId<'a>(#[serde(serialize_with = "serialize_bytesref")] &'a super::ApiId, &'a u32);
|
|
|
|
pub fn serialize<S>(apis: &ApisVec, ser: S) -> Result<S::Ok, S::Error>
|
|
where
|
|
S: Serializer,
|
|
{
|
|
let len = apis.len();
|
|
let mut seq = ser.serialize_tuple(len)?;
|
|
for (api, ver) in &**apis {
|
|
seq.serialize_element(&ApiId(api, ver))?;
|
|
}
|
|
seq.end()
|
|
}
|
|
|
|
pub fn serialize_bytesref<S>(&apis: &&super::ApiId, ser: S) -> Result<S::Ok, S::Error>
|
|
where
|
|
S: Serializer,
|
|
{
|
|
bytes::serialize(apis, ser)
|
|
}
|
|
|
|
#[derive(Deserialize)]
|
|
struct ApiIdOwned(#[serde(deserialize_with = "deserialize_bytes")] super::ApiId, u32);
|
|
|
|
pub fn deserialize<'de, D>(deserializer: D) -> Result<ApisVec, D::Error>
|
|
where
|
|
D: de::Deserializer<'de>,
|
|
{
|
|
struct Visitor;
|
|
impl<'de> de::Visitor<'de> for Visitor {
|
|
type Value = ApisVec;
|
|
|
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
formatter.write_str("a sequence of api id and version tuples")
|
|
}
|
|
|
|
fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
|
|
where
|
|
V: de::SeqAccess<'de>,
|
|
{
|
|
let mut apis = Vec::new();
|
|
while let Some(value) = visitor.next_element::<ApiIdOwned>()? {
|
|
apis.push((value.0, value.1));
|
|
}
|
|
Ok(apis.into())
|
|
}
|
|
}
|
|
deserializer.deserialize_seq(Visitor)
|
|
}
|
|
|
|
pub fn deserialize_bytes<'de, D>(d: D) -> Result<super::ApiId, D::Error>
|
|
where
|
|
D: de::Deserializer<'de>,
|
|
{
|
|
let mut arr = [0; 8];
|
|
bytes::deserialize_check_len(d, bytes::ExpectedLen::Exact(&mut arr[..]))?;
|
|
Ok(arr)
|
|
}
|
|
}
|