我們接著上篇繼續(xù),現(xiàn)在來看第五步。
第五步:verify wallet database integrity? 確認錢包數(shù)據(jù)庫的完整性
這一步我們介紹一個重要的對象bitdb,bitdb是CDBEnv類型的。這個類定義在db.h中。
可以看到bitdb這個對象在這里定義了,并且聲明為extern,表示此對象是外部訪問類型,可以在其他文件中進行訪問。所以我們可以直接在init.cpp中直接使用,前提是一定要#include "db.h" 把這個文件包含進來。在第五步源碼中我們通過bitdb這個對象調(diào)用了Open和Verify兩個方法。現(xiàn)在我們就看下這兩個方法做了些什么事情。
這個函數(shù)可以看到創(chuàng)建了一個database目錄,這個目錄用于輸出log,還聲明了一個db.lg文件路徑,用于輸出錯誤信息。同時掉用dbenv進行了環(huán)境的信息設(shè)置,dbenv定義在db.h中,它是一個DbEnv對象。它是屬于BerkeleyDB庫中的。Berkeley DB是一個開源的文件數(shù)據(jù)庫,介于關(guān)系數(shù)據(jù)庫與內(nèi)存數(shù)據(jù)庫之間,使用方式與內(nèi)存數(shù)據(jù)庫類似,它提供的是一系列直接訪問數(shù)據(jù)庫的函數(shù),而不是像關(guān)系數(shù)據(jù)庫那樣需要網(wǎng)絡(luò)通訊、SQL解析等步驟。
我們現(xiàn)在對每個設(shè)置簡要說明下:
dbenv.set_lg_dir:設(shè)置log目錄。
dbenv.set_cachesize:設(shè)置共享內(nèi)存緩沖池的尺寸。緩沖區(qū)的尺寸應(yīng)當滿足應(yīng)用程序的正常工作需要的工作集,還需要為特殊情況下預(yù)留一些尺寸。這個頁面有更詳細的介紹(http://blog.okbase.net/linkman/archive/2389.html)。
dbenv.set_lg_bsize:設(shè)置內(nèi)存中日志緩沖區(qū)的大小,以字節(jié)為單位。
dbenv.set_lg_max:在日志中設(shè)置單個文件的最大大小,以字節(jié)為單位。dbenv.set_lk_max_locks:設(shè)置由BerkeleyDB環(huán)境支持的最大鎖定數(shù)。dbenv.set_lk_max_objects:設(shè)置由BerkeleyDB鎖子系統(tǒng)支持的同時鎖定對象的最大數(shù)目。
dbenv.set_errfile:設(shè)置錯誤信息存儲文件路徑。
dbenv.set_flags:設(shè)置數(shù)據(jù)庫環(huán)境的標置值,也可以配置使用環(huán)境的db_config文件
dbenv.log_set_config:對日志文件的配置設(shè)置。DB_LOG_AUTO_REMOVE表示自動刪除多余的內(nèi)容,防止無限增加。
最后調(diào)用open打開并創(chuàng)建相應(yīng)的數(shù)據(jù)庫文件。
在第五步源碼中可以看到,如果打開失敗,又重新調(diào)用open打開了一次,如果還是失敗,表示當前環(huán)境不能創(chuàng)建錢包運行環(huán)境。下面我們看下Verity函數(shù)做了什么。
這段代碼很簡單, 主要是調(diào)用Db數(shù)據(jù)庫的verify函數(shù)進行了數(shù)據(jù)庫完整性驗證。并返回結(jié)果。
所以第五步主要功能就是打開數(shù)據(jù)庫并驗證數(shù)據(jù)庫的完整性。
這篇文章就寫到這里,因為第六步的網(wǎng)絡(luò)初始化涉及到網(wǎng)絡(luò)和塊鏈的結(jié)構(gòu),我們單獨來分析。
作者:區(qū)塊鏈研習(xí)社比特幣源碼研讀班,black