[block-039] EOS源码框架分析

  • Post author:
  • Post category:其他


1. eos的源码root目录,也就是./eos_build.sh所在的目录

2. eos_build.sh是bash编译脚本,判断操作系统,判断编译参数等等。先执行cmake,再执行make。

root目录下的CMakeLists.txt,主要是设置一些参数,包含各子目录,用add_subdirectory命令包含进去。

3. programs目录

3.1 programs/CMakeLists.txt文档,主要是add_subdirectory,包含各子目录,比如nodes目录。

4 nodes目录

4.1 nodes/CMakeLists.txt

4.2 nodes/main.cpp

这里的main函数,比较简单,获取app()提供的实例,然后设置一些参数,启动startup(),运行exec()

nodeos只有一个main.cpp,这个文件里只有少数函数,几个配置log用的

4.3 libraries/appbase/application.cpp

这里,主要是application_impl这个类和application的各函数实现,其中application_impl存储各参数。

app()函数在application.cpp的第73行。

startup()函数,逐一启动plugin,每一个plugin也执行plugin->startup()

exec()函数,运行io_serv->run(),然后等待被终止。

4.4 libraries/appbase/include/appbase/application.hpp

这里声明了两个类和一个函数:类application,类plugin,函数application& app()

4.5 libraries/appbase/include/appbase/plugin.hpp

这里声明abstract_plugin,是类plugin的抽象类/基类

5. nodeos执行流程

5.1 app().set_version()

对应语句 my->_version = version,启动my是application_impl的实例,存储各种参数,比如版本,data、config、logging的路径,以及app启动输入参数。

5.2 app().set_default_data_dir()

对应语句my->_data_dir = data_dir,把data_dir存放到_data_dir

5.3 app().set_default_config_dir()

几乎同上

5.4 app().initialize<chain_plugin, http_plugin, net_plugin, producer_plugin>(argc, argv)

默认情况下,启动这些plugin

该函数在application.hpp文件,可以在模板函数里传输多个不定数量的类型

5.4.1 find_plugin

找到模板里的所有类型,然后实例化。

5.4.2 initialize_impl

被调用一次。

获取所有的参数,逐个处理,比如version,help,设定存储目录,设置plugin,所有plugin初始化

5.5 initialize_logging()

5.5.1 logging_conf_loop()

[sighup_set](const boost::system::error_code& err, int /*num*/) {},这是c++的lambda函数。关于c++的lambda函数,参考这里 https://www.cnblogs.com/langzou/p/5962033.html

在这里,如果收到hup信号,从config_path重读配置文件,然后启动各种服务,也就是iter.second->initialize(app().get_io_service())

5.6 app().startup()

app的startup,也就是遍历执行所有plugin的startup()函数。

5.7 app().exec()

设置中断信号,然后io_serv->run(),也就是说,所有的plugin都启动在运行,那么,只要等io_serv被各种信号中断就行了。

———————————–

关于libraries

1.abi_generator

这块应该是另一波人写的,缩进风格不同了。

这个,读取c++的智能合约源码,然后翻译成abi文件格式。

2.appbase

前面已经说过了,app()的基类。

3. chain

这里的源码非常多

4. chainbase

4.1 chainbase.hpp

比较重要的类是generic_index, database。大部分代码都在这里。

4.2 chainbase.cpp

5. fc

源码多:压缩,容器,加密,异常,io,log,网络,反射,rpc …

6. softfloat

这是一个开源库的c代码,拿过来用的

7. utilities

如名所示

8. wasm-jit

这是一个开源库的源码,拿过来用的。

————————————

1.插件 plugin

nodeos的所有功能都是靠plugin实现的,若干个plugin的组合。以plugin_startup函数启动。

1.1 测试eos性能分别启动两个节点

启动generator节点:nodeos -d ~/eos.data/producer_node –config-dir ~/eos.data/producer_node -l ~/eos.data/logging.json –http-server-address “” -p eosio -e

启动producer节点:nodeos -d ~/eos.data/generator_node –config-dir ~/eos.data/generator_node -l ~/eos.data/logging.json –plugin eosio::txn_test_gen_plugin –plugin eosio::wallet_api_plugin –plugin eosio::chain_api_plugin –p2p-peer-address localhost:9876 –p2p-listen-endpoint localhost:5555

1.2 测试eos的单节点网络

启动单节点网络:nodeos –plugin eosio::wallet_api_plugin –plugin eosio::chain_api_plugin –plugin eosio::account_history_api_plugin -p eosio -e

2. 插件plugin eosio::txn_test_gen_plugin

2.1 插件代码在eos/plugins/txn_test_gen_plugin目录

2.2 txn_test_gen_plugin.cpp

这里,注册插件,宏CALL,定义结构体txn_test_gen_plugin_impl实现一些函数功能,并实现txn_test_gen_plugin的各函数。

主要流程,创建新帐号,在新帐号之间发送transaction。

2.3 txn_test_gen_plugin.hpp

这里,声明txn_test_gen_plugin类

3. 插件plugin eosio::account_history_api_plugin

3.1 account_history_api_plugin.hpp

声明类account_history_api_plugin,有限的几个函数

3.2 account_history_api_plugin.hpp

实现类account_history_api_plugin,多处使用宏定义



版权声明:本文为u011539200原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。