{"content":{"title":"Aptos合约开发之HelloWorld篇","body":"## 前言\r\n上手任何一门语言时，搭建好环境然后跑一个Hello World程序是一件很有成就感的事。那么这篇教程，就来讲讲Aptos环境搭建以及运行一个Aptos版本的Hello World!\r\n\r\n## 关键词\r\n\r\nApto环境搭建、Aptos-cli、Hello World程序\r\n\r\n## Aptos环境搭建\r\n首先，在开始这篇文章之前，你需要在WSL2上先搭建好[Move开发环境](https:\/\/learnblockchain.cn\/article\/4513)。如果对Move开发环境搭建不了解。你可以参考我之前的文章进行搭建。\r\n\r\n搭建Aptos开发环境，你需要安装Aptos开发脚手架，Aptos-cli。Aptos-cli的定义如下。\r\n\r\n>The aptos tool is a command line interface (CLI) for debugging, development, and node operations. This document describes how to install the aptos CLI tool. See Use Aptos CLI for how to use the CLI.  \r\n官方文档：\r\nhttps:\/\/aptos.dev\/cli-tools\/aptos-cli-tool\/install-aptos-cli\r\n\r\n\r\n安装Aptos-cli有两种方式，第一种使用源码自行编译，这种安装方式耗时很长，大约需要4~5h，这种方式我个人不推荐。我推荐使用官方已经编译好的安装包进行安装，省时省力。\r\n\r\n### 安装Aptos-cli预编译版[](https:\/\/aptos.dev\/cli-tools\/aptos-cli-tool\/install-aptos-cli\/#install-precompiled-binary-easy-mode)\r\n\r\n- Navigate to the [release page](https:\/\/github.com\/aptos-labs\/aptos-core\/releases) for Aptos CLI.  # 下载压缩包文件\r\n- Download the latest release for your platform.\r\n- Place this at a location for you to run it e.g. `~\/bin\/aptos` in Linux. #解压后把aptos复制到这个目录下\r\n- On Linux and Mac, make this executable `chmod +x ~\/bin\/aptos`.  #给文件赋权限\r\n- Now type `~\/bin\/aptos help` to read help instructions.\r\n- If you want you can add `~\/bin` to your path in your appropriate `.bashrc` or `.zshrc` for future use.\r\n\r\n安装完成之后，打开wsl控制台，输入`aptos`查看是否安装完成。\r\n\r\n\r\n![image.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/Cb0C0eBe632033b998006.png)\r\n\r\n![image.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/i2XNge7m632033c1c7146.png)\r\n## Hello World工程\r\n区块链工程项目的创建步骤，通常来讲有以下几个动作。\r\n\r\n2、创建目录，编写合约文件 你可以参考我的目录结构，然后创建相应的文件夹和文件。\r\n\r\n![image.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/uEhLqWgz632033cbd408b.png)\r\n\r\nHelloAptos.move\r\n\r\n```\r\nmodule HelloAptos::Message{\r\n\r\n  use std::string;\r\n  use std::error;\r\n  use std::debug;\r\n  use aptos_std::event;\r\n  use std::signer;\r\n  struct  Message has key{\r\n      msg:string::String,\r\n      message_change_events: event::EventHandle<MessageEvent>,\r\n  }\r\n  struct MessageEvent has drop, store {\r\n      from_message: string::String,\r\n      to_message: string::String,\r\n  }\r\n\r\n  const ENO_MESSAGE: u64 = 0;\r\n\r\n  public entry fun  say_message(account:&signer, message_bytes: vector<u8>) acquires Message {\r\n      let message = string::utf8(message_bytes);\r\n      let account_addr = signer::address_of(account);\r\n      if (!exists<Message>(account_addr)) {\r\n          debug::print(&account_addr);\r\n          move_to(account, Message {\r\n             msg:message,\r\n             message_change_events: event::new_event_handle<MessageEvent>(account),\r\n          });\r\n      } else {\r\n          \/\/ debug::print(message);\r\n          let old_message = borrow_global_mut<Message>(account_addr);\r\n          let from_message = *&old_message.msg;\r\n          event::emit_event(&mut old_message.message_change_events, MessageEvent {\r\n              from_message,\r\n              to_message: copy message,\r\n          });\r\n          old_message.msg = message;\r\n      }\r\n\r\n  }\r\n  public fun get_message(addr: address): string::String acquires Message {\r\n      assert!(exists<Message>(addr), error::not_found(ENO_MESSAGE));\r\n      *&borrow_global<Message>(addr).msg\r\n  }\r\n\r\n  #[test(account = @0x1)]\r\n  public entry fun sender_can_set_message(account: signer) acquires Message {\r\n      let addr = signer::address_of(&account);\r\n      say_message(&account,  b\"Hello, Aptos\");\r\n\r\n      assert!(\r\n        get_message(addr) == string::utf8(b\"Hello, Aptos\"),\r\n        ENO_MESSAGE\r\n      );\r\n  }\r\n}\r\n```\r\nMove.toml\r\n```\r\n[package]\r\nname = \"hello-aptos\"\r\nversion = \"0.0.0\"\r\n[dependencies]\r\nAptosFramework = { git = \"https:\/\/github.com\/aptos-labs\/aptos-core.git\", subdir = \"aptos-move\/framework\/aptos-framework\/\", rev = \"devnet\" }\r\n[addresses]\r\nHelloAptos = \"fbd4140a63e8fe7d6e9e25aff78e11876b1b6c21bc8d34b51cbfff40ca03164b\" \r\n```\r\n>其中fbd4140a63e8fe7d6e9e25aff78e11876b1b6c21bc8d34b51cbfff40ca03164b 需要替换成你的账号信息。\r\n\r\n4、编译合约\r\n```\r\nouhuang@LAPTOP-HM465BTT:~\/learn_aptos\/contract$ sudo aptos  move  compile --package-dir \/home\/ouhuang\/learn_aptos\/contract\/\r\n[sudo] password for ouhuang:\r\n{\r\n  \"Result\": [\r\n    \"FBD4140A63E8FE7D6E9E25AFF78E11876B1B6C21BC8D34B51CBFFF40CA03164B::Message\"\r\n  ]\r\n}\r\nouhuang@LAPTOP-HM465BTT:~\/learn_aptos\/contract$ sudo aptos  move  compile --package-dir .\r\n{\r\n  \"Result\": [\r\n    \"FBD4140A63E8FE7D6E9E25AFF78E11876B1B6C21BC8D34B51CBFFF40CA03164B::Message\"\r\n  ]\r\n}\r\n```\r\n5、部署合约\r\n```\r\nouhuang@LAPTOP-HM465BTT:~\/learn_aptos\/contract$ sudo aptos move publish  --package-dir  .\r\n{\r\n  \"Result\": {\r\n    \"changes\": [\r\n      {\r\n        \"address\": \"fbd4140a63e8fe7d6e9e25aff78e11876b1b6c21bc8d34b51cbfff40ca03164b\",\r\n        \"data\": {\r\n          \"authentication_key\": \"0xfbd4140a63e8fe7d6e9e25aff78e11876b1b6c21bc8d34b51cbfff40ca03164b\",\r\n          \"coin_register_events\": {\r\n            \"counter\": \"1\",\r\n            \"guid\": {\r\n              \"id\": {\r\n                \"addr\": \"0xfbd4140a63e8fe7d6e9e25aff78e11876b1b6c21bc8d34b51cbfff40ca03164b\",\r\n                \"creation_num\": \"0\"\r\n              }\r\n            }\r\n          },\r\n          \"sequence_number\": \"1\"\r\n        },\r\n        \"event\": \"write_resource\",\r\n        \"resource\": \"0x1::account::Account\"\r\n      },\r\n      {\r\n        \"address\": \"fbd4140a63e8fe7d6e9e25aff78e11876b1b6c21bc8d34b51cbfff40ca03164b\",\r\n        \"data\": {\r\n          \"coin\": {\r\n            \"value\": \"9998\"\r\n          },\r\n          \"deposit_events\": {\r\n            \"counter\": \"1\",\r\n            \"guid\": {\r\n              \"id\": {\r\n                \"addr\": \"0xfbd4140a63e8fe7d6e9e25aff78e11876b1b6c21bc8d34b51cbfff40ca03164b\",\r\n                \"creation_num\": \"1\"\r\n              }\r\n            }\r\n          },\r\n          \"withdraw_events\": {\r\n            \"counter\": \"0\",\r\n            \"guid\": {\r\n              \"id\": {\r\n                \"addr\": \"0xfbd4140a63e8fe7d6e9e25aff78e11876b1b6c21bc8d34b51cbfff40ca03164b\",\r\n                \"creation_num\": \"2\"\r\n              }\r\n            }\r\n          }\r\n        },\r\n        \"event\": \"write_resource\",\r\n        \"resource\": \"0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin>\"\r\n      },\r\n      {\r\n        \"address\": \"fbd4140a63e8fe7d6e9e25aff78e11876b1b6c21bc8d34b51cbfff40ca03164b\",\r\n        \"event\": \"write_module\"\r\n      }\r\n    ],\r\n    \"gas_used\": 2,\r\n    \"success\": true,\r\n    \"version\": 452397,\r\n    \"vm_status\": \"Executed successfully\"\r\n  }\r\n}\r\n```\r\n至此，Hello World程序运行成功。我将在下一篇文章里，拆解HelloAptos.move中的合约代码。\r\n\r\n## 参考文档\r\n- [Move examples](https:\/\/aptos.dev\/cli-tools\/aptos-cli-tool\/use-aptos-cli#running-a-move-function)\r\n- [Aptos智能合约零基础入门（一）](https:\/\/mp.weixin.qq.com\/s\/M9PP9Jhs3eIqQO3OY7LRXw)"},"author":{"user":"https:\/\/learnblockchain.cn\/people\/6721","address":null},"history":"Qmabz6pe5jGWHzC4NzevGz1Mg4HQWHXn925JmuV7BxMjhr","timestamp":1663124682,"version":1}