比特幣源碼研讀之十三

比特幣源碼研讀系列已完成十二篇了蛛砰,在前面的十二篇中我們大部分時間是在對傳入的參數(shù)、定義的全局變量以及代碼結構進行了解析黍衙,雖然比較繁瑣泥畅,但是這些內容的研讀著實讓我對比特幣源碼中的一些細節(jié)有了更深入的理解,掌握了其主要參數(shù)所在位置琅翻。掌握了這些信息后不管是快速理解后續(xù)的源碼位仁,還是后續(xù)開發(fā)自己的區(qū)塊鏈產(chǎn)品都可奠定很好的基礎。所以望迎,我仍然選擇耐著性子穩(wěn)步對源碼進行仔細研讀障癌,只有這樣才能讓自己真正掌握比特幣源碼凌外,不至于以后還要反復回來重新閱讀源碼辩尊,耗費不必要的時間與精力。同時康辑,也希望大家在看我文章時能提出寶貴意見摄欲,一起討論一起進步。

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

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

src/bitcond.cpp胸墙、src/init.h、src/init.cpp按咒、src/util.h迟隅、src/util.cpp、src/validation.h励七、src/uint256.h智袭、src/policy.h、src/policy.cpp掠抬、src/amount.h吼野、src/amount.cpp

一、交易費增長量

交易費增長量(incrementalRelayFee)的默認值在src/policy.h中定義两波,該值為靜態(tài)全局變量瞳步,其默認值為1000聰,具體定義如下:

/**Default for -incrementalrelayfee, which sets the minimum feerate increase formempool limiting or BIP 125 replacement **/

static const unsigned int DEFAULT_INCREMENTAL_RELAY_FEE = 1000;

incrementalRelayFee為全局變量腰奋,其在src/policy.h中聲明单起,并在src/policy.cpp中定義,具體定義如下:

CFeeRate incrementalRelayFee = CFeeRate(DEFAULT_INCREMENTAL_RELAY_FEE);

同時init.cpp中針對incrementalRelayFee的注釋如下:

// incremental relay fee sets the minimimum feerateincrease necessary for BIP 125 replacement in the mempool

// and the amount the mempool min fee increases above the feerate of txs evicted due to mempool limiting.

通過其注釋我們可以看到incrementalRelayFee的功能是設置最小費率增長量劣坊,通過設置交易費增長量與交易最小費的目的考慮交易池的容量限制馏臭,排除一些交易費過低的交易,即將其交易退回。

此處還需對incrementalRelayFee做進一步解釋括儒,該值可理解為最小交易費用設置的最低值绕沈,因為交易池中交易費的增量是以incrementalRelayFee為基礎的,所以每筆交易費必須大于等于incrementalRelayFee帮寻,也就是說最小交易費也必須大于等于該值乍狐。

我們再來看針對incrementalrelayfee參數(shù)的處理代碼,程序首先通過IsArgSet判斷是否設置了incrementalrelayfee參數(shù)固逗,如果設置了浅蚪,則通過ParseMoney函數(shù)將輸入的以字符串表達的交易增長費轉換為數(shù)字型的增長交易費,ParseMoney與其反向求解的FormatMoney函數(shù)均定義與src/utilmoneystr.h烫罩,這兩個函數(shù)一個是將數(shù)字轉換為字符串惜傲,一個是將字符串轉換為數(shù)字。

如果傳入的金額無效則退出程序贝攒,反之為incrementalRelayFee賦值盗誊,為其費率值賦予傳入的數(shù)值:

incrementalRelayFee = CFeeRate(n);

通過CFeeRate(src/amount.h中定義與注釋)我們可以知道傳入的n的單位為每千字節(jié)需要n聰?shù)慕痤~。

二隘弊、驗證腳本線程數(shù)

驗證腳本線程數(shù)可通過-par參數(shù)設置哈踱,其線程數(shù)獲取代碼如下:

nScriptCheckThreads = GetArg("-par",DEFAULT_SCRIPTCHECK_THREADS);

通過其注釋我們可以看到-par=0時意味著程序自動根據(jù)機器情況自動檢測線程數(shù),同時如果nScriptCheckThreads==0意味著將不按并發(fā)方式實現(xiàn)腳本驗證梨熙,即腳本驗證線程數(shù)為0开镣。

默認線程數(shù)DEFAULT_SCRIPTCHECK_THREADS在src/validation.h中定義,其默認值為0咽扇,意味默認選擇自動檢測驗證線程數(shù)邪财。

/**-par default (number of script-checking threads, 0 = auto) */

static const int DEFAULT_SCRIPTCHECK_THREADS = 0;

同時與該宏定義一起定義的還有最大腳本驗證線程數(shù)常量MAX_SCRIPTCHECK_THREADS,其默認值為16质欲,即程序中最多啟動16個線程用于腳本驗證操作树埠,其定義如下:

/** Maximum number of script-checking threads allowed*/

static const int MAX_SCRIPTCHECK_THREADS = 16;

我們再來看后面對nScriptCheckThreads的邏輯判斷,當nScriptCheckThreads輸入值為0或負數(shù)時把敞,程序將通過GetNumCores()函數(shù)獲取程序運行機器能提供的線程數(shù)弥奸,然后nScriptCheckThreads加上獲取的線程數(shù)獲得腳本驗證的線程數(shù)。最后是判斷nScriptCheckThreads的值:

(1)如果為nScriptCheckThreads<= 1奋早,則nScriptCheckThreads=0盛霎;

(2)如果nScriptCheckThreads >MAX_SCRIPTCHECK_THREADS,即驗證線程數(shù)大于16時耽装,則nScriptCheckThreads賦值為MAX_SCRIPTCHECK_THREADS愤炸。

nScriptCheckThreads在src/validation.cpp以及src/init.cpp中使用,src/validation.cpp中主要用于判斷是否需要進行腳本驗證掉奄,使用之處包括

(1)CCheckQueueControl control(fScriptChecks &&nScriptCheckThreads ? &scriptcheckqueue : NULL);

(2)CheckInputs(tx, state, view, fScriptChecks, flags, fCacheResults,txdata[i], nScriptCheckThreads ? &vChecks : NULL)规个。

而src/init.cpp中則在后面將會研讀到的AppInitMain函數(shù)中凤薛,在該函數(shù)中將根據(jù)nScriptCheckThreads啟動相應數(shù)量的線程,其實現(xiàn)代碼如下:

LogPrintf("Using %u threads for scriptverification\n", nScriptCheckThreads);

if (nScriptCheckThreads) {

for(int i=0; i

threadGroup.create_thread(&ThreadScriptCheck);

}

通過上面代碼我們可以看出诞仓,通過線程組創(chuàng)建nScriptCheckThreads個腳本驗證線程缤苫,線程處理函數(shù)為ThreadScriptCheck,其定義于src/validation.h中墅拭,實現(xiàn)于src/validation.cpp中活玲,在該函數(shù)中通過腳本驗證隊列管理腳本驗證線程,其具體運行方式我們將AppInitMain函數(shù)的研讀中詳細說明谍婉。

以上就是本篇文章的研讀記錄舒憾,這篇文章涉及的交易費增長量和驗證腳本線程都與比特幣中的交易相關,正如《精通比特幣》作者在其交易章節(jié)說到的“比特幣交易是比特幣系統(tǒng)中最重要的部分穗熬《朴兀”,所以唤蔗,我在寫本文的研讀記錄時對其中的概念進行了多方斟酌探遵、考量與驗證,當然也有可能存在理解不到位的情況措译,大家如果有好的建議可以在留言中給出别凤,我們可以一起討論饰序,完善我們的研讀系列领虹!

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


以下是我們研習社公眾號,歡迎大家訂閱并加入我們研習社求豫,一起學習區(qū)塊鏈技術


以下是廣告:

我們區(qū)塊鏈研習社已創(chuàng)建“區(qū)塊鏈研習社幣圈交流”小密圈”塌衰,在小密圈中,我們將帶領大家一起學習區(qū)塊鏈的原理與投資蝠嘉,還將提供區(qū)塊鏈基本原理解答最疆、交易所注冊與交易操作、ICO交易與操作蚤告、投資分析努酸、風險分析等內容。

目前入圈價格初始定價50元杜恰,50人調整一次價格获诈,每次調整幅度為50元!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末心褐,一起剝皮案震驚了整個濱河市舔涎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逗爹,老刑警劉巖亡嫌,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡挟冠,警方通過查閱死者的電腦和手機于购,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來知染,“玉大人价涝,你說我怎么就攤上這事〕钟撸” “怎么了色瘩?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逸寓。 經(jīng)常有香客問我居兆,道長,這世上最難降的妖魔是什么竹伸? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任泥栖,我火速辦了婚禮,結果婚禮上勋篓,老公的妹妹穿的比我還像新娘吧享。我一直安慰自己,他們只是感情好譬嚣,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布钢颂。 她就那樣靜靜地躺著,像睡著了一般拜银。 火紅的嫁衣襯著肌膚如雪殊鞭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天尼桶,我揣著相機與錄音操灿,去河邊找鬼。 笑死泵督,一個胖子當著我的面吹牛趾盐,可吹牛的內容都是我干的。 我是一名探鬼主播小腊,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼救鲤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溢豆?” 一聲冷哼從身側響起蜒简,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漩仙,沒想到半個月后搓茬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犹赖,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年卷仑,在試婚紗的時候發(fā)現(xiàn)自己被綠了峻村。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡锡凝,死狀恐怖粘昨,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情窜锯,我是刑警寧澤张肾,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站锚扎,受9級特大地震影響吞瞪,放射性物質發(fā)生泄漏。R本人自食惡果不足惜驾孔,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一芍秆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翠勉,春花似錦妖啥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俭缓,卻和暖如春克伊,著一層夾襖步出監(jiān)牢的瞬間酥郭,已是汗流浹背华坦。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留不从,地道東北人惜姐。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像椿息,于是被迫代替她去往敵國和親歹袁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內容

  • 文 by 達達 在我們的日常生活中寝优,有六大原因破壞女性身材: 1.地心引力 作為地球一份子条舔,地心引力是我們每天面對...
    Hdada閱讀 1,613評論 0 0
  • 最近因為忙碌重點實驗室的事情,很多事情都需要配合老師的工作進行乏矾,忙得著實不可開交孟抗。 這兩天連續(xù)的熬夜已經(jīng)讓抵抗力嚴...
    Natsuka閱讀 209評論 0 0
  • 我從來不覺得有人能陪我走完這一生 這個年紀的感情真的很脆弱 好像紙一樣 一刮就跑一揉就皺一扯就破 無論是誰我...
    自此以后念及心動閱讀 110評論 0 2
  • 凌晨兩點 你睡不著 因為你想她啊 你看你迁杨,一直傻笑 黑夜馬上就逃之夭夭 困意和床依舊徒勞 時間一分一秒,一分一秒 ...
    何洮久閱讀 260評論 0 0
  • 姓名:母光艷 公司:寧波貞觀電器 第235期凄硼,利他二組 【日精進打卡第241天】 【知-學習】 誦讀《六項精進》大...
    母光焱閱讀 127評論 0 0