代碼看到這里商模,發(fā)現(xiàn)比特幣源碼中就集成了挖礦的功能,由于水平有限叛薯,我們先嘗試著分析下里面的代碼:
啟動(dòng)挖礦的函數(shù)是GenerateBitcoins(),通過(guò)分析參數(shù)我們可以知道gen是啟動(dòng)挖礦的命令參數(shù)凹耙,genproclimit表?示挖礦CPU個(gè)數(shù)侠畔,這個(gè)參數(shù)是可選的贺纲,默認(rèn)是-1表示無(wú)限制毛萌,所有的CPU都運(yùn)?行挖礦苟弛。為0時(shí)停?止挖礦。
所以決定是否挖礦的命令參數(shù)是兩個(gè):gen和genproclimit阁将。我們現(xiàn)在就進(jìn)入BitcoinMiner()挖礦函數(shù)一探究竟膏秫,BitcoinMiner需要的參數(shù)就是我們的當(dāng)前錢(qián)包。由于函數(shù)復(fù)雜做盅,我們也分幾部分來(lái)分析缤削。
一:初始化
1。這部分首先調(diào)用SetThreadPriority進(jìn)行了線(xiàn)程優(yōu)先級(jí)設(shè)置
可見(jiàn)挖礦的優(yōu)先級(jí)是設(shè)置了最低的優(yōu)先級(jí)吹榴,數(shù)值越大亭敢,優(yōu)先級(jí)越低。
2图筹。調(diào)用RenamThread()給當(dāng)前線(xiàn)程重新命名為"bitcoin-miner"
3帅刀。給每個(gè)線(xiàn)程定義了個(gè)基于錢(qián)包(pwallet)的key和對(duì)nExtraNonce初始化為0。
我們這里也簡(jiǎn)單說(shuō)下Nonce這個(gè)變量远剩,我在網(wǎng)上找到相關(guān)的解釋為:Nonce扣溺,Number used once或Numberonce的縮寫(xiě),在密碼學(xué)中Nonce是一個(gè)只被使用一次的任意或非重復(fù)的隨機(jī)數(shù)值瓜晤,在加密技術(shù)中的初始向量和加密散列函數(shù)都發(fā)揮著重要作用锥余,在各類(lèi)驗(yàn)證協(xié)議的通信應(yīng)用中確保驗(yàn)證信息不被重復(fù)使用以對(duì)抗重放攻擊(ReplayAttack)。
在這里是一個(gè)計(jì)數(shù)器痢掠,每挖到一個(gè)區(qū)塊此值就會(huì)加1驱犹,這樣實(shí)現(xiàn)的目的和上面的解釋是一樣的。
初始化完成后足画,就開(kāi)始循環(huán)挖礦雄驹,在源碼中可以看到這部分代碼是在一個(gè)while(true)的循環(huán)中。
二锌云。新建區(qū)塊
新建區(qū)塊的函數(shù)是CreateNewBlockWithKey()我們看下這個(gè)函數(shù)體的實(shí)現(xiàn):
OP_CHECKSIG是一個(gè)腳本操作碼(script opcode)荠医,用來(lái)驗(yàn)證一個(gè)交易(tx)輸入中的簽名的正確性。我們這里普及下這個(gè)知識(shí)(參考:http://www.reibang.com/p/bf38c8a7ce4d)
在比特幣系統(tǒng)的交易(也叫轉(zhuǎn)賬記錄)中為了進(jìn)行交易權(quán)限校驗(yàn)桑涎,即驗(yàn)證某人是否有權(quán)利動(dòng)用發(fā)送給他的比特幣彬向,使用了腳本系統(tǒng)來(lái)進(jìn)行權(quán)限驗(yàn)證。常用的權(quán)限驗(yàn)證方式例如利用公鑰和簽名進(jìn)行攻冷,又或者例如多人投票機(jī)制等娃胆。該腳本系統(tǒng)是一種簡(jiǎn)單的、基于堆棧的等曼、從左到右處理的里烦、非圖靈完整的腳本系統(tǒng)凿蒜,它比起以太坊、EOS等下一代區(qū)塊鏈技術(shù)中使用的智能合約是要簡(jiǎn)單太多了胁黑,所以功能也比較有限废封。腳本系統(tǒng)中常用的指令包括:1.堆棧處理指令:OP_DUP(進(jìn)行復(fù)制操作)、OP_DROP(刪除棧頂元素)丧蘸、OP_SWAP(棧頂?shù)膬蓚€(gè)元素進(jìn)行交換)2.腳本流程控制指令:OP_RETURN(標(biāo)記交易無(wú)效)\OP_VERIFY(如果棧頂元素為false漂洋,標(biāo)識(shí)交易無(wú)效。如果為true力喷,則交易有效)3.加密簽名指令:OP_HASH256(進(jìn)行hash散列計(jì)算)刽漂、OP_CHECKSIGVERIFY(進(jìn)行簽名驗(yàn)證)、弟孟、等贝咙;4.邏輯操作指令:OP_EQUAL(判斷是否相等)、OP_EQUALVERIFY(判斷是否相等后進(jìn)行腳本流程控制判斷拂募,如果棧頂元素為false就標(biāo)識(shí)交易無(wú)效)5.算術(shù)操作指令:OP_ADD(加)\OP_SUB(減)\OP_MAX(取最大值)\OP_MIN(取最小值)等庭猩。
下面我們?cè)龠M(jìn)入CreateNewBlock()函數(shù)看下具體的過(guò)程:
1.新建一個(gè)區(qū)塊
2.創(chuàng)建孤立交易并計(jì)算優(yōu)先級(jí)和交易費(fèi)
這里的交易費(fèi)是按每千字節(jié)計(jì)算的。公式為:
dFeePerKb?=??double(nTotalIn-tx.GetValueOut())?/?(double(nTxSize)/1000.0);
(所有交易輸入 - 所有交易輸出 )/ (交易字節(jié)大忻唤病)/ 1000
我們看下優(yōu)先級(jí)的計(jì)算方式:
可以看到這些先計(jì)算了所有交易輸入的大小眯娱,然后由傳過(guò)來(lái)的優(yōu)先級(jí)/交易字節(jié)大小。而傳過(guò)來(lái)的優(yōu)先級(jí)(dPriorityInputs)在源碼中是nValueIn * nConf 表示是交易的輸入 * 交易的年齡爬凑。
所以?xún)?yōu)先級(jí)的計(jì)算公式為:
sum(valuein?*?age)?/ nTxSize
這部分內(nèi)容在《精通比特幣》 - 第8章 挖礦與共識(shí)中有介紹。大家可以去看下试伙,先了解下概念再來(lái)看源碼嘁信。這樣理解會(huì)深刻點(diǎn)。我也需要看補(bǔ)充下疏叨。
我們這篇也就先寫(xiě)到這里潘靖,我們基本了解了挖礦中區(qū)塊的創(chuàng)建和交易的整合。我們?cè)谙缕羞€會(huì)詳細(xì)介紹蚤蔓。
作者:區(qū)塊鏈研習(xí)社比特幣源碼研讀班卦溢,black