Aptos发布模块
创始人
2024-05-29 13:24:36
0

背景

之前那么文章我们已经了解了如何使用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,
    }
//<:!: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(addr), error::not_found(ENO_MESSAGE));
        *&borrow_global(addr).message
    }

    public entry fun set_message(account: signer, message: string::String)
    acquires MessageHolder {
        let account_addr = signer::address_of(&account);
        if (!exists(account_addr)) {
            move_to(&account, MessageHolder {
                message,
                message_change_events: account::new_event_handle(&account),
            })
        } else {
            let old_message_holder = borrow_global_mut(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模块。

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...