比特幣源碼分析1

比特幣有幾個客戶端,也就是由幾個入口main函數

先從bitcoin.cpp的main函數分析

int main(int argc, char* argv[])

{

#ifdef WIN32

? ? util::WinCmdLineArgs winArgs;

? ? std::tie(argc, argv) = winArgs.get();

#endif

? ? SetupEnvironment();

? ? // Connect bitcoind signal handlers

? ? noui_connect();

? ? return (AppInit(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE);

}

非常簡短的入口函數:

首先是?SetupEnvironment();

這個函數的作用是設置一下內存申請和釋放方式

mallopt(M_ARENA_MAX, 1)是malloc的底層函數。

第一個參數控制內存的行為。比如說你申請一個大于1M空間的數據,malloc會調用操作系統提供的接口申請更大的空間。delete的時候并沒有還給操作系統。詳細信息查相關文檔

第二個函數是 noui_connect();

點進去一看是這樣的

void noui_connect()

{

? ? uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBox);

? ? uiInterface.ThreadSafeQuestion_connect(noui_ThreadSafeQuestion);

? ? uiInterface.InitMessage_connect(noui_InitMessage);

}

這三個boost庫中的信號槽機制。先說功能。

用于輸出日志的程序運行等錯誤信息。

當將來調用uiInterface.ThreadSafeQuestion_connect()

的時候這些信號都會觸發。

回到入口函數static bool AppInit(int argc, char* argv[])

? ? ? ? InitInterfaces interfaces;

? ? interfaces.chain = interfaces::MakeChain();

首先初始化一個Initinterfaces里面的chain

struct InitInterfaces

{

? ? std::unique_ptr<interfaces::Chain> chain;

? ? std::vector<std::unique_ptr<interfaces::ChainClient>> chain_clients;

};

這個chain里面有一個lock接口類里還有一個Notifications類。里面有很多很重要的接口。比如說根據hash查找區塊等。

然后mainchain()調用makeunique

std::unique_ptr<T> MakeUnique(Args&&... args)

{

? ? return std::unique_ptr<T>(new T(std::forward<Args>(args)...));

}

ChainClient就是繼承chain的子類。返回一個ChainClient的智能指針

總結:就是利用傳入的命令行參數作為chainclient的構造函數參數初始化chainclient

接下來到另外一個函數了

SetupServerArgs();

這個函數內容相當大。總的來說就是設置一系列環境。加載配置文件等等。加載之后才進入主函數

bool AppInitMain(InitInterfaces& interfaces)

當然不能調過配置加載啦

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 其實對于我來說,我是特別認可區塊鏈的發展的,之前也玩過ETH,EOS,但是我還是覺得需要從根源去了解區塊鏈,...
    freelands閱讀 1,208評論 2 3
  • 上一篇文章我們大致分析了一下比特幣源碼src文件夾的目錄結構以及數據目錄結構,接下來我們將進入源碼的分析。本篇涉及...
    自如致知閱讀 1,549評論 2 1
  • C++裸指針的內存問題有:1、空懸指針/野指針2、重復釋放3、內存泄漏4、不配對的申請與釋放 使用智能指針可以有效...
    WalkeR_ZG閱讀 3,123評論 0 5
  • 簡述 如何啟動線程因啟動性程需要一個callable type,可以有函數指針,類重載(),lambda三種形式。...
    傳說中的水牛閱讀 512評論 0 0
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,718評論 0 3