Move 视频教程第一期 |开发环境的搭建 🎥

视频来源youtube 需要科学上网!

文字版本教程 ➡️

0x0、简介

MOVE是一个大家同样在过程中,以安全性的编写记录下来的语言,个人正在慢慢发现目前并没有形成学习结构的探索教程,所以打算将自己的探索,帮助踩到坑,这是第一个篇记录寻找aptos的MOVE IDE配置的笔记,如有错误欢迎大家指正。

联系我:Discord:k8ssssss#1673

0x1、浏览器开发环境

如果你只是想简单的体验一下move的语法,那么推荐使用浏览器开发环境Move Playground

地址:https://playground.pontem.network/

先来看下全景图的功能。

通过一个简单的脚本来演示如何使用

首先收集所有数据,然后创建我们的新项目test_script

然后我们点击项目目录,展开目录树,工程目录结构如下

项目名称(项目名称)
脚本(存放脚本目录)
来源(加载模块)
测试(存放测试文件)
分别在scripts和sources目录下创建文件test_script.move和test_module.move

创建完成后,点击文件就可以在打开的文件中打开编辑窗口,我们在下面的test_module.move代码中

module 0x01::Math {		//在0x01地址下定义一个名为Math的module
    public fun sum(a: u64, b: u64): u64 {		//定义一个公开的函数,名为sum 需要输入u64类型的a、b 返回一个u64类型的值
        a + b
    }
}

在test_script.move中写入以下代码

script {			//定义一个script
    use 0x01::Math;			//	引入Math module
    use 0x1::Debug;			//  引入内置module Debug

   fun test_script(a: u64, b: u64) {	//定义 一个函数要求输入a、b两u64类型的值
     let c = Math::sum(a,b);		//定义一个变量c 赋值为a、b之和
     Debug::print(&c);			//输出变量c
   }
}

在Run Script功能栏执行test_script(2,3),就可以获得结果等于5,同时可以看到消耗的gas数量。

0x2、本地开发环境构建

基于Clion

1、安装aptos CLI

前往发布页面下载最新的二进制文件,当前最新的发布版本是V0.2.0

https://github.com/aptos-labs/aptos-core/releases

下载解压之后放到你想要的目录下面,由于Mac的安全策略问题需要手动有右键打开一次。然后需要把apts添加进环境变量

我这里终端配置的是zsh,所以我直接写入了家目录下的.zshrz文件,可以根据自己的环境来。

export PATH="/Users/moonly/aptos:$PATH"

完成之后重新打开终端,执行aptos,显示如下信息就是完成安装了

 CLI的具体操作

说明可以看官方的文档:https://github.com/aptos-labs/aptos-core/blob/main/crates/aptos/README.md#install-the-aptos-cli

2、Clion 联动CLI

安装 Move Language插件

安装中文插件

完成后重启CLion,新建项目时就可以选择MOVE了。新建一个项目

然后我们需要对aptos进行初始化,点击左下角的终端打开命令行,输入aptos init

命令会交互式的让你提交REST地址、水龙头地址和钱包私钥,如果全部直接回车,则会默认使用公共开发网的地址。

最终会返回一个钱包地址,需要复制这个钱包地址。

将上面的钱包地址写入项目目录中的Move.toml文件中

这样我们就完成了IDE的配置。

3、编写测试

在sources目录下右键新建MOVE文件

选择Module然后输入文件名test_module

写入以下代码,一个简单的加法


module Sender::Math {
    public fun sum(a: u64, b: u64): u64 {
        a + b
    }
}

然后创建tests目录

然后在tests目录下创建文件test_script.move,类型选择Test

写入以下代码,引入刚刚我们的Math,然后计算a+b 并验证结果是否等于50

#[test_only]
module Sender::MathTest {
    use Sender::Math;

    #[test]
    fun test_add() {
        let a = 20;
        let b = 30;

        let r = Math::sum(a, b);
        assert!(r == 50, 1);
    }
}

切换回test_module.move文件,然后点击右上角Build后的三角形按钮进行本地编译

下方会显示结果,如果有报错也会在下面显示,可以看到我们的Math以及发布在我们的钱包地址下了。然后我们之前在Move.toml文件中将地址设置为别名Sender,现在就可以在脚本中用use Sender::Math;来引入Math了。

切换到test_script.move文件,点击方法旁边的绿色三角形可以直接运行函数

也可以通过右上角进行运行

可以看到运行成功

assert!关键字是一个类似于solidity中的require,它接受2个参数,第一个参数是一个布尔表达式,如果结果为假就会报错第二个参数的错误码,并终止执行回退操作,如果我们把代码修改一下,再次执行就会报错了。

#[test_only]
module Sender::MathTest {
   use Sender::Math;
   #[test]
   fun test_add() {
       let a = 20;
       let b = 30;

       let r = Math::sum(a, b);
       assert!(r == 51, 1);
   }
}

0x3、基于VS Code

1、安装插件

VS Code中有两个Move插件

一个是Move核心团队维护的move-analyzer,一个是由Pontem 团队维护的Move Language

这里我选择了move-analyzer,插件依赖组件move-analyzer语言服务器,move-analyzer语言服务器是一个 Rust 程序,所以需要先安装Rust 的包管理器cargo.安装完成后执行cargo -V查看版本

curl https://sh.rustup.rs -sSf | sh

开始安装move-analyzer,由于aptos与Move标准风格的地址格式不同,所以需要加上参数--features "address32",安装完成后执行move-analyzer --version查看版本,然后执行where is move-analyzer找到二进制文件的路径,待会配置插件需要用到。

cargo install --git https://github.com/move-language/move move-analyzer --features "address32"

打开VS Code搜索安装插件,安装完成后点击小齿轮选择扩展设置。

写入刚刚获取的二进制文件路径,然后重启VS Code

2、安装aptos CLI并初始化项目文件夹

安装方法可以看上面Clion的章节。安装完成后用VS Code打开一个新的文件夹,此时它应该是空的。打开终端执行aptos move init --name <项目名称>就会生成项目结构,同时包含一个Move.toml文件。

然后执行aptos init 命令会交互式的让你提交REST地址、水龙头地址和钱包私钥,如果全部直接回车,则会默认使用公共开发网的地址。最终会返回一个钱包地址,需要复制这个钱包地址。写入Move.toml文件中格式为<钱包别名> = “0x<钱包地址>” ,如果你想修改这个配置可以在项目目录下.aptos/config.yaml找到它

用一个官方的HelloBlockchain来演示一下如何进行编译和运行代码,源码github地址:https://github.com/aptos-labs/aptos-core/tree/main/aptos-move/move-examples/hello_blockchain

这个用例的核心功能就是为你的钱包中保存一条文本信息。

由于我们刚刚设置的地址别名是Sender,所以这里第一行被我修改为了Sender。

module Sender::Message {
    use Std::ASCII;
    use Std::Errors;
    use Std::Event;
    use Std::Signer;

    struct MessageHolder has key {
        message: ASCII::String,
        message_change_events: Event::EventHandle<MessageChangeEvent>,
    }

    struct MessageChangeEvent has drop, store {
        from_message: ASCII::String,
        to_message: ASCII::String,
    }

    /// There is no message present
    const ENO_MESSAGE: u64 = 0;

    public fun get_message(addr: address): ASCII::String acquires MessageHolder {
        assert!(exists<MessageHolder>(addr), Errors::not_published(ENO_MESSAGE));
        *&borrow_global<MessageHolder>(addr).message
    }

    public(script) fun set_message(account: signer, message_bytes: vector<u8>)
    acquires MessageHolder {
        let message = ASCII::string(message_bytes);
        let account_addr = Signer::address_of(&account);
        if (!exists<MessageHolder>(account_addr)) {
            move_to(&account, MessageHolder {
                message,
                message_change_events: Event::new_event_handle<MessageChangeEvent>(&account),
            })
        } else {
            let old_message_holder = borrow_global_mut<MessageHolder>(account_addr);
            let from_message = *&old_message_holder.message;
            Event::emit_event(&mut old_message_holder.message_change_events, MessageChangeEvent {
                from_message,
                to_message: copy message,
            });
            old_message_holder.message = message;
        }
    }

    #[test(account = @0x1)]
    public(script) fun sender_can_set_message(account: signer) acquires MessageHolder {
        let addr = Signer::address_of(&account);
        set_message(account,  b"Hello, Blockchain");

        assert!(
          get_message(addr) == ASCII::string(b"Hello, Blockchain"),
          ENO_MESSAGE
        
    }
}

在本地编译移动包,参数--package-dir指定项目目录,如果在项目根目录执行可以省去

aptos move compile

在本地编译并进行执行单元测试,可选参数--package-dir指定项目目录,如果在项目根目录执行可以省去

aptos move test

 发布移动包

aptos move publish

发布完成后,可以去我们发布的多个链浏览器,就可以看到我们的钱包地址,就可以看到已经绑定到我们的钱包地址了

区块浏览器地址:https://explorer.devnet.aptos.dev/

函数运行


aptos move run --function-id <钱包地址>::<模块名>::<函数名> --args <参数类型>:<参数值>

执行set_message参数hello move!

已经可以在结果中参数写入账户中查看了。在区块链器上查看。

0x4、结束

感谢中文小组成员在创作过程中的帮助。@Boyu_Chen#697、@lshoo#1959、@ruyisu#5492

参考链接:

aptos官方开发者文档:https://aptos.dev/guides/getting-started

Aptos CLI官方文档:https://github.com/aptos-labs/aptos-core/tree/main/crates/aptos

pontem官方文档:https://docs.pontem.network/