跳到主要内容

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.0
    • team.aibot.0.1.2
    • org.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 新虚拟机实例时要加载哪个模块定义,从而让整个网络都能正确识别并运行你的虚拟机实现。