move hello_world
Move vs Solidity
Move语言说难也难,说简单特别的简单。受限于智能合约的场景,Move不可能复杂。比起高级语言,例如并发编程、网络调用等等,智能合约语言是一个完全隔离的环境,完全串型执行,使用特别的简单(很期待哪天能设计出一种并发执行智能合约的模型出来)。所以,如果你会任何一种高级语言,完全不用担心学不会Move,实在是太简单了。
跟Soidity对比,最核心的区别,Solidity是动态语言,Move纯静态语言。在扩展性方面,Solidity依靠的是动态调用,而Move因为是静态语言,所以为了保证扩展性,Move选择了泛型编程的范式。但是正是这种底层大方向的不同,导致了安全性的巨大差异(需要说明的是,Move是从Solidity的真实安全漏洞中吸取了经验教训,才选择一种截然不同的路线)。
(从学习的角度来说,我并没有贬低Solidity的意思,所以不要以为我在搞语言之争,放平心态。)
Move最核心的两个特性是:
- 面向资源编程
- 面向泛型编程
但是上面的两个核心特性,远不足以概况Move的优点。Move有很多的安全特性,很多都对开发者完全透明,例如算数溢出、默认可见性导致的权限泄露等等(合约开发者不需要花太多的心思在安全上,Move语言已经帮你做了很多的安全处理,尤其是很多低级的安全隐患)。可以说,Move从语言层面,大幅降低了开发者的安全门槛,开发者只需要专注业务模型上的设计与实现。除此之外,Move在可扩展性的基础上,工程上也有很强的实力,能够非常轻松地设计出复杂的工程,我认为这一点也是不容忽视的。
Move & Aptos
不管出于什么目的,我们已经开始行动,学习Move了,希望对你来说这是一个愉快的过程。让我们开始吧。
对于很多刚入门的朋友来说,经常搞不清楚Move和Aptos、Sui、Starcoin等公链的关系,尤其是这些公链都有各自的IDE和Framework,有点蒙圈。对于初学者来说,到底应该怎么入手呢?
Move是一门编程语言,本身是中立的,这里是Move官方的Github仓库。那为什么还会有各种IDE和Framework呢?
各个公链在发展的过程中,可能会有一些特殊的需求,需要用到Move暂时没有的一些功能,所以通常会从Move的Github中fork一份代码,自己稍加修改(别担心,通常不会是大的修改,或者以后会有兼容方案),以满足自身的发展。在自有版本的Move之上,因为需要对自己的链结合,例如Account模型上可能一些差别,或者方便开发者基于自己的链快速开发Dapp,通常会封装一层Framework。
对于我们在学习Move语言基础的时候,建议使用Move官方的版本(以后基于某个公链实战,再考虑选择Framework的问题)。
搭建Move环境
我们这里以Move官方标准库为基础学习Move,先搭建Move的开发环境。
截止目前,Move还没有一个很好的开发环境。好消息是,比起我学Move的时候,已经非常的方便了(2019年的时候,Move本身还不稳定,完全没有可用的IDE,靠纯文本编辑器写代码,而且错误提示经常不对)。由于Move官方没有可以直接下载的二进制Release版本,我们需要自己手动编译,需要先安装一些依赖。
① 安装和学习Git
这里不介绍了,开源系统,基本都通过Git协作,不会的请先查看Git教程(当然也可以绕过Git,直接下载源码到本地)。
② 安装Rust环境
Move官方的库是用Rust实现的,并且没有可直接下载的二进制包,所以我们先搭建Rust的编译环境(这块教程很多,自己去网上找一下,这里不详细说)。这里需要注意的是,并不要求对Rust了解,只需要借助Rust完成Move环境的搭建。
通过下面命令确定Rust环境是否安装成功:
$ rustc -V
③ 编译安装Move环境
先通过Git下载Move代码(假设Git已经安装好):
$ git clone https://github.com/move-language/move
下载完成之后,编译和安装Move-cli:
$ cargo install --path move/language/tools/move-cli
这种方式安装的Move会在 cargo home里,例如~/.cargo/bin。查看安装结果:
$ move -h
如果安装正确,会显示move的帮助信息。
这时候,Move环境已经搭建好了。
Move插件和IDE
前面搭建了Move的编译环境,如果想要快速开发Move程序,还需要选择合适的IDE(主要是高亮和自动提示等,帮助开发)。我习惯使用Idea开发,大家也可以选择VS Code等IDE。
怎么理解Move环境和Move插件(IDE)呢?
Move的IDE会做一些语法提示、检查以及高亮显示,帮助我们快速开发Move。但是代码能否运行,需要依赖Move环境,编译不出错,则说明代码没有语法上面的问题。所以,Move环境和Move的IDE对我们来说,都很重要。
第一个Move程序:HelloWorld
前期的准备完成,我们可以愉快的学习Move了。按照行业惯例,我们写第一个HelloWorld例子。
① Move命令使用
首先,通过前面安装的Move命令,生成一个hello_world的项目:
$ move new hello_world
结果如图所示:
生成了Move.toml文件和source目录,这里先不介绍各自的作用。
② 编写HelloWorld程序
这里可以使用IDE引入刚创建的hello_world项目(以Idea为例)。在source文件夹上点击右键,选择Move File
。生成一个叫hello_world的Script(以后会详细介绍Script的作用):
生成一个hello_world.move的文件,如下图所示:
在编写代码之前,我们需要打开Move.toml文件设置依赖(整个风格跟Rust有点像):
[addresses]
std = "0x1"
[dependencies]
MoveNursery = { git = "https://github.com/move-language/move.git", subdir = "language/move-stdlib/nursery", rev = "main" }
其中dependencies配置依赖的代码,这里指定到Move官方的Github仓库。addresses需要格外注意,要跟Move官方的stdlib中的地址变量保持一致。由于Move代码里面是std,所以我们这里也用std(大小写也要一致)。
终于到编写Move代码这一步了。打开hello_world.move文件,输入代码:
script {
use std::debug;
fun main() {
debug::print(&b"hello world");
}
}
HelloWorld的代码就完成了。也是最关键的一步,编译代码:
move build
编译成功,说明代码没有问题。
最后一步,验证结果:
move sandbox run sources/hello_world.move
打印结果出来了。
跟我学Move
今天主要是教大家如何搭建Move的开发环境,并写了第一个Move程序,顺便解答了一些有关Move的疑惑。
欢迎关注tw账号@MoveContract,跟我一起学Move(或者关注知乎”Move小王子”订阅“手把手写Move智能合约”专栏)。下期我们将会介绍Move的基础语法。
https://github.com/tiangong3624749/LearnMove/blob/main/hello_world.move.md