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/