4 个版本
0.1.3 | 2019 年 12 月 9 日 |
---|---|
0.1.2 | 2019 年 12 月 9 日 |
0.1.1 | 2019 年 12 月 9 日 |
0.1.0 | 2019 年 12 月 9 日 |
#981 在 文件系统
3.5MB
1K SLoC
包含 (WOFF 字体, 190KB) target/doc/FiraSans-Medium.woff,(WOFF 字体, 185KB) target/doc/FiraSans-Regular.woff,(WOFF 字体, 94KB) target/doc/SourceSerifPro-Bold.ttf.woff,(WOFF 字体, 89KB) SourceSerifPro-Regular.ttf.woff,(WOFF 字体, 56KB) target/doc/SourceCodePro-Regular.woff,(WOFF 字体, 56KB) target/doc/SourceCodePro-Semibold.woff 和 1 个更多。
SSVMContainer
网络/网络上的用户能够将 Wasm 应用程序部署和执行在 SecondState 的基于栈的、无状态的 WebAssembly 虚拟机 (SSVM) 上。这个 SSVMContainer 库在概念上位于来自外部网络(由 SSVMRPC 处理)的传入请求和 SSVM 之间。目前,SSVMContainer 的公共模块项是可用的,并且其功能可以通过调用方实现,即通过像 SSVMRPC 这样的 RPC 服务器应用程序。最终的设计目标是实现控制反转 (IoC) 设计,并使 SSVMContainer 成为各种接口(不仅仅是 RPC)之间的通道。请参阅下面的 路线图部分 了解有关 IoC 工作的更多信息。
具体来说,这个 SSVMContainer 应用程序处理 Wasm 应用程序的部署,并管理服务的执行(Wasm 应用程序内的可调用函数)。实际的执行发生在 SSVM 内。然而,执行是由这个容器发起的,并且所有应用程序状态信息都由这个 SSVMContainer 处理。
存储
文件系统
目前这个 SSVMContainer 简单使用文件系统。
LevelDB
未来的版本将允许配置 LevelDB 作为存储。一旦发生这个过渡,以下 JSON(反映了上述文件系统布局)将被使用。
{
"application_uuid": "0x11111111",
"application_name": "ERC 20",
"bytecode": "0x99999999",
"service": {
"service_uuid": "0x11111111",
"service_name": "add",
"timestamp": {
"timestamp_uuid": "1575158141",
"input": {},
"output": {}
}
}
}
用法
将此依赖项添加到您的应用程序的 Cargo.toml 文件中
ssvm_container = "0.1.2"
将此行代码添加到您的 rust 源代码顶部,即您的 main.rs 文件。
extern crate ssvm_container;
实例化一个文件系统对象
let fs = ssvm_container::storage::file_system::FileSystem::init();
创建一个应用程序
let bytecode_wasm = String::from("0x1234567890");
let uuid = ssvm_container::storage::file_system::FileSystem::create_application(&fs, &bytecode_wasm);
读取一个应用程序
let bytecode_wasm_string = ssvm_container::storage::file_system::FileSystem::read_application(&fs, &uuid);
更新一个应用程序
ssvm_container::storage::file_system::FileSystem::update_application(&fs, &uuid, &bytecode_wasm_update);
删除一个应用程序
ssvm_container::storage::file_system::FileSystem::delete_application(&fs, &uuid);
路线图
如上所述,SSVMContainer的最终目标是设计上采用IoC(控制反转)。这比当前的工作原型具有更长远的目标。当前的SSVMContainer演示了如何在无状态的执行环境中管理多个应用程序及其状态。如上图所示,SSVMContainer通过SSVMRPC从Web接收HTTP POST请求,然后在无状态的SSVM上执行代码。SSVMContainer不仅将结果返回给SSVMRPC(以便原始HTTP POST发送者获得结果),还记录所有传入和传出活动以及任何应用程序在任何给定时间点的状态。SSVMContainer甚至存储每个应用程序的Wasm字节码(在无状态执行活动期间传递到SSVM)。
IoC和Rust
正如这篇论文解释的那样,虽然IoC设计模式在其他语言中相当常见,但由于Rust的设计理念,它们在Rust中很难实现。例如,使用基于工厂的方法特别存在安全低、灵活性有限和冗长的问题。
从依赖关系角度来看,以下说法是合理的:“依赖注入将你的类的构建与其依赖项的构建解耦”。由于Rust不使用类,这可以通过多种方式完成,即使用特质和/或模块,甚至内部模块函数(这些函数便于构造器注入和/或设置器注入)。
Rust特质
在Rust中,一个特质是“一种语言特性,告诉Rust编译器一个类型必须提供的功能”。例如,在Rust中没有传统的“类”的情况下,一个名为“Circle”的结构体将只包含数据字段,如radius
。一个名为“HasArea”的特质将只包含给定圆的面积的类型签名。最后,该特质的实现impl HasArea for Circle
实际上将执行计算圆的面积。
Substrate开发者中心文档展示了Rust特质的用法,即通过模板创建新的运行时模块。GitHub上的一些Rust IoC实验/项目,如ioc、shaku、ioc-rs和injectorust,都使用了这种特质的用法。