46 个版本 (26 个重大变更)
28.0.0 | 2024年6月21日 |
---|---|
27.0.0 | 2024年4月8日 |
26.0.0 | 2024年2月26日 |
25.0.0 | 2024年2月13日 |
2.0.0-alpha.5 | 2020年3月24日 |
1417 在 魔法豆
47,996 每月下载量
在 763 个 仓库中使用(24 个直接使用)
185KB
2.5K SLoC
Substrate 运行时接口
此软件包提供了围绕运行时接口的类型、特性和宏。运行时接口是 Substrate 运行时和 Substrate 节点之间的固定接口。对于原生运行时,接口映射到实现的直接函数调用。对于 wasm 运行时,接口映射到外部函数调用。这些外部函数由 wasm 执行器导出,并映射到与原生调用相同的实现。
在运行时接口中使用类型
在运行时接口中用作参数或返回值的任何类型都需要实现RIType
。关联类型FFIType
是在FFI函数中表示实际类型的类型。例如,[T]
由一个u64
表示。切片指针和长度将被映射到一个u64
值。更多详细信息请参阅此表格。当从wasm运行时调用到node时,使用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> 其中T:编码 |
u64 |
lete=v.encode(); e.len()32位<< 32 |e.as_ptr()32位 |
&[T] 其中T:编码 |
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位 |
T其中T: PassBy<PassBy=Inner> |
依赖于内部 | 依赖于内部 |
T其中T: PassBy<PassBy=Codec> |
u64 |
v.len()32位<< 32 |v.as_ptr()32位 |
Identity
表示值直接转换为相应的FFI类型。
许可证:Apache-2.0
依赖项
~4–10MB
~112K SLoC