WasmEdge Rust SDK 发布新版本
伴随着 WasmEdge 0.10.1 发布,WasmEdge Rust bindings 的全新版本也闪亮登场:wasmedge-sdk v0.2.0
和wasmedge-sys v0.8.0
。 你可以在 这里 找到相关 API 文档和源代码。
下图显示了 WasmEdge Rust bindings 的架构。 wasmedge-sys
crate 定义了一组低级 Rust API,它们简单地包了 WasmEdge C-API 并提供相应的安全版本,而 wasmedge-sdk
定义了一组围绕应用程序的高级 Rust API。
我们建议大多数应用程序开发者使用 wasmedge-sdk
crate。 因此,本文将重点介绍 wasmedge-sdk
。 如果对 WasmEdge 低级 Rust API 的内部情况感兴趣,请可以查看wasmedge-sys
源代码。
WasmEdge Rust bindings SDK 使 Rust 应用程序能够嵌入 WebAssembly 函数或模块。 这对于基于 Rust 的云原生或区块链基础设施软件特别有用,因为它们需要以安全有效的方式支持不受信任的用户函数。
wasmedge-sdk
crate 的主要设计目标是使开发者能够使用 WasmEdge 轻松安全地将第三方代码合并到他们的 rust 应用程序中。 wasmedge-sdk
crate 旨在为 Rust 开发者提供顺滑的体验。
下面让我们来看一个简单的例子吧!
从 wasmedge-sdk
开始
这个例子展示了如何从 Rust 程序运行 WasmEdge host 函数。 该函数也是用 Rust 编写的。 你也可以使用 C、TinyGo 或 JavaScript 等编程语言编写 WasmEdge 函数。
这里我们使用一个简单的 hello world
程序来解释 wasmedge-sdk
是如何工作的。 此示例演示了如何完成以下工作。
1.通过ImportObjectBuilder
加载第三方 native 函数 2.加载 native 函数生成的 Wasm 模块
有关
wasmedge-sdk
的更多示例,请查看此处。
首先,确保已经在本地系统上安装了 Rust 和 WasmEdge。 如果想使用 WasmEdge 的 WasmEdgeProcess
插件,请注意 Linux
是唯一支持的操作系统。
接下来,从 WasmEdge repo 中获取 wasmedge-sdk
示例。
$ git clone https://github.com/WasmEdge/WasmEdge.git $ cd /bindings/rust/
然后,使用下面的命令行从 wasmedge-sdk 文件运行 hello world 示例。
cargo run -p wamedge-sdk --example hello_world -- --nocapture
如果命令行成功运行,会看到 Hello, world!
在终端中打印出来,如下图所示。
现在让我们深入研究代码。 上述 Hello World
示例的源代码可以在这里找到。
让我们立即获取所有 imports 并开始:
// 如果使用 < 1.63 版本的 rust,请添加此特性 // #![feature(explicit_generic_args_with_impl_trait)] use wasmedge_sdk::{params, Executor, ImportObjectBuilder, Module, Store}; use wasmedge_sys::WasmValue; use wasmedge_types::wat2wasm;
定义一个 native 函数并创建一个 ImportObject
首先,让我们定义一个名为 say_hello_world
的 native 函数,它会打印出 Hello, World!
。
fn say_hello_world(_inputs: Vec<WasmValue>) -> Result<Vec<WasmValue>, u8> { println!("Hello, world!"); Ok(vec![]) }
要在 WasmEdge
runtime 中使用 native 函数作为 import 函数,我们需要一个 ImportObject
。 wasmedge-sdk
定义了一个 ImportObjectBuilder,它提供了一组用于创建 ImportObject
的 chaining 方法。我们看看具体方法:
// 创建一个 import 模块 let import = ImportObjectBuilder::new() .with_func::<(), ()>("say_hello", say_hello_world)? .build("env")?;
现在,我们有一个名为 env
的 import 模块,它包含一个 host 函数 say_hello
。 也许你注意到,我们用于 import 模块和 host 函数的名称与 Wasm 模块中出现的名称完全相同。 可以在下一节中找到 Wasm 模块。
加载一个 wasm 模块
现在我们加载一个 Wasm 模块。 wasmedge-sdk
在 Module
中定义了两个方法:
from_file 从文件加载一个 Wasm 模块,并且同时验证已经加载的模块。
from_bytes 从内存字节数组中加载一个 Wasm 模块,同时验证加载的 Wasm 模块。
这里我们选择使用 Module::from_bytes
方法从内存字节数组中加载我们的 Wasm 模块。
let wasm_bytes = wat2wasm( br#" (module ;; First we define a type with no parameters and no results. (type $no_args_no_rets_t (func (param) (result))) ;; Then we declare that we want to import a function named "env" "say_hello" with ;; that type signature. (import "env" "say_hello" (func $say_hello (type $no_args_no_rets_t))) ;; Finally we create an entrypoint that calls our imported function. (func $run (type $no_args_no_rets_t) (call $say_hello)) ;; And mark it as an exported function named "run". (export "run" (func $run))) "#, )?; // 从给定的内存字节加载一个 Wasm 模块并返回一个编译的模块 let module = Module::from_bytes(None, &wasm_bytes)?;
注册 import 模块和编译模块
要注册一个已编译的模块,我们需要检查它是否依赖于某些 import 模块。 在 Wasm 模块中,这条语句 (import "env" "say_hello" (func $say_hello (type $no_args_no_rets_t)))
告诉我们,它依赖于一个名为 env
的 import 模块。 因此,在注册编译好的 wasm 模块之前,我们需要先注册 import 模块。
// 创建一个 executor let mut executor = Executor::new(None, None)?; // 创一个 store let mut store = Store::new()?; // 将 import 模块注册到 store 中 store.register_import_module(&mut executor, &import)?; // 将编译好的模块注册到 store 中,并得到一个模块实例 let extern_instance = store.register_named_module(&mut executor, "extern", &module)?;
在上面的代码中我们使用 Executor 和 Store 来注册 import 模块和已编译模块。wasmedge-sdk
也提供其它 APIs 来做同样的工作: Vm::register_import_module 和 Vm::register_module_from_bytes。
运行导出的函数
现在可以运行导出的函数。
// 获取导出的函数 "run" let run = extern_instance .func("run") .ok_or_else(|| anyhow::Error::msg("Not found exported function named 'run'."))?; // 运行 host 函数 run.call(&mut executor, params!())?;
展望未来
很快,wasmedge-sdk
将添加对嵌入式 Wasm 和异步 host 函数的异步调用的支持。 另一个重要特性是支持 wasmedge-sdk
中的复杂接口类型,允许开发者将复杂的数据结构(如字符串和用户定义的复杂类型)传递给 Wasm VM。
为 wasmedge-sdk 的开发做贡献
wasmedge-sdk 还在开发中,期待社区的反馈。 下面是需要社区小伙伴帮助的类目。此外,针对每一次反馈,我们会寄出礼物作为感谢。在这里查看规则。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
2021年数据泄露成本报告解读
根据 ForgeRock 的研究显示,2022年美国数据泄露的平均成本预计为950万美元,而2021年全球平均成本差不多是这个数字的一半。根据 IBM 和 Ponemon Institute 2021年的报告,全球平均数据泄露成本约为424万美元,比2019年的386万美元增长了10%,创下历史新高。 随着勒索攻击的数量激增,到2021年底全球网络犯罪的成本达到6万亿美元/年的峰值。 Ponemon Institute 和 IBM Security 的报告将数百个成本因素纳入研究统计,包括法律、监管及技术活动、品牌资产损失、客户流失和员工流失。该研究范围包含17个国家和17个行业的共计537起数据泄露事件,通过近3500次采访收集数据。该报告的主要目的是鼓励企业通过解决网络安全风险和改善整体安全状况来降低数据泄露的成本。 本文将会讨论2021年数据泄露成本报告中一些重要结果,并总结经验,通过数据保护、数据安全及数据泄露预防策略来降低数据泄露的风险和成本。 2021年 IBM 数据泄露成本报告主要发现 IBM 和 Ponemon Institute 的数据泄露成本报告有 12 个主要发现...
- 下一篇
Gogs 0.12.10 发布,极易搭建的自助 Git 服务
Gogs 0.12.10 已发布。 Gogs(/gɑgz/)项目旨在打造一个以最简便的方式搭建简单、稳定和可扩展的自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的所有平台,包括 Linux、macOS、Windows 和基于 ARM 的操作系统。 主要变化 支持使用[security] LOCAL_NETWORK_ALLOWLIST = *以允许所有主机名#7111 Bugfix 配置[security] LOCAL_NETWORK_ALLOWLIST后无法将 webhook 发送到本地网络地址#7074 Security:在文件编辑器中发现系统命令行注入#7000 Security:在仓库 issue 列表清理DisplayName#7009 Security:Windows 文件编辑器中的路径遍历问题#7001 Security:Git HTTP 端点的路径遍历#7002 在 Windows 上创建期间无法初始化仓库#6967 Mysterious panic onValue not found for type *rep...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker安装Oracle12C,快速搭建Oracle学习环境