Move语言入门 | 你的第一个Move语言智能合约或许可以这样写
摘要: 作为一种更安全的智能合约编程语言,我想大家应该都迫不及待的想体验使用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 MoveStdlib
BUILDING FirstMoveProject
#发布模块
编译好模块后,我们在沙盒环境使用move sandbox publish -v 发布字节码到0xCAFE下。Found 1 modules
Publishing 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多亿美元。欢迎点击公众号留言框,与我们联系。
评论(0)
Oh! no
您是否确认要删除该条评论吗?