本文主要描述了程序啟動時節點位址、區塊資訊和錢包資訊的初始化(節點執行緒和礦工挖礦執行緒在後續「位元幣原始碼解析之執行緒處理」一文中介紹,孤立塊處理在後續「位元幣原始碼解讀之挖礦」一文中介紹)。
初始化流程圖如下所示:
(1)首先呼叫caddrdb類的loadaddresses()函式(同時caddrdb的建構函式預設開啟addr.dat檔案)。原始碼如下所示:
bool
loadaddresses
()
class
caddrdb
:public
cdb
...
...}
(2)判斷有沒有使用者自定義的位址資訊(資訊位於addr.txt中)。如果有自定義位址資訊,則獲取對應位址資訊,如果該位址不在mapaddresses中,則儲存到mapaddresses並且寫入addr.dat配置檔案中;否則將nservices資訊寫入addr.dat配置檔案中。
map
<
vector
<
unsigned
char
>,
caddress
>::
iterator
it =
mapaddresses
.find
(addr
.getkey
());
if
(it
==mapaddresses
.end
())
else
}
(3)從addr.dat檔案中匹配key為「addr」,從而獲取對應位址資訊,並插入到mapaddresses向量中。
loop
}
(1)首先呼叫ctxdb 類的loadblockindex()函式(同時ctxdb 的建構函式預設開啟blkindex.dat檔案)。如果開啟blkindex.dat失敗,則建立創世塊(創世塊的後續文章介紹)。
ctxdb
txdb
("cr"
);
if(!
txdb
.loadblockindex
())
return
false
;txdb
.close
();class
ctxdb
:public
cdb
...
...};
(3)從blkindex.dat檔案中匹配字元位「blockindex」的key值,進而獲取對應區塊索引資訊,如果mapblockindex中不存在該區塊,則插入mapblockindex中向量中。
loop
else
}
(4)如果該區塊是創世塊pindexgenesisblock,則儲存到創世塊索引pindexgenesisblock中
if
(pindexgenesisblock
==null
&&diskindex
.getblockhash
()==
hashgenesisblock
)
pindexgenesisblock
=pindexnew
;(5)從配置檔案blkindex.dat中找到字元位「hashbestchain」的key值,取出索引儲存到最長鏈索引pindexbest中以及取出高度儲存到nbestheight 中。
if
(!readhashbestchain
(hashbestchain
))
if
(!mapblockindex
.count
(hashbestchain
))
return
error
("ctxdb::loadblockindex() : blockindex for hashbestchain not found\n"
);pindexbest
=mapblockindex
[hashbestchain
];nbestheight
=pindexbest
->
nheight
;(1)呼叫cwalletdb類的loadwallet()函式(同時cwalletdb的建構函式預設開啟wallet.dat檔案)。
vector
<
unsigned
char
>
vchdefaultkey
;
if
(!cwalletdb
("cr"
).loadwallet
(vchdefaultkey
))
return
false
;class
cwalletdb
:public
cdb
}
(2)從wallet.dat檔案中
位元幣原始碼解讀之整體框架
位元幣原始碼解讀之執行緒處理-礦工執行緒
Tomcat原始碼之 初始化
1.首先設定catalina 的路徑和初始化classloader 2.利用反射模式啟動catalila catalila.load 的時候 初始化相應的容器 img catalila.start 啟動的時候,把相應的容器同事啟動 按從大到小依次啟動 先啟動server,在service,然後eng...
mybatis 原始碼分析之初始化
mybatis 的配置檔案解析又xmlconfigbuilder的parseconfiguration方法來完成,解析結果都存在configuration這個類中 private void parseconfiguration xnode root catch exception e 別名解析 pr...
SpringIOC 初始化原始碼解析
springioc容器的關鍵兩個主要的容器系列 寫了段簡單的 ioc容器的具體的過程都在這一句話上 後台很硬的 下面咱們就來看看ioc的後台是多麼的硬,加了斷點除錯了下,跳進去的第一步是 public throws bean ception 上面 的refresh 是ioc容器啟動的入口,後邊會牽扯...