比特幣昨日已成功突破3萬大關座菠,這個價格是上個月還處于無法想象的浴滴,作為普羅大眾的我們是根本不敢想的。不過這點還是要佩服笑來老師,他在硬幣資本的分享會上就說了:“現(xiàn)在價格處于下跌階段翰撑,正是買入好時機涨醋。”帐我。所以拦键,還真是要像李老師那樣深刻理解比特幣的內(nèi)涵與原理才能做到長期持有萄金,才能拿得姿锕浴!而投資的世界與我們平時的世界是反的蜗帜,在投資的世界里我們越頻繁地操作就越容易犯錯恋拷,我們要做的就是在投資之前花時間認真研究投資標的,研究后認可其價值則長期持有之厅缺,堅決不能頻繁關注價格蔬顾!我們要做的就是去學習知識、學習區(qū)塊鏈知識店归、學習比特幣源碼阎抒,進而深刻理解其內(nèi)涵!在掌握了比特幣的實現(xiàn)原理之后消痛,我們再去研究其他的區(qū)塊鏈資產(chǎn)肯定可以得心應手了且叁。所以現(xiàn)在讓我們繼續(xù)在比特幣源碼研讀之路中前行。開啟我們的第十五篇源碼研讀之旅秩伞。
本文將繼續(xù)開展應用程序參數(shù)交互源碼部分(AppInitParameterInteraction)的研讀與分析逞带。
本文主要涉及的源碼文件包括:
src/bitcond.cpp欺矫、src/init.h、src/init.cpp展氓、src/util.h穆趴、src/util.cpp、src/netbase.h遇汞、src/policy/policy.h未妹、src/policy/policy.cpp
一、節(jié)點超時參數(shù)
比特幣網(wǎng)絡中新加入的節(jié)點都會去尋找節(jié)點空入,加入比特幣P2P網(wǎng)絡中络它,與其他節(jié)點完成同步操作。但是在網(wǎng)絡中尋找節(jié)點歪赢,并建立連接是有時間限制的化戳,即會出現(xiàn)連接超時的問題。這個超時時間通過src/netbase.h中的全局變量DEFAULT_CONNECT_TIMEOUT定義埋凯,其默認值為5000毫秒点楼,最小值為1毫秒,這個1毫秒的最小值是通過-timeout參數(shù)的幫助信息得知的白对。該幫助信息可在src/init.cpp中的HelpMessage函數(shù)中獲取掠廓,或者在比特幣程序的help命令進行查詢-timeout參數(shù)的詳細信息。
默認值(src/netbase.h):
//! -timeout default
static const int DEFAULT_CONNECT_TIMEOUT = 5000;
最小值(src/init.h):
strUsage +=HelpMessageOpt("-timeout=", strprintf(_("Specifyconnection timeout in milliseconds (minimum: 1, default: %d)"), DEFAULT_CONNECT_TIMEOUT));
程序中的幫助信息
我們通過timeout參數(shù)解析代碼可以明確地知道連接超時時間不能設置為負數(shù)躏结,如果為負數(shù)則將設置為默認值却盘。
二、最小交易費
此處討論的最小交易費涉及四方面內(nèi)容:minrelaytxfee媳拴、incrementalRelayFee黄橘、blockmintxfee以及dustrelayfee。
(1)minrelaytxfee為最小交易費率屈溉。通過代碼與注釋我們可以了解到該費率為每千字節(jié)所需的最小費率塞关。該費率值的設置對于礦工來說很重要,需謹慎設置子巾,切忌設置為為0帆赢,因為如果設置為0時,每個被挖出的區(qū)塊中都將會被塞滿1聰交易費的交易线梗,這將會使得礦工入不敷出椰于。所以最低交易費必須高于處理交易所需成本。其默認值為DEFAULT_MIN_RELAY_TX_FEE=1000仪搔,定義于src/validation.h中瘾婿。最小交易費用通過全局變量::minRelayTxFee進行存儲,其類型為CFeeRate。如果我們在程序沒有設置minrelaytxfee參數(shù)偏陪,minRelayTxFee必須大于等于incrementalRelayFee(其含義見《比特幣源碼研讀之十三》)抢呆;
(2)incrementalRelayFee該變量我們已經(jīng)在《比特幣源碼研讀之十三》中介紹了,具體內(nèi)容可前往第十三篇閱讀笛谦;
(3)blockmintxfee為區(qū)塊中打包交易的最小費用值信息抱虐,我們可以通過其幫助信息了解到其最低費用通過src/policy.h中的DEFAULT_BLOCK_MIN_TX_FEE全局變量進行定義。
/** Default for -blockmintxfee, whichsets the minimum feerate for a transaction in blocks created by mining code **/
static const unsigned intDEFAULT_BLOCK_MIN_TX_FEE = 1000;
從上可以看出饥脑,通過挖礦發(fā)現(xiàn)的區(qū)塊打包交易的最低費率為1000聰恳邀。
(4)dustrelayfee為全局變量,其在src/policy/policy.h中聲明灶轰,在policy.cpp中實現(xiàn)定義:
CFeeRate dustRelayFee = CFeeRate(DUST_RELAY_TX_FEE);
其默認值為DUST_RELAY_TX_FEE定義于policy.h轩娶,其默認值與minrelayfee一致,均為1000聰框往。
針對dustrelayfee的含義,我們可通過其具體使用情況來分析闯捎,在src/qt/paymentserver.cpp中使用dustRelayFee代碼如下:
// Extract and check amounts
CTxOut txOut(sendingTo.second, sendingTo.first);
if (txOut.IsDust(dustRelayFee)) {
Q_EMITmessage(tr("Payment request error"), tr("Requested paymentamount of %1 is too small (considered dust).")
.arg(BitcoinUnits::formatWithUnit(optionsModel->getDisplayUnit(),sendingTo.second)),
CClientUIInterface::MSG_ERROR);
returnfalse;
}
通過消息輸出內(nèi)容為“Requested payment amount of %1 is too small(considered dust).”我們可以得知dustrelayfee為那些交易費用很低的交易椰弊,可以形象得理解為灰塵、忽略不計的費用瓤鼻。而為了防止出現(xiàn)非標準交易秉版,源碼中設置了默認的灰塵交易判斷標準,同時針對用戶傳入的灰塵交易費進行了邏輯判斷茬祷,保證其大于0清焕。
// Feerate used to define dust.Shouldn't be changed lightly as old
// implementations may inadvertently createnon-standard transactions
if (IsArgSet("-dustrelayfee"))
{
CAmount n =0;
if(!ParseMoney(GetArg("-dustrelayfee", ""), n) || 0 == n)
returnInitError(AmountErrMsg("dustrelayfee",GetArg("-dustrelayfee", "")));
dustRelayFee= CFeeRate(n);
}
三、非標準交易
Acceptnonstdtxn參數(shù)的含義是比特幣網(wǎng)絡中是否需要非標準交易祭犯,是否接受標準交易主要看當前運行的是什么網(wǎng)絡(主網(wǎng)秸妥、測試網(wǎng)、私有網(wǎng))沃粗,這3種網(wǎng)絡對是否需要標準交易是有默認要求的粥惧。該狀態(tài)是通過fRequireStandard布爾變量記錄的,該變量可在chainparams.h中找到最盅,在chainparams.cpp中我們可以看到三種網(wǎng)絡對fRequireStandard的賦值突雪。主網(wǎng)中fRequireStandard=true,其他二者為false涡贱。即主網(wǎng)只接受標準交易咏删,測試網(wǎng)與私有網(wǎng)可以接受非標準交易。這也好理解问词,主網(wǎng)是真正上線運行的網(wǎng)絡督函,交易必須是標準的,不然整個網(wǎng)絡種的交易就會出錯。而另外兩者只是開發(fā)與測試時使用侨核,測試交易不同狀態(tài)下的運行情況草穆,保證主網(wǎng)上線后的正常運行。
四搓译、簽名操作字節(jié)數(shù)
我們再來看看簽操作字節(jié)數(shù)參數(shù)bytespersigop悲柱,其處理代碼如下:
nBytesPerSigOp = GetArg("-bytespersigop",nBytesPerSigOp);
nBytesPerSigOp在src/policy/policy.h中聲明為全局變量,并在其cpp中實現(xiàn)定義些己,并對其設置了默認值DEFAULT_BYTES_PER_SIGOP豌鸡,該默認值也在src/policy/policy.h中進行了定義,默認值為20:
/** Default for -bytespersigop */
static const unsigned int DEFAULT_BYTES_PER_SIGOP =20;
以上即為本次研讀內(nèi)容段标,在本文我們分析了節(jié)點超時參數(shù)涯冠、最小交易費設置參數(shù)、非標準交易參數(shù)以及簽名操作字節(jié)數(shù)參數(shù)逼庞,可以了解到比特幣網(wǎng)絡中對于交易費是有最低限額要求的蛇更,如果太少將影響我們的交易,所以大家在轉(zhuǎn)賬時如果想保證交易的成功赛糟,交易費這塊一定不能太少哦派任!希望對大家理解這塊源碼有幫助,也歡迎大家留言討論璧南。
區(qū)塊鏈研習社源碼研讀班 菜菜子