帖子
分享您的知识。
深入分析 Move VM 技术细节
Sui:深度分析 Move VM 技术细节
在当今的区块链技术领域,Move VM作为关键技术组件,在Sui中起着重要作用.
本文对Move VM的技术细节进行了深入分析,包括:
-初始化过程 -代码缓存机制 -模块和脚本发布 -函数执行 -二进制格式分析
1. 移动 VM 初始化
Move VM 的初始化简单而高效. Loader
它只需要一个Mutex
实例——本质上是几个HashMap
受保护的空表,比如Vec
和.
此过程成本低廉,为所有虚拟机操作奠定了基础.
Move VM 使用按需代码加载.
代码未预加载;相反,它是在函数或脚本执行期间在运行时提取的.
加载后,模块/脚本将被缓存并重复使用,从而显著提高性能.
2. 代码缓存机制
2.1 首次加载
当虚拟机首次加载模块时:
- 查询数据存储以获取二进制数据 (
Vec<u8>
) - 反序列化和验证数据以确保准确性和完整性 3.使用相同的流程加载所有依赖关系
- 将模块与其依赖项关联起来
- 缓存模块通过,以便在
Loader
虚拟机生命周期中重复使用
2.2 缓存一致性
-系统事务(如硬升级)可能会破坏代码缓存的一致性.
-发生这种情况时,客户端应暂停交易处理并重新启动虚拟机.
-客户必须将其DataStore
视图与加载的代码保持一致,并在需要时重新实例化虚拟机.
3. 模块发布流程
要发布模块,客户端调publish_module
用:
-序列化模块字节
-发件人地址
-参考文献 GasMeter
步骤:
-
反序列化 -如果失败 → 返回错误.
-
地址验证 -模块地址必须与发件人地址相匹配 → 否则
MODULE_ADDRESS_DOES_NOT_MATCH_SENDER
.
3.重复检查
DUPLICATE_MODULE_NAME
-重新发布同名模块 → 错误.
-
加载验证 -确保以后可以加载模块. 失败?返回错误.
-
写入存储空间 -验证后,序列化模块将被保存并视为有效.
4. 脚本执行机制
Move 中的脚本本质上是一次性函数,通常用于执行事务.
步骤:
-
加载脚本和主要功能 -计算
sha3_256
脚本的哈希值. -使用哈希来检查它是否在缓存中. -如果未缓存 → 加载并验证. -验证主函数类型参数. -
生成参数列表 -
Signer
基于发件人账户的值. -其他参数必须匹配允许的类型 → 否则TYPE_MISMATCH
.
3.执行脚本 -VM 调用解释器. -出错时 → 交易失败并返回错误. -否则 → 返回成功.
5. 脚本函数执行
在 Move VM v2.0 中引入.
-像普通脚本一样工作
-Source 是链上script
模块内的-visible 函数
步骤:
- 使用
ModuleId
和函数名称加载函数 - 检查能见度 (
script
) -脚本不可见?→EXECUTE_SCRIPT_FUNCTION_CALLED_ON_NON_SCRIPT_VISIBLE
3.执行与普通脚本相同
6. 一般函数执行
Move VM 允许您按名称执行模块中的任何功能.
函数名称在模块中是唯一的→ 无需签名.
执行步骤:
-
加载模块 -如果出错 → 返回失败
-
解析功能 -如果没有找到 →
FUNCTION_RESOLUTION_FAILURE
-检查类型参数是否匹配 → 否则错误
3.生成参数列表
-将所有参数与允许的类型相匹配 → 否则 TYPE_MISMATCH
- 执行 -解释器运行该函数 -VM 返回结果
7. 二进制格式分析
7.1 总体架构
-所有模块/脚本都以二进制形式存在** -模块 = 函数和结构的集合 -脚本 = 简单入口点(无返回值)
使用ULEB128进行整数压缩,使用大小前缀表示向量.
7.2 二进制标头
3 个组件:
-魔法:固定 4 字节 → 0xA1, 0x1C, 0xEB, 0x0B
-版本:4 字节小端整数
-表格数量:ULEB128
7.3 表格标题
每个标题包括:
-TableKind
(1 字节)
-TableOffset
(ULEB128)
-TableLength
(ULEB128)
表格必须是连续的,不重叠.
7.4 表格详情
表格描述:
-MODULE_HANDLES
: 通过索引查看模块位置
-ADDRESS_IDENTIFIERS
、IDENTIFIERS
、STRUCT_HANDLES
、FUNCTION_HANDLES
:类型和函数元数据
-FUNCTION_INSTANTIATIONS
,SIGNATURES
,CONSTANT_POOL
: 实例化和常量
7.5 辅助定义
-Type Parameter Kind
: 1 字节 →ALL
,COPYABLE
, RESOURCE
-SignatureToken
: 1 字节表示类型(U8``U64``STRUCT
、、等)
Bytecodes
-POP
: 1 字节操作码 + 可选有效载荷 → 例如、、RET
、BR_TRUE
7.6 脚本特定的二进制数据
-缺少脚本 FUNCTION_DEFINITIONS
-取而代之的是,他们直接嵌入条目信息:
-类型参数数量和类型
-参数类型索引
-字节码长度和正文
✅ 结论
Move VM为区块链执行提供强大、安全和高效的环境.
通过理解:
-虚拟机初始化 -缓存策略 -函数/模块执行 -二进制结构
开发人员可以优化其基于Move的应用程序并有效地调试问题,从而为Sui生态系统的发展做出贡献.
- Sui
- Architecture
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

- ... SUIMatthardy+2095
- ... SUIacher+1666
- ... SUIjakodelarin+1092
- ... SUIChubbycheeks +1081
- ... SUITucker+1047
- ... SUIKurosakisui+1034
- ... SUIzerus+890