EOS开源代码学习笔记(一)eosiod程序
在写笔记之前,先看一下eosiod工具的说明,以下内容来自官方wiki:
The core EOS daemon that can be configured with plugins to run a node. Example uses are block production, dedicated API endpoints and local development.
翻译为:eosiod工具是eos公链的核心程序,可以配置插件来运行一个节点。该工具用来生产区块,提供区块API以及本地开发。
一、从eosiod的main函数开始分析代码
main函数主要由一个try--catch块组成,接管三种依赖库产生的异常,分别为fc、boost、std。try块内便是该程序的主体。
主体程序可以分为三部分:选项配置、插件初始化、初始化程序并运行
选项配置代码如下:
主要功能是调用app()函数实例化一个application类对象,然后设置该对象的版本。app()函数定义如下:返回一个application对象。
eosio::eosiod::config::version 命名空间下版本定义如下
以下三行代码,调用来类application方法set_default_data_dir和set_default_config_dir来配置目录
bfs::path root = determine_root_directory();获取程序所在根目录root。
将root / "var/lib/eosio/node_00"目录作为默认data-dir目录。
将root / "etc/eosio/node_00"目录作为默认config-dir配置目录。
二、初始化插件与日志
首先initialize方法是一个模板函数,功能是初始化三个插件(chain_plugin区块链插件、http_plugin插件,net_plugin插件)通过查看此方法的定义:
其内部是调用initialize_impl来实例化模板的,通过find_plugin函数来将三个插件添加到该实例化对象的成员变量plugins中。Application类成员变量plugins的定义与find_plugin函数定义如下:
其中plugins成员变量是一个map容器,也就是一个键值对链表。包括了插件的名称和插件的对象指针。注意find_plugin函数的重载(有参数和无参数)。
使用initialize_impl方法来初始化插件,包括了插件的使用参数与配置文件等(此部分代码没有详细阅读)
eosiod程序通过模板的方式初始化并安装需要的插件。eosiod程序类似于一个框架,各个功能模块作为一个插件的方式来初始化到eosiod程序上执行。
初始化日志,并记录下运行版本信息日志和运行根目录信息。
初始化application对象,并生产区块
app().startup(); app().exec();
Amazing!!!
终于看到中文技术贴了,区块链世界,我们技术人沉下心钻研原理才是王道。
EOS 大法好!
当币价跌下来的时候,大家就都安静了哈哈。不过我也是看代码当学习,水平不够。
EOS大法好!
怎么不叫eosd,eosiod好别扭..
有道理,它2.x之前的版本都叫eosd,不知道为什么现在改成eosiod了
进入 dawn 3.0 后,代码库中所有的 eos 都被改成了 eosio ,主要是区别 eosio 软件和 eos 区块链。 blockone 已经声明多次只作软件,规避法律风险。