显示包…
10 个版本 (稳定版)
22.0.0-pre.1 | 2024 年 6 月 23 日 |
---|---|
19.0.0-pre.1 | 2024 年 6 月 23 日 |
18.0.0 | 2024 年 1 月 29 日 |
7.0.5 | 2023 年 12 月 28 日 |
#73 在 #pass
1,164 每月下载次数
用于 12 个包(直接使用 3 个)
125KB
1.5K SLoC
Substrate 运行时接口
此包提供了围绕运行时接口的类型、特性和宏。运行时接口是 Substrate 运行时与 Substrate 节点之间的固定接口。对于本地运行时,接口映射到实现的直接函数调用。对于 wasm 运行时,接口映射到外部函数调用。这些外部函数由 wasm 执行器导出,并且映射到与本地调用相同的实现。
在运行时接口中使用类型
任何应作为参数或返回值用于运行时接口的类型都需要实现 RIType
。关联类型 FFIType
是在 FFI 函数中用于表示实际类型的类型。例如,[T]
由 u64
表示。切片指针和长度将映射到 u64
值。更多信息请参阅此 表格。当从 wasm 运行时调用节点时,使用 FFI 函数定义。
特性用于将类型转换为相应的 RIType::FFIType
。根据类型应在函数签名中的位置和方式,需要实现以下特性的组合
- 作为函数参数传递:请参考
wasm::IntoFFIValue
和host::FromFFIValue
- 作为函数返回值:请参考
wasm::FromFFIValue
和host::IntoFFIValue
- 作为可变函数参数传递:
host::IntoPreallocatedFFIValue
这些特性为大多数常见类型如[T]
、Vec<T>
、数组和原始类型实现了。
对于自定义类型,我们提供了PassBy
特性和定义类型在wasm运行时和node之间传递方式的策略。每个策略也提供了一个derive宏以简化实现。
性能
为了在调用node时不浪费任何性能,当在wasm运行时和node之间传递参数时,并不是所有类型都会进行SCALE编码。对于大多数原始字节类型如Vec<u8>
、[u8]
或[u8; N]
,我们直接传递它们,而不在前面进行SCALE编码。每个类型实现的RIType
提供了关于数据传递方式的更多信息。
声明运行时接口
声明运行时接口类似于在Rust中声明特质。
#[sp_runtime_interface::runtime_interface]
trait RuntimeInterface {
fn some_function(value: &[u8]) -> bool {
value.iter().all(|v| *v > 125)
}
}
有关声明运行时接口的更多信息,请参阅#[runtime_interface]
。
FFI类型和转换
以下表格说明了类型值在wasm和宿主之间传递的方式以及如何将其转换为相应的类型。
类型 | FFI类型 | 转换 |
---|---|---|
u8 |
u8 |
标识 |
u16 |
u16 |
标识 |
u32 |
u32 |
标识 |
u64 |
u64 |
标识 |
i128 |
u32 |
v.as_ptr() (16字节数组的指针) |
i8 |
i8 |
标识 |
i16 |
i16 |
标识 |
i32 |
i32 |
标识 |
i64 |
i64 |
标识 |
u128 |
u32 |
v.as_ptr() (16字节数组的指针) |
bool |
u8 |
ifv{ 1 } else { 0 } |
&str |
u64 |
v.len()32位<< 32 |v.as_ptr()32位 |
&[u8] |
u64 |
v.len()32位<< 32 |v.as_ptr()32位 |
Vec<u8> |
u64 |
v.len()32位<< 32 |v.as_ptr()32位 |
Vec<T> whereT:编码 |
u64 |
lete=v.encode(); e.len()32位<< 32 |e.as_ptr()32位 |
&[T] whereT:编码 |
u64 |
lete=v.encode(); e.len()32位<< 32 |e.as_ptr()32位 |
[u8;N] |
u32 |
v.as_ptr() |
*constT |
u32 |
标识 |
Option<T> |
u64 |
lete=v.encode(); e.len()32位<< 32 |e.as_ptr()32位 |
TwhereT: PassBy<PassBy=Inner> |
依赖于内部 | 依赖于内部 |
TwhereT: PassBy<PassBy=Codec> |
u64 |
v.len()32位<< 32 |v.as_ptr()32位 |
Identity
表示值直接转换为相应的FFI类型。
许可证:Apache-2.0
依赖项
~4–18MB
~251K SLoC