使用 Move 合约
Aptos CLI 主要被用来编译、测试以及对 Move 合约进行形式化验证工作。如果你尚未安装 Aptos CLI,可以按照安装 Aptos CLI提供的步骤进行安装。
您可以通过右侧的目录跳转到特定部分。
要了解如何使用 CLI 在链上链接 Move 合约,可以按照这个“CLI 参数”教程。
在本文档中,有些命令部分需要您修改以适应您的情况。这些变量将用三角括号<像这样>
包裹起来。
1. 编译 Move
您可以通过运行以下命令来编译 Move 包:
aptos move compile --package-dir <your-package-directory>
包目录是包含 Move.toml
文件的文件夹。
根据您的 Move.toml
文件中的配置,您可能需要向该编译命令传递额外参数(information)。
例如,如果您查看hello_blockchain 示例 Move 合约,在Move.toml
文件中它指定了一个名为hello_blockchain
的变量。
[addresses]
hello_blockchain = "_"
因此,要编译这个,您需要使用 --named-addresses
参数传递 hello_blockchain
的值。
aptos move compile --package-dir aptos-move/move-examples/hello_blockchain/ --named-addresses hello_blockchain=superuser
您可以通过运行 aptos move compile --help
了解更多关于编译 Move 合约时的可选参数。
2. Move 合约的单元测试
Aptos CLI 还可以用来编译并在本地运行单元测试:
aptos move test --package-dir <您的包目录>
此命令既编译又运行测试,因此它需要使用与编译时相同的所有可选参数。
您可以通过运行 aptos move test --help
了解更多关于测试 Move 合约的可选参数。
打印调试信息
在编写测试时,打印调试信息或堆栈跟踪可能会很有帮助。您可以通过使用 debug::print
和 debug::print_stack_trace
函数在合约中标记打印调试内容,然后在命令行使用 aptos move test
打印调试信息。在DebugDemo.move可以查看如何使用示例。
如果要查看测试DebugDemo.move包的输出,请按照以下方式操作:
- 克隆
[aptos-core](https://github.com/aptos-labs/aptos-core)
。 - 通过运行
cd crates/aptos/debug-move-example
进入到 debug-move-example。 - 然后运行
aptos move test
。
您应该能够看到:
Running Move unit tests
[debug] 0000000000000000000000000000000000000000000000000000000000000001
Call Stack:
[0] 0000000000000000000000000000000000000000000000000000000000000001::Message::sender_can_set_message
Code:
[4] CallGeneric(0)
[5] MoveLoc(0)
[6] LdConst(0)
> [7] Call(1)
[8] Ret
Locals:
[0] -
[1] 0000000000000000000000000000000000000000000000000000000000000001
Operand Stack:
有关如何使用 Move 编写单元测试的更多信息,请按照这个 Move 教程(第 2 步重点介绍了单元测试)。
3. 生成测试覆盖率报告
Aptos CLI 可用于分析和改进您的 Move 模块的测试。要使用此功能:
要从您的 Move 包目录运行测试覆盖率,请运行以下命令:
aptos move test --coverage
如果您希望将覆盖范围缩小到指定的包,可以使用 --filter
选项。要进一步缩小到指定的 Move 模块,请使用 --module
参数。
有关更详细 / 高级的覆盖信息(例如编译字节码中的测试覆盖率),您可以运行 aptos move coverage
。使用该命令时,CLI 将提示您提供更多关于您希望获得更详细覆盖信息的具体内容。
您可以通过运行 aptos move test --help
和 aptos move coverage --help
了解更多关于测试覆盖率的可选参数。
4. 发布 Move 合约
要发布 Move 合约,您需要运行:
aptos move publish --package-dir <您的包目录>
请注意,在主网络发布时,您通过可选参数传入的账户信息(如 --named-addresses
)必须是主网络上的实际账户,不能使用测试环境下的账户。
包将发布到 CLI 中的默认配置文件。您可以使用命令中的 --profile
覆盖它以指定要发布到哪个账户。要为特定账户生成新的配置文件,请使用 aptos init --profile <name_of_profile>
并按照提示操作。
另外,请注意,在发布 Move 模块的过程中,若一个软件包中有多个模块,则这些模块都必需使用同一个账户进行发布。不然,如果使用不同账户,则该软件包的发布操作将在交易处理的阶段遭遇失败。
您可以使用 Gas Profiler估算与发布 Move 合约相关的 Gas 费用。
默认情况下,Move 合约会发布其源代码。要避免发布源代码,请使用 --included-artifacts none
参数发布。
由于 Aptos 区块链的设计本质上是开源的,请注意,即使没有源代码访问权限,也可以从发布的 Move 字节码重新生成 Move 源代码。
5. 运行已发布合约
现在您已经发布了 Move 包,您可以直接从 CLI 运行它。
您首先需要通过组合来构建您的function-id
:
<the-address-you-published-to>::<module_name>::<function_name>
然后,您可以使用 --args
参数传递参数。
例如,如果您已经发布了 hello_blockchain 示例包到一个地址为 b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb
的账户,您可以通过以下命令运行它的 set_message
函数:
aptos move run --function-id 0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb::message::set_message --args string:hello!
结果应该是:
{
"Result": {
"changes": [
{
"address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
"data": {
"authentication_key": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
"self_address": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
"sequence_number": "3"
},
"event": "write_resource",
"resource": "0x1::account::Account"
},
{
"address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
"data": {
"coin": {
"value": "9777"
},
"deposit_events": {
"counter": "1",
"guid": {
"id": {
"addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
"creation_num": "1"
}
}
},
"withdraw_events": {
"counter": "1",
"guid": {
"id": {
"addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
"creation_num": "2"
}
}
}
},
"event": "write_resource",
"resource": "0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin>"
},
{
"address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
"data": {
"counter": "4"
},
"event": "write_resource",
"resource": "0x1::guid::Generator"
},
{
"address": "b9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
"data": {
"message": "hello!",
"message_change_events": {
"counter": "0",
"guid": {
"id": {
"addr": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb",
"creation_num": "3"
}
}
}
},
"event": "write_resource",
"resource": "0xb9bd2cfa58ca29bce1d7add25fce5c62220604cd0236fe3f90d9de91ed9fb8cb::Message::MessageHolder"
}
],
"gas_used": 41,
"success": true,
"version": 3488,
"vm_status": "Executed successfully"
}
}
6. (可选)形式化验证 Move 脚本
对于您希望在单元测试之外保证代码按预期工作的情况,您可以使用 Move Prover来形式化验证您的 Move 合约代码。
您可以通过按照这些步骤来安装 Move Prover。
安装 Move Prover 之后,你就可以执行下面的命令通过 Aptos CLI 来使用它了:
aptos move prove --package-dir <your-package-directory>
想要学习如何对你的代码进行形式化验证,请参考深入学习 Move 教程中的内容(特别是第 7 步和第 8 步,其中介绍了如何运用 Move Prover 工具并在示例代码中撰写正式规范)。