尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

如何用 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。本文只使用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),仅供参考
返回列表