跳转到内容

您的第一个Move模块

Aptos区块链允许开发者使用安全设计的Move语言编写图灵完备的智能合约(称为”模块”)。智能合约不仅能让用户通过区块链发送资金,还能编写任意代码,甚至游戏!这一切都始于使用Aptos CLI创建一个账户,该账户将存储已部署(“发布”)的Move模块。

本教程将通过指导您设置最小的Aptos环境,然后如何在Aptos区块链上编译、测试、发布和与Move模块交互,帮助您理解Move模块。您将学习如何:

  1. 设置环境,安装CLI
  2. 创建开发网账户并为其提供资金
  3. 编译和测试Move模块
  4. 将Move模块发布(或”部署”)到Aptos区块链
  5. 与模块交互
  6. 继续使用Aptos构建(下一步)

对区块链的更改称为”交易”,它们需要一个账户来支付网络费用(“gas费”)。我们需要创建一个拥有一些APT的账户来支付该费用并拥有已发布的合约。为了做到这一点,我们需要使用Aptos CLI。

  1. 安装Aptos CLI

    安装Aptos CLI(如果您还没有安装)。

  2. 打开新终端

    打开新的终端窗口或标签。

  3. 验证安装

    运行aptos --version来验证您已安装。

    Terminal window
    aptos --version

    您应该看到类似aptos 4.6.1的响应。

  4. 创建项目文件夹

    通过运行以下命令为本教程创建新文件夹:

    Terminal window
    mkdir my-first-module
  5. 导航到项目文件夹

    运行cd my-first-module进入您的新文件夹。

  6. 初始化您的账户

    运行aptos init并为每个设置步骤按”回车”,在devnet上创建测试账户。

    您应该看到这样的成功消息:

    Terminal window
    ---
    Aptos CLI is now set up for account 0x9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba as profile default!
    {
    "Result": "Success"
    }

现在让我们创建一个简单的Move模块。

  1. 初始化Move包

    运行以下命令创建一个新的Move包:

    Terminal window
    aptos move init --name hello_blockchain

    这将创建一个基本的Move项目结构:

    my-first-module/
    ├── Move.toml
    └── sources/
  2. 创建模块文件

    sources/目录中创建一个名为hello_blockchain.move的文件:

    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,
    }
    //<:!:resource
    #[event]
    struct MessageChange has drop, store {
    account: address,
    from_message: string::String,
    to_message: string::String,
    }
    /// 没有消息时抛出的错误
    const E_NO_MESSAGE: u64 = 0;
    #[view]
    public fun get_message(addr: address): string::String acquires MessageHolder {
    assert!(exists<MessageHolder>(addr), error::not_found(E_NO_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,
    })
    } else {
    let old_message_holder = borrow_global_mut<MessageHolder>(account_addr);
    let from_message = old_message_holder.message;
    event::emit(MessageChange {
    account: account_addr,
    from_message,
    to_message: copy message,
    });
    old_message_holder.message = message;
    }
    }
    #[test(account = @0x1)]
    public entry fun sender_can_set_message(account: signer) acquires MessageHolder {
    let addr = signer::address_of(&account);
    aptos_framework::account::create_account_for_test(addr);
    set_message(account, string::utf8(b"Hello, Blockchain"));
    assert!(
    get_message(addr) == string::utf8(b"Hello, Blockchain"),
    E_NO_MESSAGE
    );
    }
    }
  1. 编译模块

    Terminal window
    aptos move compile

    如果编译成功,您将看到:

    Terminal window
    Compiling, may take a little while to download git dependencies...
    INCLUDING DEPENDENCY AptosFramework
    INCLUDING DEPENDENCY AptosStdlib
    INCLUDING DEPENDENCY MoveStdlib
    BUILDING hello_blockchain
    {
    "Result": "Success"
    }
  2. 运行测试

    Terminal window
    aptos move test

    您应该看到测试通过:

    Terminal window
    INCLUDING DEPENDENCY AptosFramework
    INCLUDING DEPENDENCY AptosStdlib
    INCLUDING DEPENDENCY MoveStdlib
    BUILDING hello_blockchain
    Running Move unit tests
    [ PASS ] 0x9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba::message::sender_can_set_message
    Test result: OK. Total tests: 1; passed: 1; failed: 0
    {
    "Result": "Success"
    }

现在让我们将模块发布到区块链。

  1. 发布模块

    Terminal window
    aptos move publish

    系统会询问您是否要发布,键入yes并按回车:

    Terminal window
    Compiling, may take a little while to download git dependencies...
    INCLUDING DEPENDENCY AptosFramework
    INCLUDING DEPENDENCY AptosStdlib
    INCLUDING DEPENDENCY MoveStdlib
    BUILDING hello_blockchain
    package size 1755 bytes
    Do you want to publish this package at address 0x9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba [yes/no] >

    发布成功后,您将看到:

    Terminal window
    {
    "Result": "Success"
    }

现在我们的模块已发布,让我们与它交互。

  1. 设置消息

    Terminal window
    aptos move run \
    --function-id 'default::message::set_message' \
    --args 'string:Hello, Aptos!'

    您应该看到交易成功:

    Terminal window
    {
    "Result": "Success"
    }
  2. 查看消息

    Terminal window
    aptos move view \
    --function-id 'default::message::get_message' \
    --args 'address:default'

    您应该看到您的消息:

    Terminal window
    {
    "Result": [
    "Hello, Aptos!"
    ]
    }

让我们分解一下您刚刚创建的Move模块:

module hello_blockchain::message {

这声明了一个名为message的模块,位于hello_blockchain地址。

struct MessageHolder has key {
message: string::String,
}

这定义了一个可以存储在账户中的资源(has key)。

  • set_message: 允许账户设置或更新他们的消息
  • get_message: 允许任何人读取存储在地址上的消息
#[test(account = @0x1)]
public entry fun sender_can_set_message(account: signer) acquires MessageHolder {

这是一个单元测试,验证模块按预期工作。

恭喜!您已经成功:

  1. ✅ 设置了Aptos开发环境
  2. ✅ 创建了您的第一个Move模块
  3. ✅ 编译和测试了模块
  4. ✅ 将模块发布到区块链
  5. ✅ 与已发布的模块交互