? ? ?本篇我們就看挖礦成功后對區(qū)塊的有效性進(jìn)行檢測的代碼。也就是CheckWork所做的事情幔摸。檢驗之時件舵,線程的優(yōu)先級必須為THREAD_PRIORITY_NORMAL。現(xiàn)在我們就直接看下CheckWork()函數(shù)的代碼邏輯她倘。
通過代碼我們看到在進(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)行了檢測亥曹,我們接著往下看:
我們說一下孤塊的概念和形成原因:
如果節(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ū)塊普通檢測
二。區(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ù)截出來,大家可以更深刻的理解下吴裤。
對版本檢測完成后旧找,下面就開始真正的寫入磁盤了。
到這里基本上一個區(qū)塊挖出來后就已經(jīng)被記錄下來了麦牺,但我們還有一個沒有處理钮蛛,那就是孤鏈池,就是如果有此區(qū)塊的子區(qū)塊剖膳,則可以被鏈記錄了魏颓。所以ProcessBlock()最后的部分就是處理孤鏈池。
這個函數(shù)循環(huán)孤鏈池mapOrphanBlocksByPrev,通過區(qū)塊hash值不斷循環(huán)查找吱晒。然后調(diào)用AsseptBlock()處理所有依賴此區(qū)塊的孤塊甸饱。
到這里基本上一個挖礦的過程就完了,我們基本上了解挖礦的過程仑濒,和挖礦成功后是如何處理最新的交易和區(qū)塊的叹话。最后又是如何進(jìn)行全網(wǎng)廣播的,大家可以在源碼中了解更詳細(xì)的處理墩瞳。
我們?nèi)绻欣斫獠粚Φ牡胤酵蘸瑲g迎大家指正。
作者:區(qū)塊鏈研習(xí)社比特幣源碼研讀班喉酌,black