Contents

Sui 实用学习笔记 (4) - VM & framework package

   Jan 19, 2024     1 min read      views

Sui VM, native functions, sui package。

VM

Sui VM 实现与 Move 原始 VM 一致。

Move VM 为栈式虚拟机,支持约 60 多种 bytecode

  • 栈操作类:Pop, LdU8, LdU256, LdTrue, LdConst 等
  • 跳转类:Ret, BrTrue, BrFalse, Branch
  • 类型转换类:CastU8, CastU256 等
  • 函数局部变量操作:CopyLoc, MoveLoc, StLoc
  • 函数调用:Call, CallGeneric
  • 结构体操作:Pack, PackGeneric, Unpack, UnpackGeneric
  • 引用操作:ReadRef, WriteRef, FreezeRef
  • Borrow 类:MutBorrowLoc, ImmBorrowLoc, MutBorrowField, MutBorrowFieldGeneric, ImmBorrowField, ImmBorrowFieldGeneric
  • 算术操作、逻辑操作、比较操作:Add, Sub, Or, Eq 等
  • 向量操作: VecPack, VecLen, VecImmBorrow, VecMutBorrow, VecPushBack, VecPopBack, VecUnpack, VecSwap

虚拟机 Bytecode 执行逻辑在这里

其中大部分指定可以望文生义,只解释一些特殊的:

  • Borrow 类会 load mutable/immutable reference
  • ReadRef 读取 reference 的值到栈中,需要 value type 有 copy ability。
  • WriteRef 写值到 reference 中,需要 value type 有 drop ability。
  • FreezeRef 将 mutable reference 转成 immutable (实际在 VM 层这条指令不起任何作用,因为 VM 层并不区分 mutable/immutable)

Move VM 中定义 gas 计算接口。Sui 中实现了这些接口,根据指令类型,完成 Gas 计算逻辑

PTB commands

PTB commands 逻辑在这里

PTB 结构的 Json Schema 定义在这里

Native functions

Sui 对 Move VM 修改不多。定制化功能通过 native function 来实现。

Sui 定义的 native functions 主要包括:

  • 密码学相关函数:hash, 验签等。
  • dynamic_field 操作函数
  • event::emit 生成 event
  • object 操作函数: object::delete_impl, object::borrow_uid, object::record_new_uid
  • transfer 相关函数:transfer::transfer_impl, transfer::freeze_object_impl, transfer::share_object_impl, transfer::receive_impl
  • tx_context::derive_id 生成 ID
  • OTW 类型判断 types::is_one_time_witness

Packages

通过封装 native functions,实现了 Sui framework packages。在区块链浏览器中也可以查到对应代码

这些 Packages,相关 object 被硬编码到一些固定的 Sui 地址上

  • 0x1 std lib 主要是 Move 基础类型处理函数
  • 0x2 sui framework 最核心的 package,封装了 Sui 相关的各种操作函数
  • 0x3 sui system 底层系统如 staking, validator 相关的函数。
  • 0xdee9 deep book 相关函数,Sui 实现的订单簿 decentralized central limit order book (CLOB)
  • 0x5 sui system state object
  • 0x6 clock object
  • 0x7 authenticator state object
  • 0x8 randomness state object
  • 0x403 DenyList object

Sui framework packages 中的一些常见模块:

  • balance.move:Balance 和 Supply 对象。TreasuryCap 和 Coin 会用到。
  • clock.move:时钟模块。sui::clock::timestamp_ms(0x6) 获取当前时间。
  • coin.move:Token 标准。CoinMetadata 保存 decimals, name, symbol 等元数据,通常为 immutable。Coin 保存 balance, 是 transfer 时使用的 object。
  • dynamic_field.move, dynamic_object_field.move :dynamic_field 增删改查的一些函数。
  • event.move:创建 event 的函数 sui::event:emit
  • math.move:数学相关函数
  • package.move:Package 升级相关函数。定义 UpgradeCap 等对象
  • sui.move:定义原生代币 sui::coin::Coin<sui::sui::SUI>
  • table.move, linked_table.move, object_table.move:类似 Map 的 数组结构
  • token.move:功能更丰富的 Coin
  • transfer.move:最常用模块之一,封装了 native transfer 相关函数。
  • tx_context.move:类似 Solidity 里的 msg。最常用的 sui::tx_context::sender() 方法