背景
之前那么文章我们已经了解了如何使用Aptos提供的TypeScript SDK在Aptos实现转帐。这篇文章将会讲述如何编译测试和发布Move模块,然后与之交互。
创建账户
首先我们需要创建一个aptos账户,然后获取一些代币,我们可以使用以下命令去初始化一个新的本地账户,这个是需要安装aptos命令行工具。
aptos init
这时候提示选择网络,直接回车即可,默认是开发网devnet:
Configuring for profile default
Choose network from [devnet, testnet, mainnet, local, custom | defaults to devnet]
然后会提示输入私钥,直接回车即可
No key given, generating key...
Account 19fee192e4fe141685670019c53784a6cf895df76d96b05738415f5ae618a9cb doesn't exist, creating it and funding it with 100000000 Octas
Account 19fee192e4fe141685670019c53784a6cf895df76d96b05738415f5ae618a9cb funded successfully
这时候我们就生成了一个账户,其地址如下,由于这个账户是随机生成的,所以其与一般账户有所不同,在使用上这个账户地址与default等价。
0x19fee192e4fe141685670019c53784a6cf895df76d96b05738415f5ae618a9cb
然后使用以下命令获取代币
aptos account fund-with-faucet --account default
其结果如下
{
"Result": "Added 500000 Octas to account 19fee192e4fe141685670019c53784a6cf895df76d96b05738415f5ae618a9cb"
}
编译测试Move模块
官网提供的Move模块在aptos-core/aptos-move/move-examples/hello_blockchain目录下,首先进入该目录下
cd aptos-core/aptos-move/move-examples/hello_blockchain
通过以下命令编译hello_blockchain模块
aptos move compile --named-addresses hello_blockchain=default
其结果如下
Compiling, may take a little while to download git dependencies...
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING Examples
{
"Result": [
"0d92c50938eef8bdd4dea8661a78506f3795ca484e9b9d335f59b42079ff82cd::message"
]
}
还可以通过以下命令测试
aptos move test --named-addresses hello_blockchain=default
结果如下
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING Examples
Running Move unit tests
[ PASS ] 0xd92c50938eef8bdd4dea8661a78506f3795ca484e9b9d335f59b42079ff82cd::message_tests::sender_can_set_message
[ PASS ] 0xd92c50938eef8bdd4dea8661a78506f3795ca484e9b9d335f59b42079ff82cd::message::sender_can_set_message
Test result: OK. Total tests: 2; passed: 2; failed: 0
{
"Result": "Success"
}
在上述命令中--named-addresses是必须的,因为在Move.toml中没有定义
[package]
name = "Examples"
version = "0.0.0"
[addresses]
hello_blockchain = "_"
[dependencies]
AptosFramework = { local = "../../framework/aptos-framework" }
发布模块
在编译测试好模块后,可以通过以下命令发布模块
aptos move publish --named-addresses hello_blockchain=default
其结果如下
Compiling, may take a little while to download git dependencies...
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING Examples
package size 1734 bytes
Do you want to submit a transaction for a range of [36500 - 54700] Octas at a gas unit price of 100 Octas? [yes/no] >
yes
{
"Result": {
"transaction_hash": "0x92de1f4947d6e52a64d8a4cf301fbfafa0f80586f1af057b488a1a298014a93d",
"gas_used": 365,
"gas_unit_price": 100,
"sender": "19fee192e4fe141685670019c53784a6cf895df76d96b05738415f5ae618a9cb",
"sequence_number": 1,
"success": true,
"timestamp_us": 1678027127523865,
"version": 1703269,
"vm_status": "Executed successfully"
}
}
这时候这个模块已经在aptos区块链上了。
交互
Move模块是通过暴露的入口函数交互的,在hello_blockchain模块中暴露链一个set_message入口函数
module hello_blockchain::message {
use std::error;
use std::signer;
use std::string;
use aptos_framework::account;
use aptos_framework::event;
//:!:>resource
struct MessageHolder has key {
message: string::String,
message_change_events: event::EventHandle<MessageChangeEvent>,
}
//<:!:resource
struct MessageChangeEvent has drop, store {
from_message: string::String,
to_message: string::String,
}
/// There is no message present
const ENO_MESSAGE: u64 = 0;
public fun get_message(addr: address): string::String acquires MessageHolder {
assert!(exists<MessageHolder>(addr), error::not_found(ENO_MESSAGE));
*&borrow_global<MessageHolder>(addr).message
}
public entry fun set_message(account: signer, message: string::String)
acquires MessageHolder {
let account_addr = signer::address_of(&account);
if (!exists<MessageHolder>(account_addr)) {
move_to(&account, MessageHolder {
message,
message_change_events: account::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;
}
}
```
可以通过命令行工具用以下命令进行调用:
```
aptos move run \
--function-id 'default::message::set_message' \
--args 'string:hello, blockchain'
其结果如下:
{
"Result": {
"transaction_hash": "0x1de44a4870826aaf2e75093550f934f34d591623654984d38356d6e48d57c20f",
"gas_used": 504,
"gas_unit_price": 100,
"sender": "19fee192e4fe141685670019c53784a6cf895df76d96b05738415f5ae618a9cb",
"sequence_number": 2,
"success": true,
"timestamp_us": 1678029220436585,
"version": 1718721,
"vm_status": "Executed successfully"
}
}
set_message函数修改hello_blockchain的MessageHolder资源。
最后
这篇文章主要讲述了如何在aptos上发布Move模块。