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

? ? ?本篇我們就看挖礦成功后對區(qū)塊的有效性進(jìn)行檢測的代碼。也就是CheckWork所做的事情幔摸。檢驗之時件舵,線程的優(yōu)先級必須為THREAD_PRIORITY_NORMAL。現(xiàn)在我們就直接看下CheckWork()函數(shù)的代碼邏輯她倘。

CheckWork檢測

通過代碼我們看到在進(jìn)行ProcessBlock()正式檢測之前要對難度值和父區(qū)塊進(jìn)行檢測璧微。如果這兩項檢測通過后,再正式調(diào)用ProcessBlock()進(jìn)行新挖區(qū)塊的檢測硬梁。需要說明的是這個ProcessBlock()區(qū)塊檢測和從其他節(jié)點發(fā)送過來的區(qū)塊信息("block")檢測過程是一樣的前硫。都是調(diào)用這個ProcessBlock()進(jìn)行檢測。

? ? 我們現(xiàn)在就進(jìn)入ProcessBlock()函數(shù)進(jìn)行源碼解讀荧止,由于這個函數(shù)很大屹电,檢測項目很多,我們也向往常一樣分段來分析解讀:

對塊的基本信息和擴展信息檢測

上在的代碼對是否是舊塊(重復(fù)添加)跃巡,基本信息(checkBlock()),和擴展信息進(jìn)行了檢測危号,塊的基本信息檢測包括:1。塊的大小素邪,2外莲。(工作量證明)CheckProofOfWork 3。時間戳(區(qū)塊時間戳早于驗證時刻未來兩個小時)4兔朦。塊的第?一個交易信息必須是coinbase和有且有一個coinBase交易5偷线。交易信息(CheckTransaction)6。檢測多重支付(有2個或以上的同樣的交易信息)7沽甥。簽名的有效性8声邦。MerkleRoot(默克樹根)的有效性。

現(xiàn)在我們就看下checkBlock()的源碼摆舟,就是按照這樣一個檢測列表進(jìn)行檢測的:

基本信息檢測

上面對基本信息和擴展信息進(jìn)行了檢測亥曹,我們接著往下看:

檢測孤塊和存儲區(qū)塊數(shù)據(jù)到磁盤中

我們說一下孤塊的概念和形成原因

如果節(jié)點收到了一個有效的區(qū)塊,而在現(xiàn)有的區(qū)塊鏈中卻未找到它的父區(qū)塊恨诱,那么這個區(qū)塊被認(rèn)為是“孤塊”歇式。孤塊會被保存在孤塊池中,直到它們的父區(qū)塊被節(jié)點收到胡野。一旦收到了父區(qū)塊并且將其連接到現(xiàn)有區(qū)塊鏈上材失,節(jié)點就會將孤塊從孤塊池中取出,并且連接到它的父區(qū)塊硫豆,讓它作為區(qū)塊鏈的一部分龙巨。當(dāng)兩個區(qū)塊在很短的時間間隔內(nèi)被挖出來,節(jié)點有可能會以相反的順序接收到它們熊响,這個時候孤塊現(xiàn)象就會出現(xiàn)旨别。

現(xiàn)在我們看AcceptBlock是如何將新區(qū)塊存儲到磁盤中的,在寫入磁盤之前還要進(jìn)行精確的POW校驗。我們就直接通過源碼來看下這個校驗列表汗茄,這個函數(shù)很長秸弛,我分兩部分截圖來看:

一。區(qū)塊普通檢測

寫入?yún)^(qū)塊校驗1

二。區(qū)塊版本檢測

區(qū)塊版本校驗

通過區(qū)塊版本檢測可以看到這里是用于區(qū)分比特幣分叉之后的處理递览,這里用的方案就是平常說的大數(shù)投票方案(IsSuperMajority)簡稱ISM叼屠,這個方案的規(guī)是這樣的,大家可以對著代碼了解:

1.在對比特幣協(xié)議進(jìn)行升級時绞铃,是用區(qū)塊的nVersion進(jìn)行+1區(qū)分的镜雨。

2.升級開始后,如果在過去1000個區(qū)塊(6~7天)內(nèi)儿捧,有750個區(qū)塊的nVersion為新版本號(也就是說75%的算力已升級)荚坞,那么新功能會被激活。所有新版本軟件產(chǎn)生的區(qū)塊會按照新規(guī)則進(jìn)行驗證菲盾,未驗證通過會被拒絕颓影。而舊版本軟件產(chǎn)生的區(qū)塊依然按照舊規(guī)則進(jìn)行驗證,只要合格同樣可被網(wǎng)絡(luò)接受懒鉴。

3.在版本號大于等于2的區(qū)塊中诡挂,達(dá)到在過去1000個區(qū)塊內(nèi)有950個區(qū)塊的nVersion為新版本號,那么所有由舊版本軟件產(chǎn)生的舊版本號區(qū)塊會被拒絕疗我,這樣軟分叉激活就完成了咆畏。

我把IsSuperMajority函數(shù)截出來,大家可以更深刻的理解下吴裤。

IsSuperMajority函數(shù)

對版本檢測完成后旧找,下面就開始真正的寫入磁盤了。

存儲和廣播區(qū)塊

到這里基本上一個區(qū)塊挖出來后就已經(jīng)被記錄下來了麦牺,但我們還有一個沒有處理钮蛛,那就是孤鏈池,就是如果有此區(qū)塊的子區(qū)塊剖膳,則可以被鏈記錄了魏颓。所以ProcessBlock()最后的部分就是處理孤鏈池。

循環(huán)處理孤鏈池

這個函數(shù)循環(huán)孤鏈池mapOrphanBlocksByPrev,通過區(qū)塊hash值不斷循環(huán)查找吱晒。然后調(diào)用AsseptBlock()處理所有依賴此區(qū)塊的孤塊甸饱。

到這里基本上一個挖礦的過程就完了,我們基本上了解挖礦的過程仑濒,和挖礦成功后是如何處理最新的交易和區(qū)塊的叹话。最后又是如何進(jìn)行全網(wǎng)廣播的,大家可以在源碼中了解更詳細(xì)的處理墩瞳。

我們?nèi)绻欣斫獠粚Φ牡胤酵蘸瑲g迎大家指正。



作者:區(qū)塊鏈研習(xí)社比特幣源碼研讀班喉酌,black

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末热凹,一起剝皮案震驚了整個濱河市泵喘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌般妙,老刑警劉巖纪铺,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異股冗,居然都是意外死亡霹陡,警方通過查閱死者的電腦和手機和蚪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門止状,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攒霹,你說我怎么就攤上這事集峦「叻洌” “怎么了锦秒?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵生真,是天一觀的道長产弹。 經(jīng)常有香客問我匾嘱,道長悬垃,這世上最難降的妖魔是什么载庭? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任顽铸,我火速辦了婚禮,結(jié)果婚禮上拧簸,老公的妹妹穿的比我還像新娘。我一直安慰自己盆赤,他們只是感情好贾富,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牺六,像睡著了一般颤枪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淑际,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天畏纲,我揣著相機與錄音扇住,去河邊找鬼。 笑死盗胀,一個胖子當(dāng)著我的面吹牛艘蹋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播票灰,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼女阀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屑迂?” 一聲冷哼從身側(cè)響起浸策,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屈糊,沒想到半個月后的榛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琼了,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡逻锐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雕薪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昧诱。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖所袁,靈堂內(nèi)的尸體忽然破棺而出盏档,到底是詐尸還是另有隱情,我是刑警寧澤燥爷,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布蜈亩,位于F島的核電站,受9級特大地震影響前翎,放射性物質(zhì)發(fā)生泄漏稚配。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一港华、第九天 我趴在偏房一處隱蔽的房頂上張望道川。 院中可真熱鬧,春花似錦立宜、人聲如沸冒萄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尊流。三九已至,卻和暖如春灯帮,著一層夾襖步出監(jiān)牢的瞬間崖技,已是汗流浹背蜘澜。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留响疚,地道東北人鄙信。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像忿晕,于是被迫代替她去往敵國和親装诡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容