Move ABI 使用示例

xiang
发布于 阅读 688

在 move 项目下使用 aptos move compile --named-addresses YourModuleName=YourAddress 可以编译出 abi。

Move 的 abi 编译结果有以下特点:

  • bcs 编码的二进制文件,而非 json 文本形式
  • 目前只有各个 entry 函数的 abi
  • 每个 entry 函数单独一个 abi 文件.
  • abi 内容里包含了编译 abi 时候的用户(合约)地址,导致相同的合约代码使用不同的地址编译结果不一样。

我们以红包项目为例,在此项目下编译合约 aptos move compile --named-addresses RedPacket=0x68fd7b5e581d2a95c5dbba09b9c19879c7a934f4f4cfda1d5008cc793660c8ee,在项目的 build/red-packet/abis/red_packets 下面可以看到多个 abi 文件:

  • close.abi
  • open.abi
  • create.abi
  • batch_close.abi
  • set_admin.abi
  • ...

为了对比不同地址编译出的 abi 内容有何区别,我使用两个地址分别编译合约,得到两份 abi;然后使用一段程序读取 abi 内容,encode 成 hex 格式:
create.abi

  • 010663726561746568fd7b5e581d2a95c5dbba09b9c19879c7a934f4f4cfda1d5008cc793660c8ee0a7265645f7061636b657400000205636f756e74020d746f74616c5f62616c616e636502
  • 0106637265617465b39c45e31d1429218aeb3590e2a046edae9303fbbc3ef6a065384569cfd818810a7265645f7061636b657400000205636f756e74020d746f74616c5f62616c616e636502

open.abi

  • 01046f70656e68fd7b5e581d2a95c5dbba09b9c19879c7a934f4f4cfda1d5008cc793660c8ee0a7265645f7061636b6574000003026964020e6c75636b795f6163636f756e747306040862616c616e6365730602
  • 01046f70656eb39c45e31d1429218aeb3590e2a046edae9303fbbc3ef6a065384569cfd818810a7265645f7061636b6574000003026964020e6c75636b795f6163636f756e747306040862616c616e6365730602

close.abi

  • 0105636c6f736568fd7b5e581d2a95c5dbba09b9c19879c7a934f4f4cfda1d5008cc793660c8ee0a7265645f7061636b657400000102696402
  • 0105636c6f7365b39c45e31d1429218aeb3590e2a046edae9303fbbc3ef6a065384569cfd818810a7265645f7061636b657400000102696402

除了加粗的内容不同外,其他是相同的,那么在项目里使用 abi 模式进行 bcs 编码时,动态拼接合约地址部分就可以了。

目前 coming-chat/go-aptos 已经支持了基于 abi 的 bcs 编码。在 aptos 网络下,bcs 编码的交易比 json 编码更安全,更快捷。基于 abi 进行 bcs 编码时,开发者只需导入 abi,构造 payload 时直接传入对应参数即可,无需关注 bcs 复杂的编码细节。

2条评论
xiaodao
xiaodao
写得挺好
点赞
评论
zoro
请问如果只知道nft的合约地址,怎么获取合约里的mint方法的abi?
点赞
评论