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