系统启动流程第十一步
2018-11-25 本文已影响0人
joepeak
如何接入比特币网络以及原理分析
以下内容为系统启动过程中,每一步骤的详细分析。
第11步,导入区块(src/init.cpp::AppInitMain()
)
-
调用
CheckDiskSpace
函数,检查硬盘空间是否足够。如果没有足够的硬盘空间,则退出。
-
检查最佳区块链顶端指示指针是否为空。
如果顶端打针为空,UI界面进行通知。如果不空,则设置有创世区块,即
fHaveGenesis
设为真。if (chainActive.Tip() == nullptr) { uiInterface.NotifyBlockTip_connect(BlockNotifyGenesisWait); } else { fHaveGenesis = true; }
-
如果指定了
blocknotify
参数,设置界面通知为BlockNotifyCallback
。 -
遍历参数
loadblock
指定要加载的区块文件,放进向量变量vImportFiles
集合中。然后调用threadGroup.create_thread
方法,创建一个线程。线程执行的函数为ThreadImport
,参数为要加载的区块文件。std::vector<fs::path> vImportFiles; for (const std::string& strFile : gArgs.GetArgs("-loadblock")) { vImportFiles.push_back(strFile); } threadGroup.create_thread(boost::bind(&ThreadImport, vImportFiles));
-
获取
cs_GenesisWait
锁,等待创世区块被处理完成。{ WaitableLock lock(cs_GenesisWait); while (!fHaveGenesis && !ShutdownRequested()) { condvar_GenesisWait.wait_for(lock, std::chrono::milliseconds(500)); } uiInterface.NotifyBlockTip_disconnect(BlockNotifyGenesisWait); }
后记
由于本人水平所限,文中错误在所难免,欢迎您踊跃指出错误,在下感激不尽。我的微信联系方式:joepeak。
原创不易,尤其寒冬,欢迎赞助我一杯咖啡。
比特币 微信 支付宝