比特幣源碼研讀之十四

由于近期比較忙,所以源碼研讀系列更新較之前有點慢,但不管怎么樣源碼研讀系列將會繼續(xù)寫下去的,保證每周至少有一篇,這樣才能源碼研讀的持續(xù)性。

自從開始對比特幣源碼進行研讀之后,在看比特幣相關的技術文章時,讓我可以很清晰地理解文章中提到的一些專業(yè)術語,比如前幾天看到的segwit、setwit2x以及比特幣實行setwit后要修改的DNSSeed,這些術語我都能聯(lián)想到其所在源碼位置以及其底層實現(xiàn)。有種內(nèi)行看門道的感覺,所以,更加堅定了我繼續(xù)堅持進行源碼研讀的信心。

話不多說,讓我們繼續(xù)源碼研讀的征程。同時再次希望大家在看我文章時能提出寶貴意見,一起討論一起進步。

本文將繼續(xù)開展應用程序參數(shù)交互源碼部分(AppInitParameterInteraction)的研讀與分析。

本文主要涉及的源碼文件包括:

src/bitcond.cpp、src/init.h、src/init.cpp、src/util.h、src/util.cpp、src/validation.h、src/RPC/register.h、src/rpc/blockchain.cpp、src/rpc/net.cpp、src/rpc/misc.cpp、src/rpc/mining.cpp、src/rpc/ rawtransaction.cpp、src/wallet/rpcwallet.cpp

一、區(qū)塊裁剪

區(qū)塊裁剪處理的標識參數(shù)為“prune”,該參數(shù)我們已在《比特幣源碼研讀之十》的“區(qū)塊修剪參數(shù)處理”中進行了詳細描述,其主要是針對默克爾樹(Merkle Tree)來說的,所以整個修剪用得很貼切,可以直觀地看出prune是對樹上的節(jié)點進行修剪。其修剪的對象又是誰呢?從回答中我們可以看出其修剪對象有2種:

(1)一種是所有輸出都被花費的葉子節(jié)點(交易);

(2)另一種是節(jié)點包含的所有子節(jié)點均已被修剪。

根據(jù)以上分析我們可以看出修剪的目的是為了節(jié)省存儲空間。

《比特幣源碼研讀之十》中程序只是解析prune參數(shù),并與txindex參數(shù)進行沖突判斷,因為二者不能同時設置,具體內(nèi)容可參見第十篇文章。

我們通過其注釋可以知道區(qū)塊裁剪是針對預先設定的存儲容量來進行的,即根據(jù)客戶端所在計算機中的存儲情況進行設定,如果超過了設定值,將進行區(qū)塊裁剪,以防超過設定值,并且該設定值為MiB單位。其注釋如下:

block pruning; get the amount of disk space (in MiB) to allot for block & undo files

區(qū)塊裁剪操作根據(jù)其prune參數(shù)的值進行處理的流程如圖所示。

(1)首先是獲取prune參數(shù)值并賦值給nPruneArg,通過GetArg函數(shù)我們可以知道其默認值為0;

(2)判斷nPruneArg是否為小于0,此時程序?qū)⒊鲥e,并退出,因為我們知道如果nPruneArg小于0,表示不會為區(qū)塊提供存儲空間了,程序?qū)o法正常工作,這顯然是不合理的,所以程序直接退出是合理的;

(3)如果nPruneArg大于0,則計算該值所對應的字節(jié)數(shù),其計算公式為

nPruneTarget = (uint64_t) nPruneArg * 1024 * 1024;

(4)此處判斷prune是否為1,如果為1則轉入第5步中,反之則進入第6步;

(5)此處為prune== 1的情況,在該情況下程序不會自動對區(qū)塊進行裁剪,需要我們通過RPC命令pruneblockchain對相應區(qū)塊進行裁剪,同時因為是手動裁剪,也就沒有裁剪限定值一說了,所以程序?qū)⑵湓O置為最大值,并且設置裁剪模式為true,即fPruneMode=true,其中fPruneMode為全局變量,其在src/validation.h中聲明,并在src/validation.cpp中定義,其默認值為false,即不進行裁剪;

(6)此處為prune不等于1的情況,在該情況下首先判斷設定的裁剪值是否小于程序默認設置的用于存儲區(qū)塊的最小硬盤存儲空間MIN_DISK_SPACE_FOR_BLOCK_FILES,該值在src/validation.h中定義,其定義如下:

static const uint64_tMIN_DISK_SPACE_FOR_BLOCK_FILES = 550 * 1024 * 1024;

從其定義我們可以看出,為區(qū)塊設定的最小存儲空間為550MiB,所以我們設置的-prune參數(shù)的值必須大于等于550才能讓程序正常運行,除非像(5)中設置為1。如果nPruneTarget>=550,程序?qū)⒗^續(xù)正常運行,并且PruneMode將設置為true。

以上就是區(qū)塊裁剪參數(shù)的具體處理過程,在此處完成裁剪信息的設置后,程序?qū)⒃诤竺娓鶕?jù)這些信息進行有效地開展區(qū)塊裁剪操作。

二、RPC命令注冊

比特幣核心程序在src/RPC/register.h文件中實現(xiàn)了對RegisterAllCoreRPCCommands的定義與實現(xiàn),在該函數(shù)中實現(xiàn)了區(qū)塊鏈、P2P網(wǎng)絡、挖礦、交易以及其他工具等模塊的RPC命令的注冊。該函數(shù)中包含的這些命令注冊函數(shù)分別為:

static inline voidRegisterAllCoreRPCCommands(CRPCTable &t)

{

RegisterBlockchainRPCCommands(t);—區(qū)塊鏈RPC命令注冊

RegisterNetRPCCommands(t);—P2P網(wǎng)絡RPC命令注冊

RegisterMiscRPCCommands(t);—其他工具RPC命令注冊

RegisterMiningRPCCommands(t);—挖礦RPC命令注冊

RegisterRawTransactionRPCCommands(t);—交易PRC命令注冊

}

下面我們分別來看每個RPC命令注冊實現(xiàn)的具體位置:

(1)區(qū)塊鏈RPC命令:在命令在src/rpc/blockchain.cpp中實現(xiàn),其包含的RPC命令通過命令常量數(shù)組commands進行存儲,具體包含的命令如下:

該常量數(shù)組中的name項即為RPC命令,程序在RegisterBlockchainRPCCommands中通過對commands的遍歷實現(xiàn)這些命令的添加,即為注冊:

voidRegisterBlockchainRPCCommands(CRPCTable &t)

{

? ? ? for (unsigned int vcidx = 0; vcidx

? ? ? t.appendCommand(commands[vcidx].name,&commands[vcidx]);

}

(2)P2P網(wǎng)絡RPC命令:在命令在src/rpc/net.cpp中實現(xiàn),其包含的RPC命令也是通過命令常量數(shù)組commands進行存儲,具體包含的命令如下:

P2P網(wǎng)絡RPC命令的注冊方法與區(qū)塊鏈的一致,其通過RegisterNetRPCCommands實現(xiàn),具體實現(xiàn)如下:

void RegisterNetRPCCommands(CRPCTable &t)

{

for(unsigned int vcidx = 0; vcidx < ARRAYLEN(commands); vcidx++)

t.appendCommand(commands[vcidx].name, &commands[vcidx]);

}

(3)其他工具RPC命令:在命令在src/rpc/misc.cpp中實現(xiàn),其包含的RPC命令通過命令常量數(shù)組commands進行存儲,具體包含的命令如下:

其他工具RPC命令的注冊方法與區(qū)塊鏈的一致,其通過RegisterMiscRPCCommands實現(xiàn),具體實現(xiàn)代碼與區(qū)塊鏈的一致;

(4)挖礦RPC命令:在命令在src/rpc/mining.cpp中實現(xiàn),其包含的RPC命令也是通過命令常量數(shù)組commands進行存儲,具體包含的命令如下:

挖礦RPC命令的注冊方法與區(qū)塊鏈的一致,其通過RegisterMiningRPCCommands實現(xiàn),具體實現(xiàn)代碼與區(qū)塊鏈的一致;

(5)交易PRC命令:在命令在src/rpc/ rawtransaction.cpp中實現(xiàn),其包含的RPC命令通過命令常量數(shù)組commands進行存儲,具體包含的命令如下:

交易RPC命令的注冊方法與區(qū)塊鏈的一致,其通過RegisterRawTransactionRPCCommands實現(xiàn),具體實現(xiàn)代碼與區(qū)塊鏈的一致。

完成這些命令的注冊后,后面是針對錢包RPC命令的注冊,錢包命令是否注冊是根據(jù)程序編譯時是否包含錢包模塊而定的,其判斷條件為

#ifdef ENABLE_WALLET

即如果錢包功能打開,則需進行錢包RPC命令的注冊,反之則不需要。錢包RPC命令注冊在src/wallet/rpcwallet.cpp中實現(xiàn),其實現(xiàn)方法與區(qū)塊鏈是一樣的,通過commands數(shù)組進行存儲,然后在RegisterWalletRPCCommands函數(shù)中進行命令的注冊。

說了這么多RPC命令的注冊,那RPC命令是怎么用的呢?在哪可以用這些命令呢?這些命令是在比特幣核心客戶端中使用的,具體來說其在比特幣核心的“Help(幫助)”菜單下的“Debug Window(調(diào)試窗口)”中使用,調(diào)試窗口界面如下:

我們可在該調(diào)試窗口的命令框中輸入相應的RPC命令,然后回車即可執(zhí)行相應命令,調(diào)試窗口中將顯示其執(zhí)行結果。具體命令的運行大家可根據(jù)實際情況輸入。如果臨時不記得命令,可在輸入框中輸入help獲取命令提示幫助。

以上即為本次研讀內(nèi)容,在本文我們分析了區(qū)塊裁剪的處理以及比特幣中各模塊包含的RPC命令、命令注冊以及命令的運行。希望對大家理解這塊源碼有幫助,也歡迎大家留言討論。

區(qū)塊鏈研習社源碼研讀班 菜菜子

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容

  • 接著上一講,這一講繼續(xù)講解函數(shù)AppInitParameterInteraction。這個函數(shù)代碼有點多,剛大概數(shù)...
    Jacky_2c9f閱讀 672評論 0 0
  • 18年第一次買口紅 128種顏色挑到眼瞎 送給我一個非常重要的朋友 有多重要哇 全世界最寵我最有耐心陪我長大的朋友...
    大寶貝肖小肖閱讀 212評論 0 1
  • 文/菽麥 人生就是一場又一場的旅行的疊加,每一段都有它獨特的味道。讀完《帶艾伯特回家》,更明白了每次旅行帶給人們的...
    菽麥閱讀 138評論 2 0
  • 小時候,上學需要走5里路,起的特別早,記得月亮還特別亮,走著走著才黑。就是黎明前的黑暗了。 參加中考,走了20里路...
    楊繼彬閱讀 236評論 0 0
  • 吾家,一夫一妻,倆妞,四口之家,在四平八穩(wěn)的生活中有歲月靜好的安寧,有一地雞毛的忙亂,亦有趣事橫生的快樂。 本篇暫...
    果果時光閱讀 348評論 2 3