#fluence #marine #run-time #back-end #wasmtime #linker #applications

marine-wasmtime-backend

Fluence Marine Wasm 后端接口的 Wasmtime 实现

9 个版本 (5 个重大变更)

0.7.0 2024 年 4 月 15 日
0.6.0 2024 年 2 月 22 日
0.5.1 2024 年 1 月 9 日
0.5.0 2023 年 12 月 14 日
0.2.1 2023 年 3 月 29 日

#1740魔法豆

Download history 352/week @ 2024-04-17 200/week @ 2024-04-24 136/week @ 2024-05-01 314/week @ 2024-05-08 591/week @ 2024-05-15 544/week @ 2024-05-22 449/week @ 2024-05-29 339/week @ 2024-06-05 116/week @ 2024-06-12 240/week @ 2024-06-19 216/week @ 2024-06-26 113/week @ 2024-07-03 129/week @ 2024-07-10 499/week @ 2024-07-17 348/week @ 2024-07-24 178/week @ 2024-07-31

每月 1,170 次下载
14 个 crate 中使用 (7 个直接使用)

Apache-2.0

83KB
1.5K SLoC

Marine

marine version on crates.io Coverage Status

Marine 是一个基于组件模型的现代通用 Wasm 运行时,能够运行多模块 Wasm 应用程序,也称为服务,支持 接口类型无共享链接 方案。这种执行模型适用于各种场景,特别适用于遵循 实体组件系统 (ECS) 模式或基于插件的架构的实现。

Fluence 节点,如 Fluence Rust 节点,包含 Marine 以执行由 Aqua 组成的托管 Wasm 服务。

激励示例

为了说明 Marine 的功能,让我们看看在 这个示例 中实现的多模块 Wasm 服务。

cd 进入到 examples/motivational-example 目录,并查看 shrek/src/main.rs 文件

// examples/motivational-example/shrek/src/main.rs
use marine_rs_sdk::marine;

fn main() {}

#[marine]
pub fn greeting(name: &str) -> Vec<String> {
    let donkey_greeting = donkey::greeting(name);         // 1
    let shrek_greeting = format!("Shrek: hi, {}", name);  // 2
    
    vec![shrek_greeting, donkey_greeting]                 
}

mod donkey {                                               // 3
    use super::*;

    #[marine]
    #[link(wasm_import_module = "donkey")]                 // 4
    extern "C" {
        pub fn greeting(name: &str) -> String;
    }
}

在这个 Marine (Wasm) 模块(和命名空间)shrek 中,我们声明了一个函数 greeting,它从 donkey 模块的 greeting 函数创建了一个 donkey_greeting(1),该函数本身依赖于导入 donkey Wasm 模块,这是通过 Rust 的 FFI link(4)从 donkey/src/main.rs(见下文)导入的。

// examples/motivational-example/donkey/src/main.rs
use marine_rs_sdk::marine;

fn main() {}

#[marine]
pub fn greeting(name: &str) -> String {
    format!("Donkey: hi, {}", name)
}

总之,我们的例子由两个独立的 Wasm 模块组成,即 shrekdonkey,展示了如何将一个模块链接到另一个模块中,即在 shrek 模块中使用 donkey 模块。请注意,shrek 模块被称为 门面 模块,遵循 门面模式,每个服务只能有一个 门面 模块。

请确保您已安装 Marine 工具 安装 并分别编译 donkeyshrek,我们可以使用 build.sh 脚本来完成此操作

$> ./build.sh

它创建了两个独立的 Wasm 模块,它们被放置在 artifacts 目录中

$> ls artifacts
donkey.wasm    shrek.wasm

现在我们已经有了我们的模块,我们可以使用 Marine REPL 探索它们。请注意,我们使用 Config.toml 文件来帮助 REPL 通过提供模块位置和名称。一旦 REPL 启动并运行,我们就可以与这两个模块交互,并且正如预期的那样,shrek 模块能够成功访问 donkey 模块公开的函数。

$> marine repl Config.toml
...
1> interface
Loaded modules interface:

shrek:
  fn greeting(name: string) -> []string
donkey:
  fn greeting(name: string) -> string

2> call donkey greeting "no link module"
result: "Donkey: hi, no link module"
 elapsed time: 42.985µs

3> call shrek greeting "facade with link module"
result: [
  "Shrek: hi, facade with link module",
  "Donkey: hi, facade with link module"
]
 elapsed time: 39.25µs

4> q

看起来一切正常,模块已经准备好 部署到网络与 Aqua 组合

文档

别忘了检查我们的 YouTube 频道

存储库结构

  • crates
  • examples:几个Marine示例,主要用于测试
  • fluence-faas:一个提供主机闭包、IT<->JSON转换、日志记录、配置处理等功能的Fluence FaaS层
  • fluence-app-service:一个提供服务运行基本API的Fluence应用服务层
  • runtime:一个提供加载、卸载和调用模块的基本功能运行时层
  • marine-js:一个面向在浏览器中运行Marine的Web运行时层
  • 工具
    • REPL:一个用于测试Marine Wasm模块的REPL
    • CLI:一个用于构建Marine Wasm模块并从中提取某些信息的命令行界面

支持

如果您发现错误,请提交问题。您也可以在DiscordTelegram上联系我们。我们将尽力尽快解决问题。

贡献

任何感兴趣的人都可以为项目做出贡献。请确保您阅读并遵循一些基本的规则

许可

所有软件代码均受(c)Fluence Labs,Inc.的Apache-2.0许可协议保护。

依赖项

~33–45MB
~804K SLoC