#tetcoin #framework #blockchain #crypto

无需 std tp-runtime-interface

Tetcore 运行时接口

显示软件包…

3 个稳定版本

2.1.2 2021年6月23日
2.0.2 2021年4月3日
2.0.1 2021年4月2日

#3 in #tetcoin

Download history 503/week @ 2024-03-28 228/week @ 2024-04-04 235/week @ 2024-04-11 344/week @ 2024-04-18 245/week @ 2024-04-25 210/week @ 2024-05-02 210/week @ 2024-05-09 223/week @ 2024-05-16 199/week @ 2024-05-23 229/week @ 2024-05-30 143/week @ 2024-06-06 177/week @ 2024-06-13 308/week @ 2024-06-20 104/week @ 2024-06-27 60/week @ 2024-07-04 200/week @ 2024-07-11

673 每月下载量
用于 157 个软件包 (8 个直接使用)

Apache-2.0

145KB
2K SLoC

Tetcore 运行时接口

此软件包提供围绕运行时接口的类型、特性和宏。运行时接口是 Tetcore 运行时与 Tetcore 节点之间的一种固定接口。对于原生运行时,接口映射到实现的直接函数调用。对于 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 运行时和节点之间传递的方式。每个策略还提供了一个 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