news 2026/9/11 4:51:21

如何用 fuels-abi-cli 编码 Sway 函数调用参数并解码调用结果

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 fuels-abi-cli 编码 Sway 函数调用参数并解码调用结果

如何用 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。本文只使用encodedecode

运行文档命令的环境说明

文档中所有示例命令都写作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把字节直接转换为同时实现ParameterizeTokenizable的类型。

【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 4:50:58

32GB显存跑56GB大模型:异构内存调度原理与实战

1. 显存“超载”不是玄学&#xff1a;32GB显存跑56GB模型背后的内存协同真相你肯定见过这类标题&#xff1a;“32GB显存硬刚56GB大模型&#xff01;”、“显存不够&#xff1f;硬盘来凑&#xff01;”——点进去一看&#xff0c;要么是模糊的“黑科技”描述&#xff0c;要么是直…

作者头像 李华
网站建设 2026/9/11 4:50:54

2核2G云服务器跑LNMP:从资源规划到性能调优全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 4:48:59

霍普金森压杆与PFC数值模拟在动态力学分析中的应用

1. 霍普金森压杆与PFC数值模拟的黄金组合 第一次接触SPBH数值模拟是在2013年某军工材料的动态力学性能测试项目中。当时实验室的霍普金森压杆设备突发故障&#xff0c;而项目节点迫在眉睫。正是那次危机让我意识到&#xff1a;PFC&#xff08;Particle Flow Code&#xff09;数…

作者头像 李华
网站建设 2026/9/11 4:48:43

C# LINQ Zip详解:按索引顺序配对两个集合

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 4:46:55

如何搭建 WSL 开发环境并完成第一次构建与部署?

如何搭建 WSL 开发环境并完成第一次构建与部署&#xff1f; 【免费下载链接】WSL Windows Subsystem for Linux 项目地址: https://gitcode.com/GitHub_Trending/ws/WSL 如果你要在 Windows 上从源码构建 Windows Subsystem for Linux&#xff08;WSL&#xff09;&#…

作者头像 李华
网站建设 2026/9/11 4:46:11

把 3D 场景带出浏览器:CesiumJS 5 种导出方式与参数怎么选

把 3D 场景带出浏览器&#xff1a;CesiumJS 5 种导出方式与参数怎么选 【免费下载链接】cesium An open-source JavaScript library for world-class 3D globes and maps :earth_americas: 项目地址: https://gitcode.com/GitHub_Trending/ce/cesium 评审要一张场景图、…

作者头像 李华