执行事务脚本时,通常需要调用不同的 Move 模块,之前的模块示例所示。可以将新模块添加到调用 CLI 的包中的目录中。您还可以添加对其他包的依赖项,以访问它们定义的模块(就像我们对之前的模块所做的那样)。在运行给定脚本之前,该命令将编译并发布包中的每个模块以及包的每个可传递依赖项。
// sources/Test.move
module 0x2::Test {
use std::signer;
struct Resource has key { i: u64 }
public fun publish(account: &signer) {
move_to(account, Resource { i: 10 })
}
public fun write(account: &signer, i: u64) acquires Resource {
borrow_global_mut<Resource>(signer::address_of(account)).i = i;
}
public fun unpublish(account: &signer) acquires Resource {
let Resource { i: _ } = move_from(signer::address_of(account));
}
}
编译并检查模块,但不会发布模块字节码
$ move build
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING my-move
在沙盒环境发布模块
$ move sandbox publish -v
Found 1 modules
Publishing a new module 00000000000000000000000000000002::Test (wrote 253 bytes)
Wrote 253 bytes of module ID's and code
查询发布的模块
$ ls storage/0x00000000000000000000000000000002/modules
Test.mv
我们还可以使用以下命令检查存储中已编译的字节码:move sandbox view
$ move sandbox view storage/0x00000000000000000000000000000002/modules/Test.mv
// Move bytecode v5
module 2.Test {
struct Resource has key {
i: u64
}
public publish(Arg0: &signer) {
B0:
0: MoveLoc[0](Arg0: &signer)
1: LdU64(10)
2: Pack[0](Resource)
3: MoveTo[0](Resource)
4: Ret
}
public unpublish(Arg0: &signer) {
B0:
0: MoveLoc[0](Arg0: &signer)
1: Call[3](address_of(&signer): address)
2: MoveFrom[0](Resource)
3: Unpack[0](Resource)
4: Pop
5: Ret
}
public write(Arg0: &signer, Arg1: u64) {
B0:
0: MoveLoc[1](Arg1: u64)
1: MoveLoc[0](Arg0: &signer)
2: Call[3](address_of(&signer): address)
3: MutBorrowGlobal[0](Resource)
4: MutBorrowField[0](Resource.i: u64)
5: WriteRef
6: Ret
}
}
还可以在发布到之前通过运行来查看已编译的字节码,或者以交互方式检查字节码及其与 Move 源代码的关系:storage
move
disassemble
--name
<module_name>
move
disassemble
--name
<module_name>
--interactive
$ move disassemble --name Test --interactive # You can quit by pressing "q"
$ move disassemble --name Test
// Move bytecode v5
module 2.Test {
struct Resource has key {
i: u64
}
public publish(account: &signer) {
B0:
0: MoveLoc[0](account: &signer)
1: LdU64(10)
2: Pack[0](Resource)
3: MoveTo[0](Resource)
4: Ret
}
public unpublish(account: &signer) {
B0:
0: MoveLoc[0](account: &signer)
1: Call[3](address_of(&signer): address)
2: MoveFrom[0](Resource)
3: Unpack[0](Resource)
4: Pop
5: Ret
}
public write(account: &signer, i: u64) {
B0:
0: MoveLoc[1](i: u64)
1: MoveLoc[0](account: &signer)
2: Call[3](address_of(&signer): address)
3: MutBorrowGlobal[0](Resource)
4: MutBorrowField[0](Resource.i: u64)
5: WriteRef
6: Ret
}
}
我们通过运行以下脚本来练习我们的新模块
// sources/test_script.move
script {
use 0x2::Test;
fun test_script(account: signer) {
Test::publish(&account)
}
}
此脚本调用我们模块的函数,该函数将在签名者的帐户下发布类型资源。让我们先看看如果不先提交这些更改,此脚本将更改什么。我们可以通过传递标志来做到这一点:--dry-run
$ move sandbox run sources/test_script.move --signers 0xf -v --dry-run
Changed resource(s) under 1 address(es):
Changed 1 resource(s) under address 0000000000000000000000000000000F:
Added type 0x2::Test::Resource: [10, 0, 0, 0, 0, 0, 0, 0] (wrote 40 bytes)
key 0x2::Test::Resource {
i: 10
}
Wrote 40 bytes of resource ID's and data
Discarding changes; re-run without --dry-run if you would like to keep them.
一切看起来都很好,所以我们可以再次运行它,但这次通过删除标志来提交更改:--dry-run
move sandbox run sources/test_script.move --signers 0xf -v
Changed resource(s) under 1 address(es):
Changed 1 resource(s) under address 0000000000000000000000000000000F:
Added type 0x2::Test::Resource: [10, 0, 0, 0, 0, 0, 0, 0] (wrote 40 bytes)
key 0x2::Test::Resource {
i: 10
}
Wrote 40 bytes of resource ID's and data
我们可以使用自更改提交以来检查新发布的资源:-v
move
sandbox
view
$ move sandbox view storage/0x0000000000000000000000000000000F/resources/0x00000000000000000000000000000002::Test::Resource.bcs
key 0x2::Test::Resource {
i: 10
}
$ move sandbox clean
$ move sandbox view storage/0x0000000000000000000000000000000F/resources/0x00000000000000000000000000000002::Test::Resource.bcs
Error: `move view <file>` must point to a valid file under storage
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!