Aptos发布模块

背景

之前那么文章我们已经了解了如何使用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模块。

猜你喜欢

转载自blog.csdn.net/QStack/article/details/129353125