48 个版本 (15 个重大变更)

0.20.1 2024年6月5日
0.19.7 2024年2月22日
0.19.0 2023年12月14日
0.18.0 2023年11月7日
0.6.10 2021年7月14日

#850魔法豆

Download history 11/week @ 2024-04-19 6/week @ 2024-05-17 2/week @ 2024-05-24 102/week @ 2024-05-31 27/week @ 2024-06-07 5/week @ 2024-06-14 1/week @ 2024-06-21 68/week @ 2024-07-26 8/week @ 2024-08-02

每月下载量:76

Apache-2.0

140KB
2.684K SLoC

海洋

marine version on crates.io Coverage Status

海洋是一个基于 组件模型 的现代通用 Wasm 运行时,能够运行多模块 Wasm 应用程序,即服务,具有 接口类型无共享链接 方案。这种执行模型非常适合各种场景,尤其适用于遵循 实体组件系统 (ECS) 模式或基于插件的架构。

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

动机示例

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

cdexamples/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;
    }
}

在本海洋(Wasm)模块(及命名空间)shrek中,我们声明了一个函数greeting,它从donkey模块的(3)greeting函数中创建了一个donkey_greeting(1),而该函数本身依赖于导入donkey Wasm模块,通过Rust的FFI(4)linkdonkey/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转换、记录器、配置处理等功能的开源FaaS层
  • fluence-app-service:提供一个基本API的Fluence应用服务层,用于服务运行
  • runtime:提供加载、卸载和调用模块基本功能的运行时层
  • marine-js:一个针对浏览器运行Marine的Web运行时层
  • 工具
    • REPL:一个用于测试Marine Wasm模块的REPL工具
    • CLI:一个用于构建和从Marine Wasm模块中提取信息的命令行工具

支持

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

贡献

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

许可证

所有软件代码均为Fluence DAO版权所有,并受AGPLv3许可证的约束。

依赖关系

~16–30MB
~488K SLoC