查看原文
其他

Move语言入门 | 你的第一个Move语言智能合约或许可以这样写

Beosin Beosin 2023-02-07

关于Move的研究系列文章,我们此前已经出过相关内容。


1 从安全角度看Move语言(上)

2 从安全角度看Move语言(下)

3 智能合约的重要变革,如何使用Move Prover?


目前采用Move编程语言的公链中,热度较高的是Aptos、Sui和Starcoin,三者开发进度和生态处在相对领先的地位。

作为一种更安全的智能合约编程语言,我想大家应该都迫不及待的想体验使用Move编写智能合约了吧。今天Beosin就将带着大家从环境搭建、创建项目、编译模块、发布模块、以及通过脚本调用模块函数,一步一步认识Move合约。

系列课程我们将由浅到深,带大家慢慢了解。

#环境搭建


为了方便接下来学习Move合约,我们首先需要安装Move开发环境以及相应的工具,那么接下来请跟随小编的脚步一步一步安装好Move开发环境以及相应的工具:


第一步:我们需要先安装Rust环境,由于Move官方的库是用Rust实现的,并且没有可直接下载的二进制包,所以需要安装Rust的编译环境。

使用以下命令安装Rust环境:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
第二步:紧接着我们安装Move 命令行工具-Move CLI;Move CLI提供了与 Move 交互、编写和运行 Move 代码等一系列功能的简单方法。

使用以下命令安装Move CLI:

cargo install --git https://github.com/move-language/move move-cli --branch main
#创建项目

和其它编程语言一样,开发一个项目的第一步是创建一个默认的空项目。我们使用创建Move项目的命令,创建一个名为FirstMoveProject的空Move项目。

move new FirstMoveProject

之后我们可以得到FirstMoveProject项目,其目录结构如下:

FirstMoveProject├─ Move.toml └─ sources

在上面的目录中,sources路径下用来存放Move源代码;Move.toml是个配置文件,主要用来配置一些依赖项。

#添加一个Move模块


创建好空Move项目后,那么接下来小编带大家去看一下Move合约是什么样子的。首先我们需要为这个项目添加一个Move模块。模块(module)作为Move编程中的一个核心概念,相当于智能合约的意思。它是由定义的结构体类型以及对这些类型进行操作的函数组成的库。


我们使用下列命令在sources路径下创建一个名字为point.move的文件。

touch FirstMoveProject/sources/point.move

并在point.move中编写一个Move模块(即Move中的智能合约),代码如下:

module 0xCAFE::point{ //结构体Point的定义,表示二维平面坐标中的一个点,有x和y两个字段。 struct Point has copy, drop, store { x: u64, y: u64, } //根据传入的x和y生成一个Point结构体实例。 public fun new(x: u64, y: u64): Point { Point { x, y } } //获取结构体Point的x字段 public fun x(p: &Point): u64 { p.x } //获取结构体Point的y字段 public fun y(p: &Point): u64 { p.y }     //求|a-b|的值 fun abs_sub(a: u64, b: u64): u64 { if (a < b) { b - a } else { a - b } }     //计算p1和p2两点的距离。 public fun dist_squared(p1: &Point, p2: &Point): u64 { let dx = abs_sub(p1.x, p2.x); let dy = abs_sub(p1.y, p2.y); dx*dx + dy*dy }
}

该代码块定义了一个 Move 模块。第一行代码module 0xCAFE::point中的module用来声明该代码块表示一个模块,模块名叫point

0xCAFE是一个地址,编译后的模块将被发布到该地址下。代码的块的中间部分定义了一个叫Point 的结构体,该结构体后面还跟着has copy, drop, store ,其中copy代表该结构体可以被复制,drop代表可以被丢弃,store可以将该结构体资源存储在区块链上。

代码中间部分还定义了数个函数,new()dist_squared()等函数都是对point结构体实例的操作。其中new()代表新建一个二维平面坐标点,dist_squared()是计算p1和p2表示的两个二维平面坐标中两个点的距离。

#编译模块


通过上一小节的讲解,我想大家对Move模块有了一定的了解。当模块编写完成后,我们紧接着需要对编写后的Move代码进行编译得到相应的字节码。使用move build编译sources路径下的Move代码,编译命令如下:

move build
运行上面的命令可以得到下面的结果
INCLUDING DEPENDENCY MoveStdlibBUILDING FirstMoveProject

#发布模块


编译好模块后,我们在沙盒环境使用move sandbox publish -v 发布字节码到0xCAFE下。

Found 1 modulesPublishing a new module 0000000000000000000000000000cafe::point (wrote 293 bytes)Wrote 293 bytes of module ID's and code

#通过脚本调用模块函数


模块发布后,我们该怎么调用模块函数呢?这里就需要用到脚本(script),脚本通常用来调用已发布模块的函数。下面我们将创建一个脚本来调用之前发布的point模块函数。我们在source目录下创建一个名字为test_script.move的文件。

touch FirstMoveProject/sources/test_script.move

并在test_script.move中编写一个script,代码如下:

script {use 0xCAFE::point;use std::debug;fun test_script() { let x1=2; let y1=2; let x2=4; let y2=4; //创建点point1(2,2) let point1=point::new(x1,y1); //创建点point2(4,4) let point2=point::new(x2,y2); //调用dist_squared() 计算point1和point2之间的距离 let dis=point::dist_squared(&point1,&point2); //debug 将计算的结果输出到命令行中 debug::print(&dis);}}

该代码块定义了一个脚本(script)。第一行代码中的script 关键字用来声明该代码块表示一个脚本。接着使用use导入0xCAFE地址下的point模块和std地址下的debug模块。最后定义了主函数 test_script,该函数的命名可以随意。需要注意的是脚本里面只能有一个函数。test_script()的主要作用是调用point模块的dist_squared函数计算两个点的距离,并打印出这个距离值。

编写好脚本后,我们使用以下命令在沙盒环境中运行脚本:

move sandbox run sources/test_script.move

运行后的结果如下所示:

[debug] 8

#总结

有人说,Move是新一代区块链智能合约语言,有望成为区块链下一代通用的基础设施。它的特点包括:将资产作为一等公民编程(First-class Resources);通过静态调用、虚拟机沙盒等确保其安全性;同时具有可验证性、灵活性、合约可组合性。能为DeFi、NFT项目开发者提供了优质的选择,为项目开发提供更多想象力。

但是与任何编程语言一样,Move 应用程序也需要一组适当的工具来编译、运行和调试。本文章主要讲解了如何创建一个Move项目、编译模块、发布模块以及如何通过脚本调用模块函数来讲解Move合约。相信通过今天的学习,大家应该对Move合约有了一定的认识。

下一期,我们将带大家认识关于Move的更多知识。


同时,1月17-18日,Beosin联合SUSS NiFT(新加坡新跃社科大学普惠金融科技节点)、The Blockchain Association Singapore (新加坡区块链协会),在新加坡新跃社科大学校园里, 开展了一场《Web3安全系列》线下课程。(英语授课)


在2023年1月18日-19日,Beosin也收到马来西亚精英大学(HELP University)的邀请,将在这两天开展《Web3安全系列》线上课程

两所大学的课程将作为全免费课程,提升你的Web3安全知识,欢迎扫码报名!(英语授课)

接下来,我们还将建立区块链安全社区,联合更多高校、科研单位等,不定期进行安全技术交流与安全课程公益培训,培养区块链安全人才,共同讨论区块链技术新话题及新的挑战。如果您也有这方面的需求,欢迎与我们联系!

Beosin作为一家全球领先的区块链安全公司,在全球10多个国家和地区设立了分部,业务涵盖项目上线前的代码安全审计、项目运行时的安全风险监控、预警与阻断、虚拟货币被盗资产追回、安全合规KYT/AML等“一站式”区块链安全产品+服务,目前已为全球2000多个区块链企业提供安全技术服务,审计智能合约超过3000份,保护客户资产高达5000多亿美元。欢迎点击公众号留言框,与我们联系。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存