比特幣源碼解讀十五(挖礦)

代碼看到這里商模,發(fā)現(xiàn)比特幣源碼中就集成了挖礦的功能,由于水平有限叛薯,我們先嘗試著分析下里面的代碼:

調(diào)用挖礦函數(shù)
啟動(dòng)挖礦

啟動(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)分析缤削。

一:初始化

開(kāi)始挖礦的設(shè)置

1。這部分首先調(diào)用SetThreadPriority進(jìn)行了線(xiàn)程優(yōu)先級(jí)設(shè)置

線(xiàn)程優(yōu)先級(jí)在unit.h中

可見(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ū)塊

新建區(qū)塊的函數(shù)是CreateNewBlockWithKey()我們看下這個(gè)函數(shù)體的實(shí)現(xiàn):

計(jì)算公鑰腳本

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ū)塊

新建區(qū)塊和創(chuàng)幣交易

2.創(chuàng)建孤立交易并計(jì)算優(yōu)先級(jí)和交易費(fèi)

計(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ì)算方式:

優(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秀又,隨后出現(xiàn)的幾起案子单寂,更是在濱河造成了極大的恐慌,老刑警劉巖吐辙,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宣决,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡昏苏,警方通過(guò)查閱死者的電腦和手機(jī)尊沸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)威沫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人洼专,你說(shuō)我怎么就攤上這事棒掠。” “怎么了屁商?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵句柠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我棒假,道長(zhǎng)溯职,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任帽哑,我火速辦了婚禮谜酒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妻枕。我一直安慰自己僻族,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布屡谐。 她就那樣靜靜地躺著述么,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愕掏。 梳的紋絲不亂的頭發(fā)上度秘,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音饵撑,去河邊找鬼剑梳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滑潘,可吹牛的內(nèi)容都是我干的垢乙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼语卤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼追逮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起粹舵,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钮孵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后齐婴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體油猫,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年柠偶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了情妖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睬关。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖毡证,靈堂內(nèi)的尸體忽然破棺而出电爹,到底是詐尸還是另有隱情,我是刑警寧澤料睛,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布丐箩,位于F島的核電站,受9級(jí)特大地震影響恤煞,放射性物質(zhì)發(fā)生泄漏屎勘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一居扒、第九天 我趴在偏房一處隱蔽的房頂上張望概漱。 院中可真熱鬧,春花似錦喜喂、人聲如沸瓤摧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)照弥。三九已至,卻和暖如春进副,著一層夾襖步出監(jiān)牢的瞬間这揣,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工敢会, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曾沈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓鸥昏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親姐帚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吏垮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359