5行代码帮你梳理EOS.IO的脉络
EOS號稱Blockchain上的操作系統(tǒng),且白皮書和開發(fā)日志都描述的非常美好,同時也有無數(shù)人看好這個項(xiàng)目,但對于一個開源項(xiàng)目來說,再好的愿景,還是需要實(shí)際產(chǎn)品的支撐,永遠(yuǎn)都要記住
Talk is cheap, show me the code...
這篇文章的目的是幫助梳理EOS.IO的核心——?eosiod的代碼脈絡(luò),為后續(xù)深入研究源碼打下基礎(chǔ)。
本文假設(shè)你已經(jīng)下載了EOS.IO的代碼及你有一定的?C++語言基礎(chǔ),代碼的路徑在
https://github.com/EOSIO/eos/
EOS.IO項(xiàng)目包括好幾個程序,它們的入口?main()函數(shù)都在programs目錄下,如下所示,我列出了重要的幾個程序,其中我們最關(guān)心的是?eosiod,其次可能是eosio-walletd和?eosioc了,本文中涉及的代碼基于EOS DAWN3.0 alpha。
下面來一探eosiod的究竟,打開?programs/eosiod/main.cpp文件,我們可以看到main非常簡單,核心代碼就5行,為了方便表述,我把異常處理、版本設(shè)置和日志輸出等非核心部分都省略了
這四行代碼分別起到什么作用呢?
其中最關(guān)鍵的應(yīng)該是第①行,它完成了3個插件的初始化工作(EOS項(xiàng)目里運(yùn)用了大量的泛型模板編程,也靈活運(yùn)用了?C++1x的變長模板參數(shù)的特性,對于想學(xué)習(xí)最新C++特性的同學(xué),這是一個很好的案例),從這一行可以看出,?eosiod程序是一個插件化的框架,其中的所有功能,都是由插件實(shí)現(xiàn)的,你想要eosiod具備什么能力,組合不同的插件就好了。?eos項(xiàng)目下的plugins目錄含有?Dawn3.0的所有插件的實(shí)現(xiàn),如下:
而在當(dāng)前代碼中,只加載了chain_plugin、?http_plugin和net_plugin這三個插件,從命名上,可以猜想它們可能是區(qū)塊鏈插件、http協(xié)議插件(與eosioc交互)以及P2P網(wǎng)絡(luò)插件,知道了這一點(diǎn),我們后續(xù)就可以針對性的去研究對應(yīng)的實(shí)現(xiàn)了。
第②行代碼沒有什么可說的,完成了日志的初始化工作。
我們來看第③行,startup函數(shù)的實(shí)現(xiàn)也很簡單
上面這幾行代碼的功能是,對每一個成功初始化的插件,調(diào)用它們的startup()函數(shù),看?startup這個詞就知道,這個函數(shù)的功能是做一些初始參數(shù)的設(shè)定。
最后來看第④行,也很簡單,它的核心實(shí)現(xiàn)就一行代碼io_serv->run()
我們來看下io_serv是什么,在?libraries/appbase/include/appbase/application.hpp中,對io_serv有以下聲明
這是一個boost庫中的?異步IO服務(wù),這個服務(wù)提供一個run()函數(shù),可以讓這個程序一直運(yùn)行下去,對于這點(diǎn),做過服務(wù)器的同學(xué)就應(yīng)該很熟悉了。
等等,不是說5行代碼嗎?怎么感覺4行就已經(jīng)完事兒了?這里要注意的是,還有一行代碼,它不在main()函數(shù)中,它在每個插件的頭文件中,用來在main()執(zhí)行前,把所有的插件都注冊到系統(tǒng)中,以?http_plugin.cpp文件作為例子,就是下面這行代碼
再追到register_plugin中去看看,它在?application.hpp中
看清楚了把,這個注冊函數(shù)完成了2件事
檢查插件是否注冊過,注冊過就直接退出,防止多次注冊
如果沒有注冊過,就分配一個新的插件對象,然后插入到plugins中,?plugins是一個map容器
上面的map容器,和最開始第①步中的插件初始化有一定的關(guān)聯(lián),邏輯是先把所有插件注冊到容器中,然后再初始化第①步中指定的插件,?register_dependencies()就不展開了,它會調(diào)用不同插件的plugin_requires()實(shí)現(xiàn)。
至此,我們通過5行代碼,我們了解到eosiod服務(wù)運(yùn)行的大致脈絡(luò),且學(xué)習(xí)到它是一個插件化服務(wù)器,同時可以推斷所有的?eosiod的行為來自于網(wǎng)絡(luò)輸入,即http_plugin和?net_plugin兩個模塊,知道這些后,后續(xù)我們就可以針對性的去閱讀每一個核心模塊了。
原文地址:?https://juejin.im/entry/5a7be1adf265da4e9e304e80總結(jié)
以上是生活随笔為你收集整理的5行代码帮你梳理EOS.IO的脉络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区块链核心技术:委任权益证明算法DPoS
- 下一篇: 深入解读EOS源代码之——区块链内核