背景

过去的三个月可能是我过去几年离一百万最近的一次,错过了aptos的空投,几分钟就可以做一个任务,最后空投了150APT代币,最高时价值4W。。。真的是真金白银的教训。不过作为一个开发者,看到的更多是区块链未来的价值,所以开始真正投入到智能合约开发的学习中去,新开一个系列Move语言与智能合约开发,move语言就是aptos链上智能合约开发的语言,也是其特色之一。

什么是Move

Move是一种新的智能合约的开发语言,它和C,C++一样都是一种编程语言,但是其主要用于编写智能合约,那么什么又是智能合约呢,以下是维基百科的定义,由此可知智能合约是指根据协定能够自动执行、控制活记录相关事件和行为的计算机程序或交易协议。这里我们可以先简单把智能合约理解成一个程序,区块链和智能合约更多内容之后会专门讲解(又开一个新坑)。可以做一个简单的类比,区块链就是一个操作系统,而智能合约就会运行在这个操作系统上的应用程序,不同的操作系统编写应用程序的语言也不同,在aptos上move就是编写智能合约的语言。

A smart contract is a computer program or a transaction protocol that is intended to automatically execute, control or document legally-relevant events and actions according to the terms of a contract or an agreement.

环境配置

还是那句话,工欲善其事,必先利其器。首先需要安装move的命令行工具move-cli,
使用以下命令就可以安装,前提是已经安装过cargo,关于cargo的安装可以自行google。

cargo install --path move/language/tools/move-cli

cargo install --git https://github.com/diem/move move-cli --branch main

安装完成后还需要配置环境变量,一般情况下move-cli会安装在~/.cargo/bin目录下,所以需要把这个路径加入到环境变量中去,然后使用以下命令,如果正常执行则说明安装成功。

move

然后使用以下命令新建一个move项目,用VS Code打开就可以开始使用move开始编程了。

move package new 

move中一些特殊概念

与其他的智能合约编程语言如Solidity不同,Move试图将脚本和模块分离开,脚本可以让开发者在事务中添加更多的逻辑而且在存储时间和资源时更加灵活,而模块则是让开发者去扩展区块链的功能以及通过诸多选项去定制智能合约,首先我们会先了解如何去编写Move的脚本。

基本类型

与其他的编程语言一样,Move也内置了一些基本的数据类型,但是由于是专门针对智能合约的开发场景,所以内置的数据类型与一般熟知的编程语言并不相同,Move内置的数据类型有整型(u8, u64, u128),布尔类型boolean以及地址类型address。

整型

Move中整型又u8,u64和u128三种,以下代码说明了如何去声明变量以及赋值。

script {fun main() {// 定义一个空变量然后赋值let a: u8;a = 10;//定义一个变量并赋值let a: u64 = 10;//简单赋值let a = 10u128;//在函数或者表达式中可以讲整型视为不可变的值if (a < 10u8) {};//在一般情况下不需要指明类型if (a < 10) {};}}

在需要比较值时不同类型的值要进行转化,转换成同一类型的值时才能进行比较,在Move中使用as关键字实现类型转换,不同类型的值是无法比较的,例子如下:

script {fun main() { let a: u8 = 10; let b: u64 = 100;//只有相同类型的数据才能比较 if (a == (b as u8)) abort 11; if ((a as u64 == b)) abort 11;}}
布尔类型Boolean

在Move中Boolean的定义与其他语言中布尔类型的定义别无二致,都是只有两个值true和false。

script {fun main() {let b: bool;b = true;let b: bool = true;let b = true;let b = false;}}
地址类型Address

地址类型算是编写智能合约语言相较于其他语言特有的类型,它代表了一个区块链的地址,用于发送代币和引入模块,在不同的区块链对于地址类型的定义也不同如在Diem中地址是16字节的16进制数,在dfinance的DVM中地址有”wallet1″的前缀。

script {fun main() {let addr: address;//可以通过{{}}获取地址addr = {{sender}};// Diem中是16字节的16进制数addr = 0x....;// 在dfinance DVM中地址又“wallet1”的开头addr = wallet1...;}}

注释

为了使程序更加可读,注释是必不可少的,与大部分语言相同,Move的注释也有两种,单行注释和多行注释。

单行注释
script {fun main() { // 单行注释}}
多行注释
script {fun main() { /*多行注释多行注释多行注释多行注释多行注释多行注释 多行注释多行注释多行注释多行注释*/}}

最后

这篇文章主要介绍了Move语言开发的环境配置和一些基本概念。更多文章可以关注公众号QStack。