Skip to main content

你的第一个 Move 合约

本教程详细介绍了如何在 Aptos 区块链上编译、测试、发布和与 Move 合约交互。 总结的步骤是:

  1. 安装 Aptos CLI 的预编译二进制文件。
  2. 在 Aptos 区块链上创建一个账户并注资。
  3. 编译并测试一个 Move 合约。
  4. 将 Move 合约发布到 Aptos 区块链。
  5. 与 Move 合约交互。

第 1 步:安装 CLI

安装 Aptos CLI 的预编译二进制文件


第 2 步:创建一个帐户并为其注资

安装 CLI 二进制文件后,下一步是在 Aptos 区块链上创建一个账户并为其提供资金。

  1. 首先启动一个新终端并运行以下命令来初始化一个新的本地帐户:
aptos init

输出将类似于下面。

Enter your rest endpoint [Current: None | No input: https://fullnode.devnet.aptoslabs.com/v1]

No rest url given, using https://fullnode.devnet.aptoslabs.com/v1...
Enter your faucet endpoint [Current: None | No input: https://faucet.devnet.aptoslabs.com | 'skip' to not use a faucet]

No faucet url given, using https://faucet.devnet.aptoslabs.com...
Enter your private key as a hex literal (0x...) [Current: None | No input: Generate new key (or keep one if present)]

No key given, generating key...
Account a345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a doesn't exist, creating it and funding it with 10000 coins
Aptos is now set up for account a345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a! Run `aptos help` for more information about commands
{
"Result": "Success"
}

上述输出中的帐户地址:a345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a 是您的新帐户,别名为配置文件 default。 此帐户地址对您来说会有所不同,因为它是随机生成的。 从现在开始,default0xa345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a 可以互换。

  1. 现在通过运行以下命令为该帐户注资:
aptos account fund-with-faucet --account default

您将看到类似于以下的输出:

{
"Result": "Added 10000 coins to account a345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a"
}

第三步:编译并测试合约

aptos-core/aptos-move/move-examples 中提供了几个示例 Move 合约 目录。 打开终端并将目录更改为 hello_blockchain 目录:

cd aptos-core/aptos-move/move-examples/hello_blockchain

运行以下命令编译 hello_blockchain 合约:

aptos move compile --named-addresses hello_blockchain=default

要测试合约运行:

aptos move test --named-addresses hello_blockchain=default

CLI 条目必须包含 --named-addresses,因为 Move.toml 文件将其保留为未定义(见下文)。 为了为上一步中创建的账户准备合约,我们指定命名地址hello_blockchain设置为我们的账户地址,使用default配置文件别名。

[addresses]
hello_blockchain = "_"

第 4 步:发布 Move 合约

代码编译和测试后,我们可以将合约发布到为本教程创建的帐户。 运行以下命令:

aptos move publish --named-addresses hello_blockchain=default

您将看到类似于以下的输出:

package size 1631 bytes
{
"Result": {
"transaction_hash": "0x45d682997beab297a9a39237c588d31da1cd2c950c5ab498e37984e367b0fc25",
"gas_used": 13,
"gas_unit_price": 1,
"pending": null,
"sender": "a345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a",
"sequence_number": 8,
"success": true,
"timestamp_us": 1661320216343795,
"version": 3977,
"vm_status": "Executed successfully"
}
}

此时,该合约现在存储在 Aptos 区块链中的帐户中。


第 5 步:与 Move 合约交互

Move 合约暴露访问点,也称为入口函数。 这些接入点可以通过事务调用。 CLI 允许无缝访问这些接入点。 示例 Move 合约 hello_blockchain 公开了一个 set_message 入口函数,该函数接受一个 string。 这可以通过 CLI 调用:

aptos move run\
--function-id 'default::message::set_message' \
--args 'string:hello,blockchain'

成功后,CLI 将打印出以下内容:

{
"Result": {
"transaction_hash": "0x1fe06f61c49777086497b199f3d4acbee9ea58976d37fdc06d1ea48a511a9e82",
"gas_used": 1,
"gas_unit_price": 1,
"pending": null,
"sender": "a345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a",
"sequence_number": 1,
"success": true,
"timestamp_us": 1661320878825763,
"version": 5936,
"vm_status": "Executed successfully"
}
}

set_message 函数修改 hello_blockchain MessageHolder 资源。 资源是存储在 全局存储 中的数据结构。 可以通过查询以下 REST API 来读取资源:


https://fullnode.devnet.aptoslabs.com/v1/accounts/a345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a/resource/0xa345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a::message::MessageHolder

其中,第一次执行后包含以下内容:

{
"type": "0xa345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a::message::MessageHolder",
"data": {
"message": "hello, blockchain",
"message_change_events": {
"counter": "0",
"guid": {
"id": {
"addr": "0xa345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a",
"creation_num": "3"
}
}
}
}
}

请注意,消息字段包含hello, blockchain

在第一次调用之后对 set_message 的每次成功调用都会导致对 message_change_events 的更新。 可以通过 REST API 访问给定帐户的 message_change_events

http://127.0.0.1:8080/v1/accounts/0xa345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a/events/0xa345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a::message::MessageHolder/message_change_events

其中,在调用将消息设置为hello, blockchain, again之后,事件流将包含以下内容:

[
{
"version": "8556",
"key": "0x0300000000000000a345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a",
"sequence_number": "0",
"type": "0xa345dbfb0c94416589721360f207dcc92ecfe4f06d8ddc1c286f569d59721e5a::message::MessageChangeEvent",
"data": {
"from_message": "hello, blockchain",
"to_message": "hello, blockchain, again"
}
}
]
提示

其他帐户可以通过调用与此示例完全相同的函数来重用已发布的合约。 它留给读者作为练习。