如何用 fuels-abi-cli 编码 Sway 函数调用参数并解码调用结果
【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs
在 Sway 合约开发与调试中,经常需要不写 Rust 代码,直接检查一组函数参数按 Fuel ABI 规范编码后的 hex 是什么、调用结果 hex 能解码回什么类型值。fuels-abi-cli就是 fuels-rs 文档中提供这个能力的命令行工具:它用于 encode Sway function calls and decode their output,所采用的 ABI 格式见文档页给出的 Fuel 官方 ABI 规范链接(fuels-abi-cli 文档)。本文完全基于该文档,给出“编码参数 → 编码完整函数调用 → 解码调用结果”的可执行路径。
工具与子命令
文档给出的 help 输出(版本信息为文档示例):
sway-abi-cli 0.1.0 FuelVM ABI coder USAGE: sway-abi-cli <SUBCOMMAND> FLAGS: -h, --help Prints help information -V, --version Prints version information SUBCOMMANDS: codegen Output Rust types file decode Decode ABI call result encode Encode ABI call help Prints this message or the help of the given subcommand(s)共 4 个子命令:encode(编码 ABI 调用)、decode(解码 ABI 调用结果)、codegen(输出 Rust 类型文件)、help。本文只使用encode和decode。
运行文档命令的环境说明
文档中所有示例命令都写作cargo run -- <subcommand>形式,即在包含fuels-abi-cli的工作区中执行。需要注意:当前 fuels-rs 根目录 Cargo.toml 的members列表里没有fuels-abi-cli包,所以从本仓库根目录直接执行文档命令并不适用,你需要先处于包含该 CLI 的 crate/工作区环境中。下文命令均照录自文档,执行环境与文档示例保持一致。
只编码参数(无需 ABI 文件)
如果只想查看若干值的原始编码,用encode params。每个参数传一个-v,后面依次跟类型和值:
$ cargo run -- encode params -v bool true 0000000000000001$ cargo run -- encode params -v bool true -v u32 42 -v u32 100 0000000000000001000000000000002a0000000000000064上面两行的 hex 均为文档示例输出。参数格式为-v <type_1> <value_1> -v <type_2> <value_2> … -v <type_n> <value_n>,类型与值成对出现,有几个参数就传几对。
基于 JSON ABI 文件编码完整函数调用
如果你有完整的 JSON ABI 文件,可以直接编码对某个函数调用的整个输入。
第一步,准备 ABI 文件。文档示例simple.json的内容如下(文档小标题写作example/simple.json,而命令实际使用examples/simple.json路径,以命令中的路径为准放置文件):
[ { "type":"function", "inputs":[ { "name":"arg", "type":"u32" } ], "name":"takes_u32_returns_bool", "outputs":[ { "name":"", "type":"bool" } ] } ]第二步,执行编码命令。参数依次为:ABI 文件路径、函数名、用-p传入的参数值:
$ cargo run -- encode function examples/simple.json takes_u32_returns_bool -p 4 000000006355e6ee0000000000000004输出 hex 为文档示例。注意它的结构:输出的第一个词(8 字节)保留给函数选择器(function selector),取值为最后 4 字节,即函数签名的 256 哈希。
复合类型的参数值用字面量传给-p,文档给出两种写法:
- 数组:
array.json中函数takes_array输入类型为u16[3],文档示例传入[1,2]:
$ cargo run -- encode function examples/array.json takes_array -p '[1,2]' 00000000f0b8786400000000000000010000000000000002- 嵌套结构体:
nested_struct.json中函数takes_nested_struct输入为MyNestedStruct(含x: u16和嵌套结构体y{a: bool, b: u8[2]}),文档示例传入(10, (true, [1,2])):
$ cargo run -- encode function examples/nested_struct.json takes_nested_struct -p '(10, (true, [1,2]))' 00000000e8a04d9c000000000000000a000000000000000100000000000000010000000000000002数组用[...]字面量、结构体/元组用嵌套(...)字面量,照文档所示写法传入即可。
解码
只解码参数
与encode params对称,decode params用-t按顺序声明每个字段的类型,末尾跟 hex 字符串:
$ cargo run -- decode params -t bool -t u32 -t u32 0000000000000001000000000000002a0000000000000064 Bool(true) U32(42) U32(100)注意这里的 hex 输入正是前面encode params -v bool true -v u32 42 -v u32 100的编码结果:文档在编码与解码两处给出了同一串 hex,编码输出可直接作为解码输入,解码回Bool(true)、U32(42)、U32(100)(文档示例输出)。这是验证编码正确性的最直接方式——做往返对拍。
解码函数调用结果
指定 ABI 文件与函数名,再传入调用结果的 hex:
$ cargo run -- decode function examples/simple.json takes_u32_returns_bool 0000000000000001 Bool(true)解码结果的类型由 ABI 文件中的outputs定义决定(simple.json中为bool),文档示例输出为Bool(true)。
结果验证
encode params:可与文档示例输出对照,如单个bool true编码为0000000000000001。encode function:确认输出前 8 字节是函数选择器(函数签名的 256 哈希取最后 4 字节),其余字节才是参数编码部分。decode params/decode function:输出为带类型的值,如Bool(true)、U32(42);文档展示的往返场景中,把编码输出交回解码可还原出原始参数值。
下一步:在 Rust 代码中做同样的事
如果你是在写 Rust 程序而不是用命令行,SDK 提供对应能力:编码使用ABIEncoder,解码使用ABIDecoder(先解码为Token,再经Tokenizabletrait 转为目标类型),详见 Encoding 与 Decoding。对于abigen!生成的类型,还可以用try_into把字节直接转换为同时实现Parameterize和Tokenizable的类型。
【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考