news 2026/9/23 13:58:55

EOSIO cleos get info 命令详解:获取区块链节点实时状态

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EOSIO cleos get info 命令详解:获取区块链节点实时状态

EOSIO cleos get info 命令详解:获取区块链节点实时状态

【免费下载链接】eosAn open source smart contract platform项目地址: https://gitcode.com/gh_mirrors/eo/eos

cleos get info是 EOSIO 智能合约平台中最常用的命令之一,用于查询当前连接的 nodeos 节点的实时区块链状态,包括最新区块高度、不可逆区块高度、链 ID、资源限制等核心指标。本文将结合仓库源码深入讲解该命令的完整用法、返回字段语义及其底层实现原理,帮助你准确解读节点运行状态、排查同步问题并为交易签名提供必要的链上参考数据。

命令概览

cleos get info属于cleos get子命令族(用于"从区块链获取各类条目与信息",见 programs/cleos/main.cpp),其功能是获取当前区块链信息。

语法

cleos get info

位置参数:无,该命令不接受任何位置参数。

选项

选项说明
-h,--help打印帮助信息并退出

命令本身没有业务参数,但 cleos 的全局参数对其同样生效,其中最常用的是指定连接节点:

cleos -u http://127.0.0.1:8888 get info

-u/--url用于指定 nodeos 节点运行的 HTTP 地址,默认值为http://127.0.0.1:8888(见 programs/cleos/main.cpp)。

运行示例

在节点正常运行时,执行cleos get info会以美化后的 JSON 格式打印节点状态:

{ "server_version": "7451e092", "head_block_num": 6980, "last_irreversible_block_num": 6963, "head_block_id": "00001b4490e32b84861230871bb1c25fb8ee777153f4f82c5f3e4ca2b9877712", "head_block_time": "2017-12-07T09:18:48", "head_block_producer": "initp", "recent_slots": "1111111111111111111111111111111111111111111111111111111111111111", "participation_rate": "1.00000000000000000" }

说明:以上示例出自 docs/02_cleos/03_command-reference/get/info.md,是文档编写时期的早期版本返回格式。在当前仓库源码对应的版本中,返回字段已大幅扩充(新增chain_id、资源限制与分叉数据库等字段),同时recent_slotsparticipation_rate两个字段已在实现中被注释移除(见 plugins/chain_plugin/include/eosio/chain_plugin/chain_plugin.hpp),实际返回格式请以当前节点版本为准。

返回字段逐一解读

当前版本中cleos get info的完整返回结构由read_only::get_info_results定义(见 plugins/chain_plugin/include/eosio/chain_plugin/chain_plugin.hpp),各字段含义如下:

字段类型含义
server_versionstring节点版本号的十六进制表示
server_version_stringstring(可选)语义化版本字符串,如v2.1.0
server_full_version_stringstring(可选)完整版本字符串,通常附带构建信息
chain_idstring当前链的 ID,是交易签名的必要参数
head_block_numuint32最新(头)区块高度
head_block_idstring最新区块的 ID(由区块号与区块哈希构成)
head_block_timestring最新区块的生产时间
head_block_producerstring最新区块的生产者账户名
last_irreversible_block_numuint32最后不可逆区块的高度(LIB)
last_irreversible_block_idstring最后不可逆区块的 ID
last_irreversible_block_timestring(可选)最后不可逆区块的生产时间
fork_db_head_block_numuint32(可选)分叉数据库中待定头区块高度(可能大于head_block_num
fork_db_head_block_idstring(可选)分叉数据库中待定头区块 ID
virtual_block_cpu_limituint64虚拟 CPU 资源限制(微秒)
virtual_block_net_limituint64虚拟网络带宽限制(字节)
block_cpu_limituint64当前区块 CPU 限制(微秒)
block_net_limituint64当前区块网络带宽限制(字节)

其中,资源限制相关字段(virtual_block_cpu_limit等)来自节点的资源限制管理器(Resource Limits Manager),用于衡量当前区块可用的 CPU 与网络带宽余量,是判断链上资源使用压力、估算交易可用额度的重要参考。

典型判断场景

  • 节点是否在同步:比较head_block_numlast_irreversible_block_num,若两者持续增长但fork_db_head_block_num长期停滞,说明节点可能处于分叉或追块状态;
  • 链身份确认chain_id用于区分主网与各类测试网,错误的chain_id会导致交易签名后无法被目标网络接受;
  • 资源余量block_cpu_limit/block_net_limit接近 0 时,说明链上资源已高度紧张,提交交易可能因资源不足被拒绝。

底层实现:从 cleos 到 nodeos 的完整调用链

cleos get info并非本地读取,而是通过 HTTP 调用 nodeos 的 RPC 接口实现的,其完整链路如下:

  1. 子命令注册:在 programs/cleos/main.cpp 中注册get info子命令,回调函数将get_info()的返回值以美化 JSON 输出:

    get->add_subcommand("info", localized("Get current blockchain information"))->callback([] { std::cout << fc::json::to_pretty_string(get_info()) << std::endl; });
  2. HTTP 请求构造get_info()(programs/cleos/main.cpp)调用call(url, get_info_func),其中get_info_func定义为/v1/chain/get_info(见 programs/cleos/httpc.hpp):

    eosio::chain_apis::read_only::get_info_results get_info() { return call(url, get_info_func).as<eosio::chain_apis::read_only::get_info_results>(); }
  3. 节点端路由:nodeos 的chain_api_plugin将该路径注册为只读接口,CHAIN_RO_CALL(get_info, 200, http_params_types::no_params_required)表明该接口不接收任何请求参数(见 plugins/chain_api_plugin/chain_api_plugin.cpp)。对应地,OpenAPI 描述中/get_info为 POST 接口,描述为"返回包含区块链各种细节的对象"(见 plugins/chain_api_plugin/chain.swagger.yaml)。

  4. 数据组装:最终由chain_plugin的只读接口实现完成(plugins/chain_plugin/chain_plugin.cpp),所有字段直接取自节点的控制器(controller)与资源限制管理器:

    read_only::get_info_results read_only::get_info(const read_only::get_info_params&) const { const auto& rm = db.get_resource_limits_manager(); return { itoh(static_cast<uint32_t>(app().version())), // server_version db.get_chain_id(), db.head_block_num(), db.last_irreversible_block_num(), db.last_irreversible_block_id(), db.head_block_id(), db.head_block_time(), db.head_block_producer(), rm.get_virtual_block_cpu_limit(), rm.get_virtual_block_net_limit(), rm.get_block_cpu_limit(), rm.get_block_net_limit(), // ... app().version_string(), db.fork_db_pending_head_block_num(), db.fork_db_pending_head_block_id(), app().full_version_string(), db.last_irreversible_block_time() }; }

从源码结构可以推断,该接口完全基于节点内存中的链状态数据返回,因此响应速度极快,且不需要额外的数据库查询。

深度应用:cleos 内部如何依赖 get info

get info不只是给用户查看的,它在 cleos 内部也是交易提交链路的关键依赖。在push_transaction流程中(programs/cleos/main.cpp),cleos 会先调用get_info()获取链上信息,用于:

  • 设置交易过期时间trx.expiration = info.head_block_time + tx_expiration,以最新区块时间为基准加上用户指定的过期时间;
  • 设置 TAPoS 参考块:默认取info.last_irreversible_block_id作为交易的参考区块(replay protection),用户可通过--ref-block覆盖;
  • 交易签名:使用info.chain_id对交易进行签名,确保交易只对该链有效。
auto info = get_info(); if (trx.signatures.size() == 0) { trx.expiration = info.head_block_time + tx_expiration; block_id_type ref_block_id = info.last_irreversible_block_id; // ... trx.set_reference_block(ref_block_id); // ... } if (!tx_skip_sign) { // ... sign_transaction(trx, required_keys, info.chain_id); }

此外,get_info()还用于cleos get block --info等场景获取当前高度作为查询上下文(见 programs/cleos/main.cpp、programs/cleos/main.cpp)。

进阶用法

与 jq 配合提取字段

cleos -u http://127.0.0.1:8888 get info | jq '.head_block_num, .last_irreversible_block_num'

脚本化监控同步进度

cleos get info | jq -r '"head=\(.head_block_num) lib=\(.last_irreversible_block_num) producer=\(.head_block_producer)"'

通过 curl 直接调用 RPC

由于cleos get info本质是对/v1/chain/get_info的无参数 POST 请求,也可以直接用 curl 获取等价结果:

curl -X POST http://127.0.0.1:8888/v1/chain/get_info -d '{}'

小结

cleos get info是 EOSIO 节点运维与开发调试的"第一入口":一条命令即可掌握链身份、同步进度、头区块与不可逆区块状态以及资源限制。理解其返回字段的来源(get_info_results结构体)与调用链(cleos →/v1/chain/get_info→ chain_plugin),不仅能更准确地解读输出,还能明白为什么交易提交前 cleos 必须先从该接口获取参考区块与链 ID——这背后正是 EOSIO 交易签名与 TAPoS 机制的基石。

【免费下载链接】eosAn open source smart contract platform项目地址: https://gitcode.com/gh_mirrors/eo/eos

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

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

阿里云企业邮箱登录原理拆解:3个核心步骤搞定高频面试题

阿里云企业邮箱登录原理拆解:3个核心步骤搞定高频面试题 配置环境就卡半天?别急,很多开发者在面对阿里云企业邮箱集成时,最头疼的不是代码逻辑,而是登录态维持、Token刷新机制以及OAuth2.0授权流程的底层细节。在面试中被问到 阿里云企业邮箱登录…

作者头像 李华
网站建设 2026/9/23 13:58:40

口袋妖怪3ds模拟器开发避坑:3个崩溃原因与完整示例

口袋妖怪3ds模拟器开发避坑:3个崩溃原因与完整示例 面试被问原理答不上来,面试官皱眉的那一刻,你心里肯定在打鼓。别慌,这不是你不够聪明,而是没人给你一份 口袋妖怪3ds模拟器 开发的 完整示例 ,让你从底层逻辑看清那些隐蔽的坑。 很多应届生觉得模拟器就是“翻译指令”,其实那是 CPU…

作者头像 李华
网站建设 2026/9/23 13:58:40

5个方案对比:校园流量包监控选型与完整示例

5个方案对比:校园流量包监控选型与完整示例 面试被问原理答不上来,代码只会照抄,这是后端开发最致命的短板。当面试官抛出“如何高并发处理校园流量包状态同步”时,很多人愣在原地,只能背诵八股文,无法结合业务场景给出 完整示例 。…

作者头像 李华
网站建设 2026/9/23 13:58:38

无线吸尘器哪个牌子好实战项目避坑指南

无线吸尘器哪个牌子好实战项目避坑指南 复制来的代码跑不通,报错信息满屏飞,你是不是也卡在调试这一关? 别急,这不仅是代码问题,更是思维错位。 很多新手做 实战项目 时,习惯照抄博客,却忽略了环境差异。 就像你问 无线吸尘器哪个牌子好 ,却没人告诉你电池衰减曲线。…

作者头像 李华
网站建设 2026/9/23 13:58:17

3个技巧搞定即将上市报错,保姆级教程助你面试通关

3个技巧搞定即将上市报错,保姆级教程助你面试通关 面试被问原理答不上来,这种尴尬你肯定遇到过。面试官轻描淡写一句“说说这个即将上市模块的底层逻辑”,你脑子瞬间空白,手心冒汗,只能支支吾吾。别慌,今天这篇保姆级教程,不玩虚的,直接带你从零搭建一个模拟“即将上市”业务的核心模块,边写边讲原理,确保你下次…

作者头像 李华
网站建设 2026/9/23 13:58:16

3个坑让湛泸项目跑不通,这份避坑指南救了我

3个坑让湛泸项目跑不通,这份避坑指南救了我 复制来的代码跑不通,报错信息像天书一样,你是不是也卡在这个死胡同里?别急,今天不聊虚的,直接上干货。我是做了十年运维和后端开发的“老鸟”,见过太多人因为环境配置不对、依赖版本冲突,把好好的项目搞崩了。特别是涉及到像 湛泸…

作者头像 李华