#run-time #interface #substrate #host #pointers #pass #traits

no-std gp-runtime-interface

Substrate 运行时接口

显示包…

10 个版本 (稳定版)

22.0.0-pre.12024 年 6 月 23 日
19.0.0-pre.12024 年 6 月 23 日
18.0.0 2024 年 1 月 29 日
7.0.5 2023 年 12 月 28 日

#73#pass

Download history 237/week @ 2024-04-17 145/week @ 2024-04-24 138/week @ 2024-05-01 253/week @ 2024-05-08 203/week @ 2024-05-15 172/week @ 2024-05-22 119/week @ 2024-05-29 151/week @ 2024-06-05 153/week @ 2024-06-12 367/week @ 2024-06-19 210/week @ 2024-06-26 274/week @ 2024-07-03 291/week @ 2024-07-10 266/week @ 2024-07-17 340/week @ 2024-07-24 225/week @ 2024-07-31

1,164 每月下载次数
用于 12 个包(直接使用 3 个)

Apache-2.0

125KB
1.5K SLoC

Substrate 运行时接口

此包提供了围绕运行时接口的类型、特性和宏。运行时接口是 Substrate 运行时与 Substrate 节点之间的固定接口。对于本地运行时,接口映射到实现的直接函数调用。对于 wasm 运行时,接口映射到外部函数调用。这些外部函数由 wasm 执行器导出,并且映射到与本地调用相同的实现。

在运行时接口中使用类型

任何应作为参数或返回值用于运行时接口的类型都需要实现 RIType。关联类型 FFIType 是在 FFI 函数中用于表示实际类型的类型。例如,[T]u64 表示。切片指针和长度将映射到 u64 值。更多信息请参阅此 表格。当从 wasm 运行时调用节点时,使用 FFI 函数定义。

特性用于将类型转换为相应的 RIType::FFIType。根据类型应在函数签名中的位置和方式,需要实现以下特性的组合

  1. 作为函数参数传递:请参考wasm::IntoFFIValuehost::FromFFIValue
  2. 作为函数返回值:请参考wasm::FromFFIValuehost::IntoFFIValue
  3. 作为可变函数参数传递: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