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.rhkb.cn/news/879.html

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

相关文章

不同方式获取音频时长 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

25年无人机行业资讯 | 1.1 - 1.5

25年无人机行业资讯 | 1.1 - 1.5 中央党报《经济日报》刊文&#xff1a;低空经济蓄势待发&#xff0c;高质量发展需的平衡三大关系 据新华网消息&#xff0c;2025年1月3日&#xff0c;中央党报《经济日报》发表文章指出&#xff0c;随着国家发展改革委低空经济发展司的成立&a…

frp内网穿透

frp CS搭建socks隧道 kali当作客户端&#xff0c;vps当作服务端&#xff0c;webshell机器上传后门&#xff0c;CS上线&#xff0c;使用CS自带socks搭建隧道 选择socks代理 服务端启动&#xff1a;frps -c frpssocks.toml serverAddr "47.104.216.23" serverPort…

【JVM-2.2】使用JConsole监控和管理Java应用程序:从入门到精通

在Java应用程序的开发和运维过程中&#xff0c;监控和管理应用程序的性能和资源使用情况是非常重要的。JConsole是Java Development Kit&#xff08;JDK&#xff09;自带的一款图形化监控工具&#xff0c;它可以帮助开发者实时监控Java应用程序的内存、线程、类加载以及垃圾回收…

Linux之读者写者模型与特殊锁的学习

目录 读者写者模型 特殊锁 悲观锁 自旋锁 在前几期&#xff0c;我们学习了多线程的生产者和消费者模型&#xff0c;生产者和消费者模型中&#xff0c;有三种关系&#xff0c;两个角色&#xff0c;一个场所&#xff0c;那么读者写者模型和生产者消费者模型有什么关联吗&…

MACPA:fMRI连接性分析的新工具

摘要 不同脑区的共同激活为它们之间的功能交互或连接提供了一个有价值的衡量指标。元分析连接模型(MACM)是一种经过充分验证的研究某一特定区域共激活模式的方法&#xff0c;该方法对基于任务的功能磁共振成像(task-fMRI)数据进行种子点(seed-based)元分析。虽然MACM是一种强大…

计算机组成原理(1)

系统概述 计算机硬件基本组成早期冯诺依曼机现代计算机 计算机各部分工作原理主存储器运算器控制器计算机工作过程 此文章的图片资源获取来自于王道考研 计算机硬件基本组成 早期冯诺依曼机 存储程序是指将指令以二进制的形式事先输入到计算机的主存储器&#xff0c;然后按照…

Ubuntu如何安装ESP32-idf

参考文章&#xff1a; Ubuntu配置ESP-IDF&#xff1a; Linux 和 macOS 平台工具链的标准设置 - ESP32 - — ESP-IDF 编程指南 v5.4 文档 知乎 https://zhuanlan.zhihu.com/p/963186891 通过WSL2连接USB串口调试ESP32 通过WSL2连接USB串口调试ESP32_windows wsl连接串口-CSDN博客…

互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅

本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景&#xff1a; 左边是典型的集中控制通信网络&#xff0c;很容易被摧毁&#xff0c;而右边的网络则没有单点问题&#xff0c;换句话说它很难被全部摧毁&#xff0c;与此同时&#xff0c;分…

LeetCode:108.将有序数组转换为二叉搜索树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;108.将有序数组转换为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff…

机器人碳钢去毛刺,用大扭去毛刺主轴可轻松去除

在碳钢精密加工的最后阶段&#xff0c;去除毛刺是确保产品质量的关键步骤。面对碳钢这种硬度较高的材料&#xff0c;采用大扭矩的SycoTec去毛刺主轴&#xff0c;成为了行业内的高效解决方案。SycoTec作为精密加工领域的领军品牌&#xff0c;其生产的高速电主轴以其卓越的性能&a…

【深度学习入门_基础篇】概率论

开坑本部分主要为基础知识复习&#xff0c;新开坑中&#xff0c;学习记录自用。 学习目标&#xff1a; 随机事件与概率、随机变量及其分布、多维随机变量及其分布、大数定律与中心极限定理。 强烈推荐此视频&#xff1a; 概率论_麻省理工公开课 废话不多说&#xff0c;直接…

【ASP.NET学习】ASP.NET MVC基本编程

文章目录 ASP.NET MVCMVC 编程模式ASP.NET MVC - Internet 应用程序创建MVC web应用程序应用程序信息应用程序文件配置文件 用新建的ASP.NET MVC程序做一个简单计算器1. **修改视图文件**2. **修改控制器文件** 用新建的ASP.NET MVC程序做一个复杂计算器1.创建模型&#xff08;…

IoT平台在设备远程运维中的应用

IoT平台是物联网技术的核心组成部分&#xff0c;实现了设备、数据、应用之间的无缝连接与交互。通过提供统一的设备管理、数据处理、安全监控等功能&#xff0c;IoT平台为企业构建了智能化、可扩展的物联网生态系统。在设备远程运维领域&#xff0c;IoT平台发挥着至关重要的作用…

大数据运维管理体系的搭建

[〇]关于本文 本文将介绍一种大型集群的运维管理体系 【大型集群的管理大于解决问题】意在大规模数据集群的运维过程中&#xff0c;系统化、规范化的管理措施比单纯的故障处理更为关键。通过有效的管理&#xff0c;可以预防问题的发生、提升系统的稳定性和性能&#xff0c;从而…

基于 Nuxt3 + Obsidian 搭建个人博客

Nuxt是一个用Vue来编写的&#xff0c;可用来创建类型安全、高性能和生产级全栈 Web 应用程序和网站的全栈框架。后端是 Nitro&#xff0c;一个可以被单独使用的Web服务端框架。 作为一个全栈框架&#xff0c;不仅具备了比使用Vue开发SPA客户端更好的开发体验&#xff0c;还能享…

Leetcode刷题笔记—栈与队列

栈与队列 栈与队列是非常重要的基础数据结构&#xff0c;本文汇总了《代码随想录》和《Leetcode101》中关于栈与队列的练习题及其题解&#xff0c;旨在帮助读者更深入地理解相关概念和解题思路。如有疏漏或错误&#xff0c;恳请批评指正。 文章目录 栈与队列1. 栈[232. 用栈实…

MongoDB如何使用

1.简单介绍 MongoDB是一个开源、高性能、无模式的文档型数据库&#xff0c;当初的设计就是用于简化开发和方便扩展&#xff0c;是NoSQL数据库产品中的一种。是最 像关系型数据库&#xff08;MySQL&#xff09;的非关系型数据库。 MongoDB是一个基于分布式文件存储的数据库由C语…

二、BIO、NIO编程与直接内存、零拷贝

一、网络通信 1、什么是socket&#xff1f; Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作 系统提供。客户端连接上一个服务端&#xff0c;就会在客户端中产生一个 socket 接口实例&#xff0c;服务端每接受 一个客户端…

git flow流程拆解实践指导

常听人说到git flow,但实际开发过程中是如何落地的? 现在让我们按实际工作中的步骤进行拆解,大家完全可以不用通读,当遇到相应流程步骤时能用上本说明进行查阅参考即可,希望对于推进git flow流程的实际落地起到一些积极的作用. 目录 正常版本开发 开始一个特性开发提测一个版…