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.52020年3月24日

1417魔法豆

Download history 11110/week @ 2024-04-16 11674/week @ 2024-04-23 9873/week @ 2024-04-30 10586/week @ 2024-05-07 9635/week @ 2024-05-14 9852/week @ 2024-05-21 11763/week @ 2024-05-28 9717/week @ 2024-06-04 8179/week @ 2024-06-11 10526/week @ 2024-06-18 11414/week @ 2024-06-25 8022/week @ 2024-07-02 11332/week @ 2024-07-09 12979/week @ 2024-07-16 11092/week @ 2024-07-23 10475/week @ 2024-07-30

47,996 每月下载量
763 仓库中使用(24 个直接使用)

Apache-2.0

185KB
2.5K SLoC

Substrate 运行时接口

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

在运行时接口中使用类型

在运行时接口中用作参数或返回值的任何类型都需要实现RIType。关联类型FFIType是在FFI函数中表示实际类型的类型。例如,[T]由一个u64表示。切片指针和长度将被映射到一个u64值。更多详细信息请参阅此表格。当从wasm运行时调用到node时,使用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> 其中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