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