ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

EOSIO cleos convert 命令详解:交易与 Action 数据的打包(Pack)与解包(Unpack)

EOSIO cleos convert 命令详解:交易与 Action 数据的打包(Pack)与解包(Unpack) 区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载导读cleos convert是 EOSIO 命令行工具cleos提供的交易与 Action 数据序列化转换子命令组用于在明文带签名的 JSON 交易与打包后的二进制形式packed form之间互相转换也可以在 JSON 形式的 Action 参数与 ABI 序列化后的十六进制字节串之间互相转换。在实际开发中它常用于离线构造交易、调试签名数据、解析链上抓取的打包交易、以及在不依赖链上环境的情况下验证 ABI 序列化结果。读完本篇你将掌握pack_transaction、unpack_transaction、pack_action_data、unpack_action_data四个子命令的完整用法、参数含义、典型输出与底层实现原理。概述convert 子命令组的作用在 EOSIO 区块链中交易在网络上传输、在区块中存储时都采用紧凑的二进制打包格式packed transaction而不是直接使用可读的 JSON。开发者日常构造交易时使用的cleos push transaction等命令本质上也是先完成同样的打包过程再交给节点处理。convert子命令组将这些底层序列化能力暴露给用户便于离线进行格式转换与结果核验。从源码看该子命令组定义在 programs/cleos/main.cpp 中auto convert app.add_subcommand(convert, localized(Pack and unpack transactions)); convert-require_subcommand();它本身要求必须再指定一个子命令共包含四个子命令官方文档docs/02_cleos/03_command-reference/convert/index.md对其定位为Pack and unpack transactions打包与解包交易子命令转换方向输入输出pack_transaction明文带签名 JSON → 打包形式明文 JSON 交易字符串或文件含packed_trx的打包交易 JSONunpack_transaction打包形式 → 明文带签名 JSON含packed_trx的打包交易 JSON完整明文交易 JSONpack_action_dataJSON Action 参数 → 打包形式账户名、Action 名、JSON 参数ABI 序列化后的十六进制字节串unpack_action_data打包形式 → JSON Action 参数账户名、Action 名、十六进制字节串反序列化后的 JSON 参数值得注意的一点convert命令组在执行时不需要连接keosd钱包。在 programs/cleos/main.cpp 中有明确的判断逻辑// get, version, net, convert do not require keosd if (tx_skip_sign || app-got_subcommand(get) || app-got_subcommand(version) || app-got_subcommand(net) || app-got_subcommand(convert))这意味着convert适合在无钱包、甚至离线环境下使用除--pack-action-data/--unpack-action-data这两个需要nodeos提供 ABI 的选项外详见下文。pack_transaction从明文带签名 JSON 到打包形式参数与选项pack_transaction的官方文档位于 docs/02_cleos/03_command-reference/convert/pack_transaction.md其参数定义如下位置参数PositionalstransactionTEXT必填明文带签名的交易 JSON可以是一段 JSON 字符串也可以是一个 JSON 文件的路径。源码中使用json_from_file_or_string()统一处理这两种输入方式见 programs/cleos/main.cpp。选项Options-h, --help打印帮助信息并退出。--pack-action-data打包交易内所有 Action 的 data 字段需要与nodeos交互即需要链上提供对应合约的 ABI。若交易中 action 的data字段是 JSON 对象而非十六进制字符串就必须加上此选项。命令示例官方文档给出的示例将一个含eosio::newaccountAction 的明文交易打包cleos convert pack_transaction { expiration: 2018-08-02T20:24:36, ref_block_num: 14207, ref_block_prefix: 1438248607, max_net_usage_words: 0, max_cpu_usage_ms: 0, delay_sec: 0, context_free_actions: [], actions: [{ account: eosio, name: newaccount, authorization: [{ actor: eosio, permission: active } ], data: 0000000000ea305500a6823403ea30550100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d8010000000100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d801000000 } ], transaction_extensions: [] }输出为一个含signatures、compression、packed_context_free_data、packed_trx四个字段的打包交易 JSON{ signatures: [], compression: none, packed_context_free_data: , packed_trx: 8468635b7f379feeb95500000000010000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed3232660000000000ea305500a6823403ea30550100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d8010000000100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d80100000000 }示例中的明文交易data字段本身就是十六进制字节串手动 ABI 编码好的 newaccount 参数因此无需--pack-action-data也能完成打包。如果data是 JSON 对象如{creator:eosio, ...}则必须使用--pack-action-data。底层实现源码回调逻辑见 programs/cleos/main.cpp当指定--pack-action-data时先通过abi_serializer::from_variant()将 JSON 变体反序列化为signed_transaction期间会用 ABI 把 action 的 JSON data 编码为二进制再构造packed_transaction_v0输出未指定该选项时直接把 JSON 变体转为signed_transaction再包装为packed_transaction_v0。若此时交易中的 data 为 JSON 对象而非已编码字节串会抛出transaction_type_exception错误信息为Fail to convert transaction, --pack-action-data likely needed——这正是在提示你需要使用--pack-action-data选项。打包统一采用packed_transaction_v0::compression_type::none不压缩进行封装输出格式为带缩进的 JSON。unpack_transaction从打包形式还原明文带签名 JSON参数与选项unpack_transaction的官方文档位于 docs/02_cleos/03_command-reference/convert/unpack_transaction.md是pack_transaction的逆向操作。位置参数transactionTEXT必填打包交易 JSON字符串或文件路径必须包含packed_trx字段可选包含compression、signatures、packed_context_free_data等字段。选项-h, --help打印帮助信息并退出。--unpack-action-data解包交易内所有 Action 的 data 字段将二进制 data 反序列化为可读 JSON需要与nodeos交互。命令示例以下示例把一个带签名、带打包体的交易 JSON 解包为明文形式cleos convert unpack_transaction { signatures: [ SIG_K1_KmRbWahefwxs6uyCGNR6wNRjw7cntEeFQhNCbyg8S92Kbp7zdSSVGTD2QS7pNVWgcU126zpxaBp9CwUxFpRwSnfkjd46bS ], compression: none, packed_context_free_data: , packed_trx: 8468635b7f379feeb95500000000010000000000ea305500409e9a2264b89a010000000000ea305500000000a8ed3232660000000000ea305500a6823403ea30550100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d8010000000100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d80100000000 }输出为完整的明文交易 JSON。可以看到解包后的交易同时保留了输入中的signatures并补出了context_free_data字段注意它是明文交易反序列化后的标准字段值为空数组{ expiration: 2018-08-02T20:24:36, ref_block_num: 14207, ref_block_prefix: 1438248607, max_net_usage_words: 0, max_cpu_usage_ms: 0, delay_sec: 0, context_free_actions: [], actions: [{ account: eosio, name: newaccount, authorization: [{ actor: eosio, permission: active } ], data: 0000000000ea305500a6823403ea30550100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d8010000000100000001000240cc0bf90a5656c8bb81f0eb86f49f89613c5cd988c018715d4646c6bd0ad3d801000000 } ], transaction_extensions: [], signatures: [ SIG_K1_KmRbWahefwxs6uyCGNR6wNRjw7cntEeFQhNCbyg8S92Kbp7zdSSVGTD2QS7pNVWgcU126zpxaBp9CwUxFpRwSnfkjd46bS ], context_free_data: [] }底层实现源码回调逻辑见 programs/cleos/main.cpp先用json_from_file_or_string()读取 JSON通过fc::from_variantpacked_transaction_v0()反序列化为packed_transaction_v0再调用get_signed_transaction()得到明文signed_transaction若指定--unpack-action-data则通过abi_serializer::to_variant()输出此时 action 的 data 会反序列化为可读 JSON 对象否则直接输出signed_transaction变体此时 data 保持十六进制字符串原样。需要注意解包后的data默认仍然是十六进制编码的原始字节串只有显式加上--unpack-action-data才会变成 JSON 对象。这与文档示例中展示的十六进制输出一致。pack_action_data将 JSON Action 参数编码为十六进制字节串参数pack_action_data的官方文档位于 docs/02_cleos/03_command-reference/convert/pack_action_data.md。位置参数三个均必填accountTEXT托管合约的账户名即合约所在的账户。nameTEXT该 Action 调用的合约函数名。unpacked_action_dataTEXT以 JSON 形式表达的 Action 参数。选项-h, --help打印帮助信息并退出。命令示例官方文档示例将unlinkauth的 JSON 参数编码为字节串cleos convert pack_action_data eosio unlinkauth {account:test1, code:test2, type:eosioeosio}输出十六进制字节串000000008090b1ca000000000091b1ca000075982aea3055底层实现与 ABI 依赖源码回调见 programs/cleos/main.cpp核心是调用variant_to_bin()packed_action_data_string variant_to_bin(name(unpacked_action_data_account_string), name(unpacked_action_data_name_string), unpacked_action_data_json);而variant_to_bin()的实现位于 programs/cleos/main.cppbytes variant_to_bin( const account_name account, const action_name action, const fc::variant action_args_var ) { auto abis abi_serializer_resolver( account ); FC_ASSERT( abis, No ABI found for ${contract}, (contract, account)); auto action_type abis-get_action_type( action ); FC_ASSERT( !action_type.empty(), Unknown action ${action} in contract ${contract}, (action, action)( contract, account )); return abis-variant_to_binary( action_type, action_args_var, abi_serializer::create_yield_function( abi_serializer_max_time ) ); }从源码可以看出关键依赖该命令需要先获取到account对应合约的 ABI通过abi_serializer_resolver本质上从nodeos拉取链上 ABI然后根据 Action 名在 ABI 中查找对应的 action typestruct再按该结构对 JSON 参数做二进制序列化。如果找不到 ABI 或 Action 类型会分别抛出No ABI found for ${contract}与Unknown action ${action} in contract ${contract}断言错误。因此该命令虽然不需要keosd但仍需要可用的nodeos连接来提供 ABI 数据。unpack_action_data将十六进制字节串反序列化为 JSON 参数参数unpack_action_data的官方文档位于 docs/02_cleos/03_command-reference/convert/unpack_action_data.md是pack_action_data的逆向操作。位置参数三个均必填accountTEXT托管合约的账户名。nameTEXT该 Action 调用的合约函数名。packed_action_dataTEXT以打包十六进制字节串形式表达的 Action 数据。选项-h, --help打印帮助信息并退出。命令示例官方文档示例将pack_action_data的输出原样还原为 JSONcleos convert unpack_action_data eosio unlinkauth 000000008090b1ca000000000091b1ca000075982aea3055输出{ account: test1, code: test2, type: eosioeosio }底层实现源码回调见 programs/cleos/main.cppEOS_ASSERT( packed_action_data_string.size() 2, transaction_type_exception, No packed_action_data found ); vectorchar packed_action_data_blob(packed_action_data_string.size()/2); fc::from_hex(packed_action_data_string, packed_action_data_blob.data(), packed_action_data_blob.size()); fc::variant unpacked_action_data_json bin_to_variant(name(packed_action_data_account_string), name(packed_action_data_name_string), packed_action_data_blob); std::cout fc::json::to_pretty_string(unpacked_action_data_json) std::endl;实现要点先断言输入长度至少为 2即至少 1 个字节否则抛出No packed_action_data found将十六进制字符串转为字节数组fc::from_hex调用bin_to_variant()反序列化。与variant_to_bin()对称bin_to_variant()见 programs/cleos/main.cpp同样需要先解析合约 ABI、定位 action type再通过abis-binary_to_variant()把二进制数据还原为 JSON 变体最终以带缩进格式打印。同样地该命令也依赖nodeos提供对应合约的 ABI。实战场景与使用建议场景一离线构造与核验交易pack_transaction/unpack_transaction可以在不连接钱包的情况下完成交易格式的转换适合以下流程手动构造明文交易 JSON或从签名工具得到带签名的明文交易用pack_transaction打包得到可直接随cleos push transaction的打包体或用于网络传输的紧凑形式从区块/日志中拿到打包交易后用unpack_transaction还原为可读的明文 JSON 进行审计、比对签名或进一步调试。场景二ABI 序列化结果验证pack_action_data/unpack_action_data互为逆运算常用于在构造push action之前先本地验证 JSON 参数能否按 ABI 正确编码观察编码后的十六进制内容是否符合预期从链上原始交易或区块数据中提取某个 action 的二进制 data 后反序列化为 JSON 以便阅读与分析手工核对合约开发者文档中的 ABI 结构与实际编码结果是否一致。注意事项四个子命令的输入均支持JSON 字符串或JSON 文件路径两种形式由json_from_file_or_string()见 programs/cleos/main.cpp自动识别只要输入不是以{或[开头且对应路径是存在的文件就会尝试从文件读取。pack_transaction与unpack_transaction默认不重新编码/解码 action 的 datadata 始终以十六进制原样传递需要把 JSON data 与二进制 data 互相转换时必须显式使用--pack-action-data/--unpack-action-data且此时要求nodeos在线可查询 ABI。pack_action_data/unpack_action_data必须依赖链上 ABI因此需要nodeos连接通过 cleos 的--url选项指定节点地址但无需keosd。打包统一采用compression_type::none即cleos convert本身不做 zlib 压缩实际广播交易时的压缩与否由节点/客户端配置决定。总结cleos convert子命令组将 EOSIO 交易与 Action 数据的序列化能力以命令行形式暴露出来pack_transaction/unpack_transaction处理整个交易在明文 JSON 与打包二进制packed_trx之间的转换pack_action_data/unpack_action_data处理单个 Action 参数在 JSON 与 ABI 编码十六进制字节串之间的转换四个命令均不需要keosd钱包涉及 ABI 序列化/反序列化--pack-action-data、--unpack-action-data及两个 action data 子命令时才需要nodeos提供合约 ABI。其底层实现集中在 programs/cleos/main.cpp 的convert子命令注册代码中核心依赖packed_transaction_v0、abi_serializer::from_variant/to_variant、variant_to_bin/bin_to_variant等序列化设施。对于需要深度调试交易数据、离线构造交易或验证 ABI 编码的开发者convert是不可多得的底层工具箱。赞分享区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载相关推荐EOSIO cleos convert pack_transaction 详解将普通签名交易 JSON 打包为 packed 形式EOSIO cleos convert pack_transaction 详解将普通签名交易 JSON 打包为 packed 形式 本文讲解 EOSIO 节点区块链EOSIO cleos convert pack_action_data 命令详解将 JSON 动作数据打包为十六进制字节串EOSIO cleos convert pack_action_data 命令详解将 JSON 动作数据打包为十六进制字节串 导读 cleos convert区块链cleos convert unpack_transaction 命令详解将打包交易还原为明文签名 JSONcleos convert unpack_transaction 命令详解将打包交易还原为明文签名 JSON cleos convert unpack_tra区块链创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表