Mount 与 Module
本章将带你了解:如何将自己开发的虚拟机(VM)真正接入到 HyMatrix 节点和网络中。你将学习到以下内容:
- 如何在本地安装并使用 hymx 工具库
- 如何将你的虚拟机挂载(Mount)到开发节点进行本地调试
- 如何通过 Build 步骤把虚拟机打包进节点可执行程序
- 什么是 Module,以及如何创建并上传到 Arweave 作为虚拟机模板
- 如何通过 Module ID 在网络中启动(Spawn)你的虚拟机实例
通过这些步骤,你能把自己的业务逻辑转化成一个可在 HyMatrix 网络中标准化部署、跨节点调用、可验证重放的去信任化服务模块。最终,你的虚拟机将成为全球去中心化计算网络的一部分,持续为用户或其他虚拟机提供可信的计算能力。
安装 hymx
在本地开发环境里,你需要安装 hymx 库来获取构建和挂载所需的工具和接口。
go get github.com/hymatrix/hymx
在你的 Go 项目中导入:
import "github.com/hymatrix/hymx/server"
Mount 你的虚拟机
Mount 是本地开发阶段的注册步骤,用于把你实现的虚拟机接口挂载到 hymx 服务器,让节点知道如何实例化和调用你的 VM。
下面是一个最小可用的示例代码:
s := server.New(bundler, redisURL, arweaveURL, hymxURL, nodeInfo)
// 挂载你实现的 VM
s.Mount("myorg.myvm.1.0.0", myvm.SpawnMyVM)
s.Run(port)
-
server.New(...):创建节点服务对象。
-
Mount(...):注册你的 VmSpawnFunc 入口,比如 myvm.SpawnMyVM。
第一个参数
ModuleFormat是虚拟机的模块标识符,用于在网络中唯一识别该类型的 VM。后续需要通过这个标识符来创建 VM 实例。建议使用“组织.类型.版本”的命名规范,例如:
acme.imageprocessor.1.0.0team.aibot.0.1.2org.yourvm.1.0.0
第二个参数是你实现的
VmSpawnFunc。 -
Run(port):启动本地开发服务器并监听端口。
在本地开发和测试时,你可以在同一个 server 中挂载多个不同的虚拟机实现来进行调试和验证。
Build 你的 HyMatrix 节点
完成 Mount 后,下一步是通过 Build 步骤把虚拟机构建到 hymx 节点中。
- Build 是一个本地构建流程,会把你的虚拟机实现编译并集成到节点可识别的二进制文件里。
- 运行该节点后,网络就能支持你的虚拟机类型,接收并执行针对你的 VM 的调用消息。
这个过程确保了你的虚拟机在 HyMatrix 网络中是标准化的,并能在任何兼容的节点上运行。
完整参考代码请看👉 main.go
Mount 与 Build 的意义
- Mount 是开发阶段本地调试和挂载的步骤,让你的虚拟机在本地的 hymx 服务器上能被加载和调用。
- Build 是把你的虚拟机正式集成到节点程序的过程,使节点能够对外提供该类型 VM 的执行服务。
通过 Mount 与 Build,开发者能把业务逻辑打包成 HyMatrix 节点可执行的标准模块,轻松部署到全球去中心化计算网络,实现真正的去信任化、可验证重放的计算服务。
创建 Module
在 HyMatrix 网络中,Module 是存储在 Arweave 上的虚拟机模板定义。它描述了可部署的虚拟机类型和参数,供之后在节点上生成具体的虚拟机实例。
当想要在网络中 Spawn(启动)一个新的虚拟机实例时,必须先准备好对应的 Module,并在调用消息中指定它。
节点开发者需要先将自己实现并 Mount 的虚拟机,打包成一个 Module,并写入到 Arweave 等永久存储网络中。这个 Module 是一个标准化描述,任何节点只要支持指定格式,就可以加载并运行对应的虚拟机。
当用户需要启动(Spawn)一个新的虚拟机实例时,会发送一个类型为 Process 的消息,里面包含 Module 字段,指向之前存储的 Module ID。节点就能根据这个 ID 加载正确的模板来创建 VM 实例。
示例结构:
type Module struct {
Base
ModuleFormat string `json:"Module-Format"`
MemoryLimit string `json:"Memory-Limit"`
ComputeLimit string `json:"Compute-Limit"`
Tags []goarSchema.Tag `json:"Tags,omitempty"`
}
- ModuleFormat:指定虚拟机的类型和版本,例如
"myorg.myvm.1.0.0"。建议使用“组织.类型.版本”的命名规范来确保唯一识别。 - MemoryLimit、ComputeLimit:可选的资源限制参数。
- Tags:用于扩展和标注元信息。
创建好 Module 并上链后,用户或其他 VM 想要实例化该类型的虚拟机时,只需发送 Process 消息:
type Process struct {
Base
Module string `json:"Module"`
Scheduler string `json:"Scheduler"`
FromProcess string `json:"From-Process,omitempty"`
Tags []goarSchema.Tag `json:"Tags"`
}
- Module:指向已在 Arweave 上存储的 Module ID。
- Scheduler:指定目标节点。如果你已经加入 hymx 网络,这里可以填写你的节点 AccId。
- FromProcess:用于记录链式调用的来源 VM。
- Tags:附加参数信息。
如果某个节点已经 Mount 了你的虚拟机实现并创建了对应的 Module,那么你只需发送 Process 消息就可以生成并启动一个新的虚拟机实例,实现真正的标准化、可扩展和去中心化的计算能力。
上传 Module 示例
上传 Module 前,需要注意 Arweave 钱包必须有足够的 AR 余额,因为将数据(即虚拟机的 Module 元信息)写入 Arweave 是一笔上链交易,需要支付存储费用。如果余额不足,上传会失败。建议在正式操作前,先通过 Arweave 区块浏览器或钱包确认你的余额情况。
这样可以保证你的虚拟机模板能够成功永久存储在 Arweave 上,供全网任何节点下载、验证和加载运行。
下面是一个用 Go 编写的最小可用示例,展示如何使用 hymx 的 utils 工具和 goar SDK 上传你的 Module 到 Arweave:
package main
import (
"context"
"fmt"
"github.com/hymatrix/hymx/schema"
"github.com/hymatrix/hymx/utils"
"github.com/permadao/goar"
goarSchema "github.com/permadao/goar/schema"
goarUtils "github.com/permadao/goar/utils"
)
func main() {
// 1. 加载你的 Arweave 钱包
signer, _ := goar.NewSignerFromPath("./testkey.json")
bundler, _ := goar.NewBundler(signer)
wallet := goar.NewWalletWithSigner(signer, "https://arweave.net")
// 2. 构造模块信息
tags, _ := utils.ModuleToTags(schema.Module{
Base: schema.DefaultBaseModule,
ModuleFormat: "myorg.myvm.1.0.0",
})
// 3. 创建并签名一个空的 BundleItem
item, err := bundler.CreateAndSignItem([]byte{}, "", "", tags)
if err != nil {
return
}
bundle, err := goarUtils.NewBundle(item)
if err != nil {
return
}
// 4. 上传到 Arweave
_, err = wallet.SendBundleTxSpeedUp(context.TODO(), 10, bundle.Binary, []goarSchema.Tag{}, 50)
fmt.Println(item.Id, err)
}
这里最重要的字段是 ModuleFormat,这是开发者定义的模块标识符,与实际开发的虚拟机类型一一对应。
执行成功后,控制台会打印出 item.Id。这个 ID 就是你上传到 Arweave 的 BundleItem 唯一标识,也是后续在 Process 消息中要填写的 Module ID。它告诉节点在 Spawn 新虚拟机实例时要加载哪个模块定义,从而让整个网络都能正确识别并运行你的虚拟机实现。