源代码解读 [EOS 源码分析] 10 - cleos get info 在 EOS 源码中是如何实现的?

Admin · 2019年12月21日 · 104 次阅读
本帖已被设为精华帖!

EOS 源码分析系列文章,由技术作者松果撰写。为帮助更多开发者了解,特获授权转载至此。感谢松果兄支持。

img

上一篇文章介绍了cleos程序的入口main函数,cleos子命令所有功能的代码实现都可以在main函数中找到,这篇文章就以cleos get info命令为例,介绍这条命令在源码中是如何实现的。

cleos get info在EOS源码中是如何实现的?

cleos是客户端,要获取链上信息需要先启动nodeos进程,否则会报如下提示:

Failed to connect to nodeos at http://127.0.0.1:8888/; is nodeos running?

在终端输入cleos get info命令,可以获取到EOS区块链的基本信息:

img

该命令的代码实现位于main函数的2483行:

img

get是cleos的子命令,通过CLI11::App::add_subcommand函数添加,返回的get对象也是一个App类型,get再次调用add_subcommand函数添加info命令作为自己的子命令。

cleos get info命令获取的数据是通过get_info函数返回的,再使用fc::json::to_pretty_string转成格式化后的JSON数据以方便查看,最后使用std::cout输出到终端,就是上面图中看到的EOS区块链信息。

get_info函数的定义如下:

img

返回一个eosio::chain_apis::read_only::get_info_results类型的对象。

call函数的定义如下:

img

可以看到,内部调用eosio::client::http::do_http_call向服务端发送HTTP请求。

get_info给call函数传递了两个参数url、get_info_func,分别对应call函数的形参url、path

如果没有使用-u参数指定访问的HTTP RPC地址,url默认值就使用本地的8888端口:

string url = "http://127.0.0.1:8888/"

** **

get_info_func是get info功能的API路径,定义在httpc.hpp(eos/programs/cleos/httpc.hpp)中:

img

httpc是http client的简称,这里还列出了chain_api_plugin提供的其他RPC API,其他API插件的功能也可以在httpc.hpp中找到。

urlpath拼接起来,就是完整访问路径:http://127.0.0.1:8888/v1/chain/get_info,可以在浏览器中访问:

img

和通过命令行获取的数据一样。

再来看nodeos返回的数据类型get_info_results,定义在chain_plugin.hpp(eos/plugins/chain_plugin/include/eosio/chain_plugin/chain_plugin.hpp)中:

img

get_info_results结构体中定义的字段就是在终端使用cleos get info命令获取到的字段。

更多内容

币圈信息站开发目录

EOS开发系列目录

共收到 0 条回复
Admin 将本帖设为了精华贴 12月21日 16:21
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册