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

Beosin
Beosin 机构得得号

Jan 13, 2023 Beosin是总部位于新加坡的全球知名区块链安全公司,为区块链生态提供代码安全审计,安全风险监控、预警与阻断,虚拟资产被盗追回,KYT/AML等“一站式”安全产品+服务,已为全球2000多个区块链企业服务,保护客户资产5000多亿美元。

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

关于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多亿美元。欢迎点击公众号留言框,与我们联系。

链得得仅提供相关信息展示,不构成任何投资建议
本文系作者 Beosin 授权链得得发表,并经链得得编辑,转载请注明出处、作者和本文链接

更多精彩内容,关注链得得微信号(ID:ChainDD),或者下载链得得App

分享到:

相关推荐

    评论(0

    Oh! no

    您是否确认要删除该条评论吗?

    分享到微信