# 构建我的aptos move 开发环境 **Published by:** [moonly](https://paragraph.com/@moonly/) **Published on:** 2022-07-17 **URL:** https://paragraph.com/@moonly/aptos-move ## Content 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 { public fun sum(a: u64, b: u64): u64 { a + b } } 由于目前这个编辑器不支持中文注释,下面带注解版本方便新手理解。 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 { use 0x01::Math; use 0x1::Debug; fun test_script(a: u64, b: u64) { let c = Math::sum(a,b); Debug::print(&c); } } 简单的注解 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/ ## Publication Information - [moonly](https://paragraph.com/@moonly/): Publication homepage - [All Posts](https://paragraph.com/@moonly/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@moonly): Subscribe to updates