12 个不稳定版本 (5 个破坏性更新)

0.6.0 2024 年 4 月 15 日
0.5.1 2024 年 1 月 9 日
0.5.0 2023 年 11 月 7 日
0.4.1 2023 年 4 月 4 日
0.2.0 2022 年 3 月 25 日

#2 in #interface-types

Download history 213/week @ 2024-05-03 513/week @ 2024-05-10 497/week @ 2024-05-17 510/week @ 2024-05-24 464/week @ 2024-05-31 220/week @ 2024-06-07 165/week @ 2024-06-14 283/week @ 2024-06-21 138/week @ 2024-06-28 127/week @ 2024-07-05 222/week @ 2024-07-12 513/week @ 2024-07-19 285/week @ 2024-07-26 257/week @ 2024-08-02 327/week @ 2024-08-09 197/week @ 2024-08-16

1,099 每月下载量
用于 14 个 crate(2 个直接使用)

Apache-2.0

17KB
321 代码行

Marine

marine version on crates.io Coverage Status

Marine 是一个基于组件模型(component model)的现代通用 Wasm 运行时,能够运行多模块 Wasm 应用程序,即服务,具有 interface-typesshared-nothing linking 方案。这种执行模型适用于各种场景,特别是适用于遵循 实体组件系统 (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/src/main.rs(见下文)导入的 donkey Wasm 模块,使用 Rust 的 FFI link(4)。

// 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模块并从中提取一些信息的CLI

支持

如果发现错误,请提交一个问题。您还可以通过DiscordTelegram联系我们。我们将尽全力尽快解决该问题。

贡献

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

许可

所有软件代码均为Fluence DAO版权所有,遵循AGPLv3许可。

依赖项

~4–5MB
~104K SLoC