在 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 复杂的编码细节。