正如《EOS源碼學(xué)習(xí)系列》提到EOS項(xiàng)目大體上是按program
/plugin
/libraries
/contracts
四大塊來組織代碼烘苹,本篇先從最頂層的應(yīng)用程序作為入口來了解EOS的框架僵芹。
節(jié)點(diǎn)程序:eosd
eosd
是運(yùn)行在節(jié)點(diǎn)上的deamon服務(wù)程序,主要用途有:
- 生產(chǎn)區(qū)塊:打包瘦癌、驗(yàn)證交易生成區(qū)塊。
- 提供REST API:提供API查詢區(qū)塊賬戶等信息,提供錢包功能前硫,如管理key、交易簽名等涡扼。EOS提供了
eosc
命令行工具來調(diào)用api稼跳。 - 本地開發(fā)。
最簡(jiǎn)單的啟動(dòng)方式就是不帶參數(shù)啟動(dòng)
$ ./eosd
如果是本地開發(fā)環(huán)境可以添加--skip-transaction-signatures
來跳過key簽名吃沪。
$ ./eosd --skip-transaction-signatures
eosd源碼
eosd的源代碼路徑是programs/eosd/main.cpp
汤善。
include區(qū)
從include區(qū)可以看到,eosd程序大量采用了各種plugin插件票彪。
/* app應(yīng)用框架红淡,用來注冊(cè)框架和執(zhí)行初始化、啟動(dòng)等動(dòng)作 */
#include <appbase/application.hpp>
/* 引入全部插件 */
#include <eos/producer_plugin/producer_plugin.hpp>
#include <eos/chain_plugin/chain_plugin.hpp>
#include <eos/http_plugin/http_plugin.hpp>
#include <eos/chain_api_plugin/chain_api_plugin.hpp>
#include <eos/db_plugin/db_plugin.hpp>
#include <eos/net_plugin/net_plugin.hpp>
#include <eos/account_history_plugin/account_history_plugin.hpp>
#include <eos/account_history_api_plugin/account_history_api_plugin.hpp>
#include <eos/wallet_api_plugin/wallet_api_plugin.hpp>
#include <eos/net_api_plugin/net_api_plugin.hpp>
#include <eosio/txn_test_gen_plugin/txn_test_gen_plugin.hpp>
#include <eosio/faucet_testnet_plugin/faucet_testnet_plugin.hpp>
/* 通用函數(shù) */
#include <fc/log/logger_config.hpp>
#include <fc/log/appender.hpp>
#include <fc/exception/exception.hpp>
/* boost */
#include <boost/exception/diagnostic_information.hpp>
#include "config.hpp"
主程序流程
eosd
的main函數(shù)看起來比較簡(jiǎn)單:
- 通過
app()
函數(shù)獲得一個(gè)application單例降铸; - 單例注冊(cè)各種plugin
app().register_plugin<plugin_name>()
在旱; - 單例初始化,并且初始化的時(shí)候指定了三個(gè)必要的plugin推掸,分別是
chain_plugin
,http_plugin
,net_plugin
颈渊,分別對(duì)應(yīng)區(qū)塊鏈服務(wù)、REST API服務(wù)和與外部其他節(jié)點(diǎn)通信的網(wǎng)絡(luò)服務(wù)终佛。 - 單例啟動(dòng)俊嗽,觸發(fā)使能的plugin啟動(dòng),
app().start()
- 單例主線程while循環(huán)铃彰,等待退出信號(hào)绍豁,
app().exec()
代碼如下:
int main(int argc, char** argv)
{
try {
app().set_version(eosio::eosd::config::version);
app().register_plugin<net_api_plugin>();
app().register_plugin<chain_api_plugin>();
app().register_plugin<wallet_api_plugin>();
app().register_plugin<producer_plugin>();
app().register_plugin<account_history_api_plugin>();
app().register_plugin<db_plugin>();
app().register_plugin<txn_test_gen_plugin>();
app().register_plugin<faucet_testnet_plugin>();
if(!app().initialize<chain_plugin, http_plugin, net_plugin>(argc, argv))
return -1;
initialize_logging();
ilog("eosd version ${ver}", ("ver", eosio::eosd::config::itoh(static_cast<uint32_t>(app().version()))));
app().startup();
app().exec();
} catch (const fc::exception& e) {
elog("${e}", ("e",e.to_detail_string()));
} catch (const boost::exception& e) {
elog("${e}", ("e",boost::diagnostic_information(e)));
} catch (const std::exception& e) {
elog("${e}", ("e",e.what()));
} catch (...) {
elog("unknown exception");
}
return 0;
}
小結(jié)
eosd
程序由一個(gè)app
框架實(shí)例加載眾多功能插件plugin
實(shí)現(xiàn)其功能,其中必要的三個(gè)插件為chain_plugin
, http_plugin
, net_plugin
牙捉。eosd
程序本身是一個(gè)簡(jiǎn)單跑app實(shí)例的架子竹揍,關(guān)注插件的注冊(cè)加載啟動(dòng),節(jié)點(diǎn)服務(wù)的實(shí)際功能均由插件實(shí)現(xiàn)邪铲,后續(xù)文章再深入分析芬位。
下一篇,將從命令行客戶端工具eosc
的角度带到,了解eosd
實(shí)際提供了什么樣的api昧碉。