Bumps the known_good_semver group with 2 updates: [syn](https://github.com/dtolnay/syn) and [serde_yaml](https://github.com/dtolnay/serde-yaml). Updates `syn` from 2.0.41 to 2.0.43 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/dtolnay/syn/releases">syn's releases</a>.</em></p> <blockquote> <h2>2.0.43</h2> <ul> <li>Insert trailing comma if not already present when printing a 1-tuple in pattern position (<a href="https://redirect.github.com/dtolnay/syn/issues/1553">#1553</a>)</li> </ul> <h2>2.0.42</h2> <ul> <li>Documentation improvements</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/dtolnay/syn/commit/95ee05214030f936b8db3ee295188d5dc2c89621"><code>95ee052</code></a> Release 2.0.43</li> <li><a href="https://github.com/dtolnay/syn/commit/7383e81b1ab6f9983692ebd9d6caa54aeff8fb85"><code>7383e81</code></a> Merge pull request <a href="https://redirect.github.com/dtolnay/syn/issues/1559">#1559</a> from dtolnay/pattuple</li> <li><a href="https://github.com/dtolnay/syn/commit/712fde5a6fce0e7bee3615ab5c7545ce442bf034"><code>712fde5</code></a> Fix ToTokens for PatTuple to insert trailing comma</li> <li><a href="https://github.com/dtolnay/syn/commit/ed9b94e3395cffb33db4254439e23dbc3a2e9e43"><code>ed9b94e</code></a> Merge pull request <a href="https://redirect.github.com/dtolnay/syn/issues/1558">#1558</a> from dtolnay/tupletests</li> <li><a href="https://github.com/dtolnay/syn/commit/ec8517b33c137c48c38b74ba5be21815763a50f5"><code>ec8517b</code></a> Add tuple comma tests</li> <li><a href="https://github.com/dtolnay/syn/commit/3cf16c76bdbe4e16261a167592a77edab853c6aa"><code>3cf16c7</code></a> Merge pull request <a href="https://redirect.github.com/dtolnay/syn/issues/1557">#1557</a> from dtolnay/snapshotparsequote</li> <li><a href="https://github.com/dtolnay/syn/commit/553549ff12358a6ad95baaed2601a9dab541d693"><code>553549f</code></a> Generalize snapshot parsing to types that do not implement Parse</li> <li><a href="https://github.com/dtolnay/syn/commit/f9ad833e4a77c61003861f4e14d16b10b9708f9e"><code>f9ad833</code></a> Merge pull request <a href="https://redirect.github.com/dtolnay/syn/issues/1556">#1556</a> from dtolnay/punctuatedsnapshot</li> <li><a href="https://github.com/dtolnay/syn/commit/131b40ba2904ec8755bb34466f369072dc34d588"><code>131b40b</code></a> Debug impl for punctuated::Pairs superseded by Punctuated</li> <li><a href="https://github.com/dtolnay/syn/commit/3f12d652a8871955a7e27e0369933288bc387dd5"><code>3f12d65</code></a> Include punctuation tokens in snapshot tests containing Punctuated</li> <li>Additional commits viewable in <a href="https://github.com/dtolnay/syn/compare/2.0.41...2.0.43">compare view</a></li> </ul> </details> <br /> Updates `serde_yaml` from 0.9.27 to 0.9.29 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/dtolnay/serde-yaml/releases">serde_yaml's releases</a>.</em></p> <blockquote> <h2>0.9.29</h2> <ul> <li>Turn on <code>deny(unsafe_op_in_unsafe_fn)</code> lint</li> </ul> <h2>0.9.28</h2> <ul> <li>Update <code>unsafe-libyaml</code> dependency to pull in unaligned write fix</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/dtolnay/serde-yaml/commit/b957d2b15d7f3d96279997800fa0610b41b8fe00"><code>b957d2b</code></a> Release 0.9.29</li> <li><a href="https://github.com/dtolnay/serde-yaml/commit/007fc2d5c1987847a0f1ac95885c56f8e6e5f808"><code>007fc2d</code></a> Merge pull request <a href="https://redirect.github.com/dtolnay/serde-yaml/issues/401">#401</a> from dtolnay/unsafeop</li> <li><a href="https://github.com/dtolnay/serde-yaml/commit/5bac2475b0017d6a635d641df17165d71b951f0e"><code>5bac247</code></a> Fill in unsafe blocks inside unsafe functions</li> <li><a href="https://github.com/dtolnay/serde-yaml/commit/0f6dba18ab8db598c4963e9242afd490ee0202f0"><code>0f6dba1</code></a> Turn on deny(unsafe_op_in_unsafe_fn)</li> <li><a href="https://github.com/dtolnay/serde-yaml/commit/1b6e44837f0db0a1c15537311fed3579a7e8c6d2"><code>1b6e448</code></a> Release 0.9.28</li> <li><a href="https://github.com/dtolnay/serde-yaml/commit/ec1a3145d7b6b809f7b3aa2d9dcd7db30f0588d4"><code>ec1a314</code></a> Force unsafe-libyaml version that contains unaligned write fix</li> <li><a href="https://github.com/dtolnay/serde-yaml/commit/a6b2dc075a6eb1bed0d927df7b7ac2bb288f3bb4"><code>a6b2dc0</code></a> Update name of blocks_in_if_conditions clippy lint</li> <li>See full diff in <a href="https://github.com/dtolnay/serde-yaml/compare/0.9.27...0.9.29">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Substrate runtime interface
This crate provides types, traits and macros around runtime interfaces. A runtime interface is a fixed interface between a Substrate runtime and a Substrate node. For a native runtime the interface maps to a direct function call of the implementation. For a wasm runtime the interface maps to an external function call. These external functions are exported by the wasm executor and they map to the same implementation as the native calls.
Using a type in a runtime interface
Any type that should be used in a runtime interface as argument or return value needs to implement [RIType]. The
associated type
FFIType is
the type that is used in the FFI function to represent the actual type. For example [T] is represented by an u64.
The slice pointer and the length will be mapped to an u64 value. For more information see this
table. The FFI function
definition is used when calling from the wasm runtime into the node.
Traits are used to convert from a type to the corresponding
RIType::FFIType.
Depending on where and how a type should be used in a function signature, a combination of the following traits need to
be implemented:
- Pass as function argument: [
wasm::IntoFFIValue] and [host::FromFFIValue] - As function return value: [
wasm::FromFFIValue] and [host::IntoFFIValue] - Pass as mutable function argument: [
host::IntoPreallocatedFFIValue]
The traits are implemented for most of the common types like [T], Vec<T>, arrays and primitive types.
For custom types, we provide the
PassBy trait and strategies that
define how a type is passed between the wasm runtime and the node. Each strategy also provides a derive macro to
simplify the implementation.
Performance
To not waste any more performance when calling into the node, not all types are SCALE encoded when being passed as
arguments between the wasm runtime and the node. For most types that are raw bytes like Vec<u8>, [u8] or [u8; N]
we pass them directly, without SCALE encoding them in front of. The implementation of [RIType] each type provides more
information on how the data is passed.
Declaring a runtime interface
Declaring a runtime interface is similar to declaring a trait in Rust:
#[sp_runtime_interface::runtime_interface]
trait RuntimeInterface {
fn some_function(value: &[u8]) -> bool {
value.iter().all(|v| *v > 125)
}
}
For more information on declaring a runtime interface, see
#[runtime_interface].
FFI type and conversion
The following table documents how values of types are passed between the wasm and the host side and how they are converted into the corresponding type.
| Type | FFI type | Conversion |
|---|---|---|
u8 |
u8 |
Identity |
u16 |
u16 |
Identity |
u32 |
u32 |
Identity |
u64 |
u64 |
Identity |
i128 |
u32 |
v.as_ptr() (pointer to a 16 byte array) |
i8 |
i8 |
Identity |
i16 |
i16 |
Identity |
i32 |
i32 |
Identity |
i64 |
i64 |
Identity |
u128 |
u32 |
v.as_ptr() (pointer to a 16 byte array) |
bool |
u8 |
if v { 1 } else { 0 } |
&str |
u64 |
v.len() 32bit << 32 | v.as_ptr() 32bit |
&[u8] |
u64 |
v.len() 32bit << 32 | v.as_ptr() 32bit |
Vec<u8> |
u64 |
v.len() 32bit << 32 | v.as_ptr() 32bit |
Vec<T> where T: Encode |
u64 |
let e = v.encode();e.len() 32bit << 32 | e.as_ptr() 32bit |
&[T] where T: Encode |
u64 |
let e = v.encode();e.len() 32bit << 32 | e.as_ptr() 32bit |
[u8; N] |
u32 |
v.as_ptr() |
*const T |
u32 |
Identity |
Option<T> |
u64 |
let e = v.encode();e.len() 32bit << 32 | e.as_ptr() 32bit |
T where T: PassBy<PassBy=Inner> |
Depends on inner | Depends on inner |
T where T: PassBy<PassBy=Codec> |
u64 |
v.len() 32bit << 32 | v.as_ptr() 32bit |
Identity means that the value is converted directly into the corresponding FFI type.
License: Apache-2.0