源代码解读 [EOS 源码分析] 09 - cleos 程序入口 main 函数解析

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

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

img

上一篇文章分析了nodeos插件的执行(exec)流程,至此nodeos插件的生命周期(registered、initialized、started、stopped)介绍完了,这篇文章开始介绍eos项目的另一大程序cleos的相关内容。

cleos程序入口main函数解析

如果把nodeos看作是EOS系统的服务端,那么cleos就是EOS系统的客户端,这个客户端是以命令行工具的形式呈现的。

cleos被使用得最多的命令应该就是cleos get info了:

img

这个命令用于查看EOS区块链的基本信息。

eos/programs/cleos/CMakeLists.txt中定义了cleos程序的入口:

add_executable( ${CLI_CLIENT_EXECUTABLE_NAME} main.cpp httpc.cpp ${CMAKE_CURRENT_BINARY_DIR}/help_text.cpp localize.hpp config.hpp CLI11.hpp)

** **

CLI_CLIENT_EXECUTABLE_NAME定义在eos/CMakeLists.txt中,这里还定义了其他程序名:

img

cleos的程序入口是eos/programs/cleos/main.cpp中的main函数:

img

main函数非常巨大,从开始第2328行代码开始,至第3947行,共计1600多行代码。

main函数首先执行了以下操作:

  • 本地化设置
setlocale(LC_ALL, "");
  • 绑定本地域和路径
bindtextdomain(locale_domain, locale_path);
textdomain(locale_domain);

值定义在eos/programs/cleos/CMakeLists.txt中:

set(LOCALEDIR ${CMAKE_INSTALL_PREFIX}/share/locale)
set(LOCALEDOMAIN ${CLI_CLIENT_EXECUTABLE_NAME})

默认域是cleos,默认路径是${CMAKE_INSTALL_PREFIX}/share/locale,其中CMAKE_INSTALL_PREFIX的值一般是/usr/local,即默认路径是/usr/local/share/locale

  • 设置HTTP上下文,类型为eosio::client::http::http_context:
context = eosio::client::http::create_http_context();

cleos使用网络通信组件httpc和nodeos、keosd进行交互,http_context可以为HTTP请求提供缓存。

  • 设置钱包访问路径
wallet_url = default_wallet_url;

default_wallet_url默认定义如下:

string default_wallet_url = "unix://" + (determine_home_directory() / "eosio-wallet" / (string(key_store_executable_name) + ".sock")).string();

执行以上初始设置后,main函数开始打印终端命令行信息:

img

当在终端输入cleos命令时,就会执行这部分代码:

img

创建了一个CLI::App类型的实例app,CLI::App类定义在eos/programs/cleos/CLI11.hpp中,它实现了一个命令行程序:

img

CLI::App有几个常用成员函数:

  • require_subcommand:检测是否需要子命令,如果需要但没有提供会抛出RequiredError;

  • add_option:添加选项(带参数);

  • add_flag:添加选项(不带参数);

  • add_subcommand:添加子命令。

main函数1600多行代码后续大部分都是add_subcommand、add_option、add_flag这种模式,添加各种cleos命令功能,所有cleos命令的代码实现都可以在main函数中找到

添加完所有子命令后,main函数末尾部分的代码如下:

img

调用parse函数解析终端传入的命令:

app.parse(argc, argv);

CLI::App::parse定义如下:

img

如果捕获到CLI::ParseError就调用exit函数关闭命令行客户端,异常退出返回1,正常退出返回0

更多内容

币圈信息站开发目录

EOS开发系列目录

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