40 个版本 (22 个重大更改)

0.31.0 2024年4月15日
0.30.2 2024年3月27日
0.30.1 2024年2月29日
0.26.0 2023年12月14日
0.8.0 2021年7月5日

#18 in #marine

Download history 1/week @ 2024-05-15 5/week @ 2024-05-22 140/week @ 2024-07-24 33/week @ 2024-07-31

173 每月下载量

Apache-2.0

145KB
3K SLoC

海洋

marine version on crates.io Coverage Status

海洋是一个基于组件模型(component model)的现代通用 Wasm 运行时,能够运行具有 interface-types 和共享无链接方案的多模块 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;
    }
}

在这个海洋(Wasm)模块(以及命名空间)shrek中,我们声明了一个函数greeting,它从donkey模块的(3)greeting函数创建一个donkey_greeting(1)。这个greeting函数本身依赖于导入donkey Wasm模块,使用Rust的FFI 链接(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:一个Fluence FaaS层,它提供主机闭包、IT<->JSON转换、记录器、配置处理和其他事物
  • fluence-app-service:一个Fluence应用程序服务层,它提供服务运行的基本API
  • runtime:提供加载、卸载和调用模块的基本功能的运行时层
  • marine-js:一个针对浏览器运行 Marine 的 Web 运行时层
  • 工具
    • REPL:一个用于测试 Marine Wasm 模块的 REPL
    • CLI:一个用于构建并从 Marine Wasm 模块中提取信息的 CLI

支持

如果在使用过程中发现任何错误,请提交问题。您也可以在 DiscordTelegram 上联系我们。我们将尽全力尽快解决问题。

贡献

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

许可证

所有软件代码均受 Fluence DAO 版权保护(c),并根据AGPLv3许可证发布。

依赖项

~44–61MB
~1M SLoC