比特幣源碼研讀系列已完成十二篇了蛛砰,在前面的十二篇中我們大部分時間是在對傳入的參數(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元!