显示软件包…
3 个稳定版本
2.1.2 | 2021年6月23日 |
---|---|
2.0.2 | 2021年4月3日 |
2.0.1 | 2021年4月2日 |
#3 in #tetcoin
673 每月下载量
用于 157 个软件包 (8 个直接使用)
145KB
2K SLoC
Tetcore 运行时接口
此软件包提供围绕运行时接口的类型、特性和宏。运行时接口是 Tetcore 运行时与 Tetcore 节点之间的一种固定接口。对于原生运行时,接口映射到实现的直接函数调用。对于 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 运行时和节点之间传递的方式。每个策略还提供了一个 derive 宏来简化实现。
性能
为了在调用节点时不再浪费任何性能,当在 wasm 运行时和节点之间传递参数时,并非所有类型都被 SCALE 编码。对于大多数原始字节类型,如 Vec<u8>
,[u8]
或 [u8; N]
,我们直接传递它们,而不在前面进行 SCALE 编码。每种类型的 RIType
实现提供了更多有关数据如何传递的信息。
声明运行时接口
声明运行时接口类似于在 Rust 中声明一个特质
#[tp_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 |
Identity |
u16 |
u16 |
Identity |
u32 |
u32 |
Identity |
u64 |
u64 |
Identity |
i128 |
u32 |
v.as_ptr() (16 字节数组的指针) |
i8 |
i8 |
Identity |
i16 |
i16 |
Identity |
i32 |
i32 |
Identity |
i64 |
i64 |
Identity |
u128 |
u32 |
v.as_ptr() (16 字节数组的指针) |
bool |
u8 |
ifv{ 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> whereT:Encode |
u64 |
lete=v.encode(); e.len()32bit<< 32 |e.as_ptr()32bit |
&[T] whereT:Encode |
u64 |
lete=v.encode(); e.len()32bit<< 32 |e.as_ptr()32bit |
[u8;N] |
u32 |
v.as_ptr() |
*constT |
u32 |
Identity |
Option<T> |
u64 |
lete=v.encode(); e.len()32bit<< 32 |e.as_ptr()32bit |
TwhereT: PassBy<PassBy=Inner> |
Depends on inner | Depends on inner |
TwhereT: PassBy<PassBy=Codec> |
u64 |
v.len()32bit<< 32 |v.as_ptr()32bit |
Identity
表示值被直接转换为相应的 FFI 类型。
许可证:Apache-2.0
依赖项
~2.5–10MB
~83K SLoC