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

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(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,多处使用宏定义
  

    







你可能感兴趣的:(区块链)