Sui Move:基本概览一

Module (模块)

  • Move 代码被组织成模块, 可以把一个模块看成是区块链上的一个智能合约

  • 可以通过调用这些模块中的函数来与模块进行交互,可以通过事务或其他 Move 代码来实现, 事务将被发送到并由Sui区块链进行处理,一旦执行完成,结果的更改将被保存

  • 一个模块由 module 关键字 + 地址 + 模块名组成, 其中地址可以写成 alias (定义在 Move.toml中), 例如 lets_move_sui

    module lets_move_sui::sui_fren {}
    

基本数据类型

  • 无符号整数:  u8u16u32u64u128u256
  • Boolean: bool
  • Addresses: address
  • 字符串: String
  • Vector: vector, 例如 vector<u64>
  • 自定义的结构体类型, 例如下面定义的 Struct

Struct (结构体)

  • 结构体是 Sui Move 中的一个基本概念

  • 结构体可以看成是一组相关字段的组合, 每个字段都有自己的类型

  • Sui Move 可以为结构体添加4 种能力: key、store、drop、copy, 这些能力后续会慢慢涉及

  • 下面是一个基本的结构体名为 AdminCap, 内部含有一个 num_frens字段

        public struct AdminCap {num_frens: u64,}
    
  • 添加一个私有函数 init, 这是一个特殊的函数, 会在 module 部署到区块链时, 自动调用

        fun init(ctx: &mut TxContext) {let admin_cap = AdminCap {id: object::new(ctx),num_frens: 1000,};transfer::share_object(admin_cap);}
    

Object

  • Object 是 Sui 中的一个基本概念
  • 在 Sui 中, 所有数据可以视为不同 Object 内部的字段
  • 使用结构体(Struct)来表示Object
  • 可以根据 module 中定义的函数进行创建, 读取, 修改,交互 Object

创建一个 Object

  • 一个 Object 一般都有 key 能力以及含有一个类型为 UID 的 id 字段

    • sui::object::new : 创建一个新对象。返回必须存储在 Sui 对象中的 UID

          public fun new(ctx: &mut TxContext): UID {UID {id: ID { bytes: tx_context::fresh_object_address(ctx) },}}
      
  • 创建 Ticket: create_ticket

  • 示例代码

    module lets_move_sui::ticket_module {use sui::clock::{Self, Clock};use sui::object::{Self, ID, UID};use sui::transfer;use sui::tx_context::{Self, TxContext};public struct Ticket has key {id: UID,}public fun create_ticket(ctx: &mut TxContext, clock: &Clock) {let uid = object::new(ctx);let ticket = Ticket {id: uid,expiration_time: clock::timestamp_ms(clock),};transfer::transfer(ticket, tx_context::sender(ctx));}
    }
    

读取 Ojbect 中的字段

  • 一个 Ticket 一般都有过期时间

    • 在 Ticket 结构体中添加一个 expiration_time 字段
    • 在 ticket_module 中添加一个 is_expired 方法来检测是否过期
module lets_move_sui::ticket_module {use sui::clock::{Self, Clock};use sui::object::{Self, ID, UID};use sui::transfer;use sui::tx_context::{Self, TxContext};public struct Ticket has key {id: UID,expiration_time: u64,}public fun create_ticket(ctx: &mut TxContext, clock: &Clock) {let uid = object::new(ctx);let ticket = Ticket {id: uid,expiration_time: clock::timestamp_ms(clock),};transfer::transfer(ticket, tx_context::sender(ctx));}public fun is_expired(ticket: &Ticket, clock: &Clock): bool {ticket.expiration_time <= clock::timestamp_ms(clock)}
}

修改 Object 中的字段

  • 需要在函数中传入一个可变引用

    module 0x123::my_module {use std::vector;use sui::object::{Self, UID};use sui::transfer;use sui::tx_context::TxContext;struct MyObject has key {id: UID,value: u64,}fun init(ctx: &mut TxContext) {let my_object = MyObject {id: object::new(ctx),value: 10,};transfer::share_object(my_object);}public fun set_value(global_data: &mut MyObject, value: u64) {global_data.value = value;}
    }
    

删除一个 Object

  • sui::object::delete : 删除该对象及其 UID 。这是消除 UID 的唯一方法

        public fun delete(id: UID) {let UID { id: ID { bytes } } = id;delete_impl(bytes)}
    
  • 示例代码

    module 0x123::ticket_module {use sui::clock::{Self, Clock};use sui::object::{Self, UID};use sui::transfer;use sui::tx_context::TxContext;struct Ticket has key {id: UID,expiration_time: u64,}public fun clip_ticket(ticket: Ticket) {let Ticket {id,expiration_time: _,} = ticket;object::delete(id);}
    }
    

Math

  • 在 Move 中数学运算和其他编程语言非常相似
  • 需要注意的是 x^y 表示 以 x 为底, 指数为 y

类型转换

  • 相同的类型可以直接进行算术运算, 但是不同的类型之间想要进行算术运算, 则需要进行转换

  • 在 Move 中类型转换可以使用这种形式: (x as <type>), 例如(x as u64)

    fun mixed_types_math_error(): u64 {let x: u8 = 1;let y: u64 = 2;// This will fail to compile as x and y are different types. One is u8, the other is u64.x + y
    }fun mixed_types_math_ok(): u64 {let x: u8 = 1;let y: u64 = 2;// Ok(x as u64) + y
    }
    

Vector

  • vector 相当于是一个动态数组, 这是 Move 内置的一个数据结构, 后续会了解到更多

  • 创建 vector

       // The empty vector does not yet have a type declared. The first value added will determine its type.let empty_vector = vector[];let int_vector = vector[1, 2, 3];let bool_vector = vector[true, true, false];
    
  • vector in struct field

       struct MyObject has key {id: UID,values: vector<u64>,bool_values: vector<bool>,address_values: vector<address>,}
    

Public function and Private function

  • init 函数必须是 Private 的, 它会在合约部署的时候由 Sui 虚拟机(VM)调用
  • Public 意味着它可以被任何其他的 Move module 和 transactions 调用
  • Private 意味着只能被当前 Move module 调用, 并且不能从 transaction 中调用
module lets_move_sui::sui_fren {use sui::tx_context::{Self, TxContext};use sui::transfer;use sui::object::{Self, ID, UID};use std::string::String;// use std::vector; // built-inuse sui::event;public struct AdminCap has key {id: UID,num_frens: u64,}public struct SuiFren has key {id: UID,generation: u64,birthdate: u64,attributes: vector<String>,}fun init(ctx: &mut TxContext) {let admin_cap = AdminCap {id: object::new(ctx),num_frens: 10^3, // 1000};transfer::share_object(admin_cap);}// change the mint function to transfer the object to the senderpublic fun mint(generation: u64, birthdate: u64, attributes: vector<String>, ctx: &mut TxContext) {let uid = object::new(ctx);let sui_fren = SuiFren {id: uid,generation,birthdate,attributes,};transfer::transfer(sui_fren, tx_context::sender(ctx));}public fun burn(sui_fren: SuiFren) {let SuiFren {id,generation: _,birthdate: _,attributes: _,} = sui_fren;object::delete(id);}public fun get_attributes(sui_fren: &SuiFren): vector<String> {sui_fren.attributes}public fun update_attributes(sui_fren: &mut SuiFren, attributes: vector<String>) {sui_fren.attributes = attributes;}
}

Shared Object and Owned Object

  • Shared Objects 可以被任何用户读取和修改

    • 不能并行处理(例如修改), 并且需要严格的检查, 性能慢, 可扩展性差
  • Owned Objects 是私有对象,只有拥有它们的用户才能读取和修改(所有权)

    • 只允许直接所有权,因此如果用户A拥有对象B,而对象B拥有对象C,则用户A无法发送包含对象C的事务, 这个问题可以使用  Receiving<T>  解决(后续会提及)
    • 可以并行处理, 因为涉及它们的 transaction (事务) 不会相互重叠
  • sui::transfer::share_object : 将给定的对象转换为一个可变的共享对象,每个人都可以访问和修改

    public fun share_object<T: key>(obj: T) {share_object_impl(obj)
    }
    
  • sui::transfer::transfer : 将 obj 的所有权转移给接收者。obj 必须具有 key 属性

    public fun transfer<T: key>(obj: T, recipient: address) {transfer_impl(obj, recipient)
    }
    
  • 示例代码

    module lets_move_sui::shared_and_owned {use sui::object::{Self, UID};use sui::tx_context::{Self, TxContext};use sui::transfer;public struct SharedObject has key {id: UID,}public struct OwnedObject has key {id: UID,}public fun create_shared_object(ctx: &mut TxContext) {let shared_object = SharedObject {id: object::new(ctx),};transfer::share_object(shared_object);}public fun create_owned_object(ctx: &mut TxContext) {let owned_object = OwnedObject {id: object::new(ctx),};transfer::transfer(owned_object, tx_context::sender(ctx));}
    }
    

Event (事件)

  • 什么是 Event? Event 是你的module 将区块链上发生的事情传达给应用程序前端的一种方式

  • 应用程序可以监听某些 Event 来采取行动

  • Event 主要用来给”链下”组件 与 “链上”组件进行交互

  • sui::event::emit : 发出自定义的 Move Event,将数据发送到链下。 由下面的函数签名可知, emit 的参数需要一个包含 copy 和 drop 能力的类型

    public native fun emit<T: copy + drop>(event: T);
    
  • 示例代码

    module 0x123::ticket_module {use sui::clock::{Self, Clock};use sui::event;use sui::object::{Self, ID, UID};use sui::transfer;use sui::tx_context::{Self, TxContext};struct Ticket has key {id: UID,expiration_time: u64,}struct CreateTicketEvent has copy, drop {id: ID,}struct ClipTicketEvent has copy, drop {id: ID,}public fun create_ticket(ctx: &mut TxContext, clock: &Clock) {let uid = object::new(ctx);let id = object::uid_to_inner(&uid);let ticket = Ticket {id: uid,expiration_time: clock::timestamp_ms(clock),};transfer::transfer(ticket, tx_context::sender(ctx));event::emit(CreateTicketEvent {id,});}public fun clip_ticket(ticket: Ticket) {let Ticket { id, expiration_time: _ } = ticket;object::delete(id);event::emit(ClipTicketEvent {id: object::uid_to_inner(&id),});}
    }
    

总结

模块(module) 组织

Move代码被组织成模块,每个模块类似于其他区块链上的单个智能合约。这种模块化设计在Sui中得到了强调,旨在促使开发者保持模块小巧且分布在不同文件中,同时坚持清晰的数据结构和代码规范。这样做既方便应用程序集成,也便于用户理解。

API和交互

模块通过入口和公共函数提供API,用户可以通过事务或其他Move代码调用这些函数来与模块交互。这些交互由Sui区块链处理,并且会保存任何结果变更。

结构体(Struct)

结构是由相关字段组成的集合,每个字段都有自己的类型,如数字、布尔值和向量。每个结构都可以拥有“能力”,包括键(key)、存储(store)、放置(drop)、复制(copy)。这些能力描述了结构在语言中的行为方式。

数据类型 (data type)

Sui Move 支持以下数据类型:无符号整数、布尔值、地址、字符串、向量以及自定义结构类型

对象 (object)

理解对象的生命周期、如何阅读、更新以及删除对象是学习Move语言的重要部分。此外,还需要区分共享对象与拥有对象的概念。

向量 (vector)

向量被理解为动态数组,对于管理智能合约中的项目列表至关重要,反映了区块链应用程序中对于灵活数据结构的需求。

事件 (event)

事件是模块用来通知应用程序前端区块链上发生了某些事情的一种方式。应用可以监听特定的事件,并在这些事件发生时采取行动。

函数 (fun)

  • 公共函数(使用关键字public):可以从任何其他Move模块和事务中被调用。
  • 私有函数(使用关键字private):只能在同一个模块中调用,不能从事务中调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab的绘图的标题中(title)添加标量以及格式化输出

有时候我们需要在matlab绘制的图像的标题中添加一些变量&#xff0c;这样在修改某些参数后&#xff0c;标题会跟着一块儿变。可以采用如下的方法&#xff1a; x -10:0.1:10; %x轴的范围 mu 0; %均值 sigma 1; %标准差 y normpdf(x,mu,sigma); %使用normpdf函数生成高斯函数…

微服务的自我修养:从拆分到秩序的进化论

文章背景 还记得我第一次接触微服务的场景&#xff0c;那是一个炎热的夏天。系统上线的前一天&#xff0c;单体应用出了点小问题&#xff0c;结果整个平台瘫痪了&#xff01;所有人手忙脚乱修复&#xff0c;但复杂的代码逻辑让进度异常缓慢。 后来听说可以用微服务架构来拆分系…

YOLOv8从菜鸟到精通(二):YOLOv8数据标注以及模型训练

数据标注 前期准备 先打开Anaconda Navigator&#xff0c;点击Environment&#xff0c;再点击new(new是我下载anaconda的文件夹名称)&#xff0c;然后点击创建 点击绿色按钮&#xff0c;并点击Open Terminal 输入labelimg便可打开它,labelimg是图像标注工具&#xff0c;在上篇…

【c语言】指针 (完结)

一、sizeof和strlen的对比 1、sizeof 前面我们在学习操作符的时候&#xff0c;我们学习了sizeof&#xff0c;知道其是计算变量所占内存的大小的&#xff0c;单 位是字节&#xff0c;如果操作数是数据类型的话&#xff0c;计算的就是这个类型的变量所占的内存空间的大…

成语知识竞赛主持稿及串词

一、开场白 A&#xff1a;尊敬的各位老师 B&#xff1a;亲爱的同学们 合&#xff1a;大家好&#xff01; A&#xff1a;冬日的暖阳带着青春的气息扑面而来&#xff0c;我们迎来了XXX中学精英成语知识大赛。 B&#xff1a;欢迎各位来到成语大赛的现场。 A&#xff1a;成语是中华…

【Rust】结构体定义域实例化

目录 思维导图 1. 结构体的定义与实例化 1.1 结构体的基本概念 1.2 定义结构体 1.3 创建结构体实例 1.4 结构体的定义与实例化示例 2. 访问与修改结构体字段 2.1 访问字段 2.2 修改字段 3. 结构体实例的构造函数 3.1 构造函数的定义 3.2 使用字段初始化简写 4. 结…

vue2修改表单只提交被修改的数据的字段传给后端接口

效果&#xff1a; 步骤一、 vue2修改表单提交的时候&#xff0c;只将修改的数据的字段传给后端接口&#xff0c;没有修改得数据不传参给接口。 在 data 对象中添加一个新的属性&#xff0c;用于存储初始表单数据的副本&#xff0c;与当前表单数据进行比较&#xff0c;找出哪些…

Docker 安装开源的IT资产管理系统Snipe-IT

一、安装 1、创建docker-compose.yaml version: 3services:snipeit:container_name: snipeitimage: snipe/snipe-it:v6.1.2restart: alwaysports:- "8000:80"volumes:- ./logs:/var/www/html/storage/logsdepends_on:- mysqlenv_file:- .env.dockernetworks:- snip…

Windows 11更新之后卡顿 (黑神话掉帧严重)问题探索

前提 Windows 11 晚上更新完 24h2 之后&#xff0c;第二天玩黑神话&#xff0c;才40多帧 之前开启插针&#xff0c;可以运行到 120 帧左右 我的配置 9600X 3080 版本退回 用系统自带的 goBack 版本退回 大概不到3分钟 帧数还是不对&#xff0c;于是重做了系统 重做系统 …

[云原生之旅] K8s-Portforward的另类用法, 立省两个端口

前言 此方法适用于Pod不需要大量连接的情况: 有多个pod在执行任务, 偶尔需要连接其中一个pod查看进度/日志;对pod执行一个脚本/命令; 不适用于大量连接建立的情况: pod启的数据库服务;pod启的Api服务;pod启的前端服务;pod启的Oss服务; Portforward简介 Portforward就是端…

宁德时代C++后端开发面试题及参考答案

请阐述面向对象的三大特性。 面向对象编程有三大特性&#xff0c;分别是封装、继承和多态。 封装是指将数据和操作数据的方法绑定在一起&#xff0c;对数据的访问和操作进行限制。这样做的好处是可以隐藏对象的内部细节&#xff0c;只暴露必要的接口给外部。例如&#xff0c;我…

【Linux系统】—— vim 的使用

【Linux系统】—— vim 的使用 1 vim 的基本概念2 vim 的多模式3 命令模式下的命令集3.1 进入/退出其他模式3.2 光标移动命令集3.3 复制/剪切/粘贴/删除命令集3.4 撤销命令集3.5 查找命令集3.6 替换命令集3.7 进入与退出替换模式 4 批量化编译5 底行模式6 vim 小技巧7 vim简单配…

C++11新特性:aligned_storage等空间分配工具

C11对于内存对齐的支持 对齐的数据有助于提高内存的访问效率以及减少程序运行期间因为内存未对齐导致硬件抛出错误的可能。因此在c中&#xff0c;数据的对齐是必不可少的&#xff0c;对于系统而言在默认情况下也是坚持数据对齐这一准则的。关于内存对齐的详细内容可见《C 内存对…

3D滤波器处理遥感tif图像

import cv2 import numpy as np from osgeo import gdal# 定义 Gabor 滤波器的参数 kSize 31 # 滤波器核的大小 g_sigma 3.0 # 高斯包络的标准差 g_theta np.pi / 4 # Gabor 函数的方向 g_lambda 10.0 # 正弦波的波长 g_gamma 0.5 # 空间纵横比 g_psi np.pi / 2 # …

UnityXR Interaction Toolkit 如何检测HandGestures

前言 随着VR设备的不断发展,从最初的手柄操作,逐渐演变出了手部交互,即头显可以直接识别玩家的手部动作,来完成手柄的交互功能。我们今天就来介绍下如何使用Unity的XR Interaction Toolkit 来检测手势Hand Gesture。 环境配置 1.使用Unity 2021或者更高版本,创建一个项…

Unity Protobuf实践

官方文档&#xff1a;https://protobuf.com.cn/overview/ 1. 获取Protobuf&#xff1a; 1.1 通过NuGet包管理器&#xff1a; 拷贝dll&#xff1a; 选择.net2.0的dll&#xff1a; 导入Unity Plugins目录&#xff1a; 1.2 下载源码并生成dll&#xff1a; GitHub - protocolbuf…

【微服务】面试 4、限流

微服务限流技术总结 一、微服务业务面试题引入 在微服务业务面试中&#xff0c;限流是重要考点&#xff0c;常与分布式事务、分布式服务接口幂等解决方案、分布式任务调度等一同被考查。面试官一般会询问项目中是否实施限流及具体做法&#xff0c;回答需涵盖限流原因、采用的方…

VScode 配置 C语言环境

遇到的问题集合 mingw官方下载网站&#xff08;https://sourceforge.net/projects/mingw-w64/files/&#xff09;更新之后&#xff0c;与网上大多数教程上写的界面不同了。 网上大多数教程让下载这个&#xff1a; 但是现在找不到这个文件。 写hello.c文件时&#xff0c;报错&…

语音技术与人工智能:智能语音交互的多场景应用探索

引言 近年来&#xff0c;智能语音技术取得了飞速发展&#xff0c;逐渐渗透到日常生活和各行各业中。从语音助手到智能家居控制&#xff0c;再到企业客服和教育辅导&#xff0c;语音交互正以前所未有的速度改变着人机沟通的方式。这一变革背后&#xff0c;人工智能技术无疑是关键…

26个开源Agent开发框架调研总结(2)

根据Markets & Markets的预测&#xff0c;到2030年&#xff0c;AI Agent的市场规模将从2024年的50亿美元激增至470亿美元&#xff0c;年均复合增长率为44.8%。 Gartner预计到2028年&#xff0c;至少15%的日常工作决策将由AI Agent自主完成&#xff0c;AI Agent在企业应用中…