Move 2024版本已上线主网,版本迁移指南了解一下

2024-04-22 22:12

本文主要是介绍Move 2024版本已上线主网,版本迁移指南了解一下,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Move 2024版本迁移引入了一些变化,使得编写Move更加容易,也更容易阅读。源语言中相对较少的重大变化更好地使Move能够处理未来的进展。

这其中的许多变化增强了源语言,影响了编译器,而不需要对发布在链上的二进制表示进行任何更改。

现有的代码将继续编译,即使增加了这些新功能。由于这些功能是可选的,即使您的依赖项不包含它们,您也可以在您的packages中使用新功能进行编写。然而,在当前模块中选择利用新功能引入了一些重大变化。

欢迎阅读我们在GitHub上的迁移指南以获取完整的详细信息。

如何迁移

要将项目迁移到 Move 2024 Beta版本,您有两个选项:

  1. 删除现有的 Move.lock 文件(如果存在),以确保您使用最新的 sui-framework 版本。
  2. 在您的 Move 项目的根目录运行 sui move migrate。有关更多信息,请参阅迁移指南中的自动迁移部分。

或者,更新您的 Move.toml 文件中的 [package] 条目,将 edition = “2024.beta” 包含在内。如果这样做,您可能会因我们的重大变化而收到一些新的错误。

自动迁移

Move 2024 包含一个自动迁移脚本,您可以在 Move 项目的根目录中调用 sui move migrate 来使用。运行该脚本时,您的控制台会提示您选择要使用的 Move 版本。如果您选择 2024.beta,脚本将调用编译器,并尝试自动更新您的代码,以避免更新引入的重大变化(包括将结构标记为 public、使用 mut 关键字标记可变变量、避免受限制的关键字、将 friends 替换为 public(package),甚至在许多情况下更新路径为全局路径)。

在运行此脚本后,您的控制台会显示脚本打算进行的更改的差异。如果您接受更改,脚本将自动更新您的代码和 Move.toml 文件。您现在正在使用 Move 2024 Beta。

新功能

以下是 Move 2024 中一些新功能的简要概述。

方法语法Method syntax

现在您可以使用 . 语法将某些函数作为方法调用。例如,以下调用:

vector::push_back(&mut v, coin::value(&c));

现在可以写成:

v.push_back(c.value());

在这个例子中,如果需要,方法的接收者(v 和 c)会自动借用(分别为 &mut v 和 &c)。

如果函数在与接收者类型相同的模块中定义,您可以将其作为方法调用,前提是它将接收者作为其第一个参数。

对于在模块外定义的函数,您可以使用 public use fun 和 use fun 声明方法。

索引语法Index syntax

使用方法语法,您可以将某些函数注释为 #[syntax(index)] 方法。然后,您可以使用 v[i] 形式的调用来调用这些方法。

例如:

*&mut v[i] = v[j];

可以解析为:

*vector::borrow_mut(&mut v, i) = *vector::borrow(&v, j);public(package)

friend 声明以及相关的 public(friend) 可见性修饰符已经过时。取而代之的是 public(package) 可见性修饰符,它只允许在定义它们的同一包中调用函数。

位置字段Positional fields

现在您可以定义具有位置字段的结构,通过以零为基的索引来访问这些字段。例如:

public struct Pair(u64, u64) has copy, drop, store.

然后访问每个字段:

public fun sum(p: &Pair): u64 {
p.0 + p.1
}

正如这个例子所示,您现在可以在结构字段列表之后声明能力。

嵌套use和标准库默认值

现在您可以为了更简洁性而嵌套use别名。

use sui::{balance, coin::{Self, Coin}};

此外,以下 use 声明现在会自动包含在每个模块中:

use std::vector;
use std::option::{Self, Option};
use sui::object::{Self, ID, UID};
use sui::transfer;
use sui::tx_context::{Self, TxContext};

相等性自动引用

相等性操作,== 和 !=,现在如果一侧是引用而另一侧不是,则会自动借用。例如:

fun check(x: u64, r: &u64): bool {
x == r
}

相当于

fun check(x: u64, r: &u64): bool {
&x == r
}

这种自动借用可以发生在 == 和 != 的任一侧。

循环标签

当嵌套循环时,直接跳转到外层循环可能更方便。例如:

let mut i = 0;
let mut j = 0;
let mut terminate_loop = false;
while (i < 10) {
while (j < 10) {
if (haystack(i, j) == needle) {
terminate_loop = true;
break;
};
j = j + 1;
};
if (terminate_loop) break;
i = i + 1;
}

现在,您可以直接为外部循环(在本例中为 outer)命名,并一次性中断它:

let mut i = 0;
let mut j = 0;
'outer: while (i < 10) {
while (j < 10) {
if (haystack(i, j) == needle) break'outer;
j = j + 1;
};
i = i + 1;
}

带值的中断break

现在可以从循环中断中返回值。例如:

let mut i = 0;
let x: u64 = loop {
if (v[i] > 10) break i;
i = i + 1;
};

您也可以使用标签来实现这一点。例如:

let mut i = 0;
let mut j = 0;
let item = 'outer: loop {
while (j < 10) {
let item = haystack(i, j);
if (item == needle) break'outer option::some(item);
j = j + 1;
};
i = i + 1;
if (i == 10) break option::none();
};

重大变更

遗憾的是,Move 2024 中的重大变更正在增加。我们预计这些变更对现有代码的侵入性将最小化,并提供了迁移脚本,以在大多数情况下自动处理这些变更。此外,这些变更为 Move 2024 中即将推出的新功能铺平了道路。

数据类型可见性要求

目前,在 Move 中,所有结构体都是公共的:任何其他模块或包都可以导入它们,并按类型引用它们。为了使这一点更清晰,Move 2024 要求所有结构体都必须使用 public 关键字声明。例如:

// legacy code
struct S { x: u64 }
// Move 2024 code
public struct S { x: u64 }

现在,任何非公共结构体都会在此时产生错误,而Move团队正在为未来的发布工作中探索新的可见性选项。

可变性要求

以前,在 Move 中,所有变量都是隐式可变的。例如:

fun f(s: S, y: u64): u64 {
let a = 0;
let S { x } = s;
a = 1;
x = 10;
y = 5;
x + y
}

现在,您必须明确声明可变变量:

fun f(s: S, mut y: u64): u64 {
let mut a = 0;
let S { mut x } = 5;
a = 1;
x = 10;
y = 5;
x + y
}

如果尝试在没有此明确声明的情况下重新分配或借用可变变量,则编译器将产生错误。

移除 friends 和 public(friend)

在 Move 的早期开发中引入了 friends 和 public(friend) 可见性,甚至早于包系统。如 public(package) 部分所示,public(package) 在 Move 2024 中取代了 public(friend)。

下面的声明现在会产生错误:

module pkg::m {
friend pkg::a;
public(friend) fun f() { … }
}
module pkg::a {
fun calls_f() { … pkg::m::f() … }
}

而如果想要使函数仅在包内可见,应该写成:

module pkg::m {
public(package) fun f() { … }
}
module pkg::a {
// this now works directly
fun calls_f() { … pkg::m::f() … }
}

新关键字

展望未来,Move 2024 Beta为语言添加了以下关键字:enum、for、match、mut 和 type。不幸的是,如果在其他位置发现这些关键字,编译器现在会产生解析错误。随着语言的成熟,这是必要的变更。如果执行自动迁移,迁移工具将这些重命名为 enum 等,并重写代码以使用这些转义形式。

修订的路径和命名空间

与传统的 Move 相比,Move 2024 对路径和命名空间的工作方式进行了修订,以便未来更轻松地处理 enum 别名。考虑以下来自 sui_system 库中测试注释的代码片段:

use sui_system::sui_system;
…
#[expected_failure(abort_code = sui_system::validator_set::EInvalidCap)]

传统的 Move 总是将三部分名称视为地址(sui_system)、模块(validator_set)和模块成员(EInvalidCap)。而 Move 2024 尊重 use 的范围,因此属性中的 sui_system 解析为模块,在整体上产生名称解析错误。

为避免这种情况是预期行为的情况,Move 2024 引入了全局资格的前缀操作。要使用它,可以将此注释重写为:

use sui_system::sui_system;
…
#[expected_failure(abort_code = ::sui_system::validator_set::EInvalidCap)]
// ^ note `::` here

迁移脚本尝试在可能的情况下使用全局资格来纠正命名错误。

一直前进

Move 2024 Beta 版本除了上述的重大变更外,还带来了一些强大的新功能。未来还将有更多的功能。请加入Sui邮件订阅以了解今年即将推出的 Move 新功能,包括语法宏、带模式匹配的枚举和其他用户定义的语法扩展。

请通过GitHub、Discord或Sui开发者论坛提供任何反馈或报告您遇到的问题。


关于 Sui Network

Sui是基于第一原理重新设计和构建而成的L1公有链,旨在为创作者和开发者提供能够承载Web3中下一个十亿用户的开发平台。Sui上的应用基于Move智能合约语言,并具有水平可扩展性,让开发者能够快速且低成本支持广泛的应用开发。获取更多信息:https://linktr.ee/sui_apac

官网|英文Twitter|中文Twitter|Discord|英文电报群|

中文电报群

这篇关于Move 2024版本已上线主网,版本迁移指南了解一下的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/927000

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

2024/9/8 c++ smart

1.通过自己编写的class来实现unique_ptr指针的功能 #include <iostream> using namespace std; template<class T> class unique_ptr { public:         //无参构造函数         unique_ptr();         //有参构造函数         unique_ptr(