摘要:接下來(lái)我們將從以下角度介紹礦工角色。我們分別使用礦長(zhǎng)副礦長(zhǎng)礦工進(jìn)行類(lèi)比。副礦長(zhǎng),負(fù)責(zé)具體挖礦工作的安排,把挖礦任務(wù)安排給。礦工的主要函數(shù)介紹和的主要函數(shù),他們是礦工的具體運(yùn)作機(jī)制。負(fù)責(zé)處理外部事件。
前言
礦工在PoW中負(fù)責(zé)了產(chǎn)生區(qū)塊的工作,把一大堆交易交給它,它生成一個(gè)證明自己做了很多工作的區(qū)塊,然后將這個(gè)區(qū)塊加入到本地區(qū)塊鏈并且廣播給其他節(jié)點(diǎn)。
接下來(lái)我們將從以下角度介紹礦工:
角色。礦工不是一個(gè)人,而是一類(lèi)人,可以把這一類(lèi)人分成若干角色。
通過(guò)了解一個(gè)區(qū)塊產(chǎn)生的主要流程,掌握礦工的工作流。
通過(guò)了解礦工的主要函數(shù)介紹,掌握礦工的主要挖礦機(jī)制。
介紹礦工由哪些部分組成,會(huì)和哪些其他模塊進(jìn)行交互,這些部分是如何協(xié)作產(chǎn)生區(qū)塊的。
角色有3種角色:miner、worker、agent。我們分別使用礦長(zhǎng)、副礦長(zhǎng)、礦工進(jìn)行類(lèi)比。
miner:是礦長(zhǎng),負(fù)責(zé)管理整個(gè)礦場(chǎng)的運(yùn)作,比如:?jiǎn)?dòng)、停止挖礦,處理外部請(qǐng)求,設(shè)置挖礦獲得的獎(jiǎng)勵(lì)的錢(qián)包地址等等。
worker:副礦長(zhǎng),負(fù)責(zé)具體挖礦工作的安排,把挖礦任務(wù)(Work)安排給agent。
agent:真實(shí)的礦工,他們負(fù)責(zé)挖礦,把自己的勞動(dòng)成果(Result)交給worker,agent默認(rèn)只有1個(gè),可以通過(guò)API創(chuàng)建多個(gè)。
一個(gè)區(qū)塊產(chǎn)生的主要流程實(shí)際的挖礦過(guò)程基本不涉及miner,只涉及worker、agent和engine,engine是共識(shí)引擎模塊,我們利用下圖介紹生成一個(gè)區(qū)塊的主要流程。
挖礦過(guò)程中只涉及engine的3個(gè)接口:1)Prepare()挖礦前的準(zhǔn)備工作,2)Finalize()形成一個(gè)基本定型的區(qū)塊,3)Seal()形成最終的區(qū)塊。
worker把區(qū)塊頭、交易、交易執(zhí)行的收據(jù)等傳遞給engine.Finalize。
engine.Finalize返回一個(gè)block,該block的header中缺少Nonce和MixDigest,這兩個(gè)值是挖礦獲取的。
worker把block封裝到work,把work發(fā)送給所有的agent。
agent.update把work傳遞給agent.mine。
agent.mine把work傳遞給engine.Seal,調(diào)用engine.Seal挖礦。
engine.Seal把Nonce和MixDigest填到區(qū)塊頭,生成一個(gè)new block交給agent.mine.
agent.mine把new block封裝成Result,發(fā)送給worker。
礦工的主要函數(shù)介紹miner、worker和agent的主要函數(shù),他們是礦工的具體運(yùn)作機(jī)制。
miner的主要函數(shù)主要關(guān)注2個(gè)函數(shù):
New():負(fù)責(zé)創(chuàng)建miner。還創(chuàng)建1個(gè)worker和1個(gè)agent,但agent還可以通過(guò)API創(chuàng)建,然后啟動(dòng)update函數(shù)。
update():負(fù)責(zé)關(guān)注downloader的3個(gè)事件:StartEvent、DoneEvent、FailedEvent。StartEvent是開(kāi)始同步區(qū)塊,必須停止挖礦,DoneEvent和FailedEvent是同步成功或者失敗,是同步的結(jié)束,已經(jīng)可以挖礦了。表明:挖礦和同步區(qū)塊不可同時(shí)進(jìn)行,盡量降低了區(qū)塊沖突的可能。
worker的主要函數(shù)主要是3個(gè)函數(shù):
commitNewWork():負(fù)責(zé)生成work,分配agent。這個(gè)階段做了很多工作,調(diào)用Engine.Prepare進(jìn)行準(zhǔn)備工作,創(chuàng)建Header,執(zhí)行交易,獲取Uncle,使用Engine.Finalize形成“基本定型”的臨時(shí)區(qū)塊,創(chuàng)建Work,最后把work傳遞給agent。另外commitNewWork存在多處調(diào)用,并且worker有wait和update另外2個(gè)協(xié)程,他們都會(huì)調(diào)用commitNewWork,所以存在臨界區(qū)需要謹(jǐn)慎加鎖。
update():負(fù)責(zé)處理外部事件。它是死循環(huán),主要處理3種事件:1)ChainHeadEvent,有了新區(qū)塊頭,所以得切換到挖下一個(gè)高度的區(qū)塊,2)ChainSideEvent,收到了uncle區(qū)塊,緩存起來(lái),3)TxPreEvent,預(yù)處理交易,如果在挖礦執(zhí)行commitNewWork,如果未挖礦,則交易設(shè)置為未決狀態(tài)。
wait():負(fù)責(zé)處理agent挖礦的結(jié)果。它是死循環(huán),一直等待接收agent發(fā)回的result,然后把區(qū)塊加入到本地?cái)?shù)據(jù)庫(kù),如果沒(méi)有問(wèn)題,就發(fā)布NewMinedBlockEvent事件,通告其他節(jié)點(diǎn)挖到了一個(gè)新塊。
agent的主要函數(shù)主要2個(gè)函數(shù):
update():負(fù)責(zé)接收worker發(fā)來(lái)的任務(wù)(work)。它是死循環(huán),把work交給mine去挖礦。
mine():負(fù)責(zé)挖礦。它擁有挖礦的能力,調(diào)用Engine.Seal挖礦,如果挖礦成功則生成result,發(fā)送給worker。
最后兩張圖片來(lái)源網(wǎng)絡(luò),侵刪。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/24398.html
摘要:以太坊中除了基于運(yùn)算能力的外,還有基于權(quán)利證明的共識(shí)機(jī)制,是以太坊的共識(shí)算法的實(shí)現(xiàn),這里主要對(duì)的相關(guān)源碼做一個(gè)解讀分析。檢查包頭中包含的簽名是否滿(mǎn)足共識(shí)協(xié)議 以太坊中除了基于運(yùn)算能力的POW(Ethash)外,還有基于權(quán)利證明的POA共識(shí)機(jī)制,Clique是以太坊的POA共識(shí)算法的實(shí)現(xiàn),這里主要對(duì)POA的Clique相關(guān)源碼做一個(gè)解讀分析。 Clique的初始化在 Ethereum.S...
摘要:下面來(lái)看看具體是怎么實(shí)現(xiàn)接口的可以看到,啟動(dòng)了多個(gè)線(xiàn)程調(diào)用函數(shù),當(dāng)有線(xiàn)程挖到時(shí),會(huì)通過(guò)傳入的通道傳出結(jié)果。可以看到在主要循環(huán)中,不斷遞增的值,調(diào)用函數(shù)計(jì)算上面公式中的左邊,而則是公式的右邊。 前言 挖礦(mine)是指礦工節(jié)點(diǎn)互相競(jìng)爭(zhēng)生成新區(qū)塊以寫(xiě)入整個(gè)區(qū)塊鏈獲得獎(jiǎng)勵(lì)的過(guò)程.共識(shí)(consensus)是指區(qū)塊鏈各個(gè)節(jié)點(diǎn)對(duì)下一個(gè)區(qū)塊的內(nèi)容形成一致的過(guò)程在以太坊中, miner包向外提供挖...
摘要:在中,該隨機(jī)數(shù)稱(chēng)為,它需要滿(mǎn)足一個(gè)公式其中,去除區(qū)塊頭中生成的哈希值,見(jiàn)。固定值,生成的哈希值的最大取值。哈希值滿(mǎn)足條件的概率是,礦工需要進(jìn)行次的判斷,才有可能找到一個(gè)符合條件的,當(dāng)前以太坊難度為。 前言 Ethash實(shí)現(xiàn)了PoW,PoW的精妙在于通過(guò)一個(gè)隨機(jī)數(shù)確定,礦工確實(shí)做了大量的工作,并且是沒(méi)有辦法作弊的。接下來(lái)將介紹: Ethash的挖礦本質(zhì)。 Ethash是如何挖礦的。 如...
摘要:最后,在中采用了一個(gè)的變體作為共識(shí)協(xié)議,擁有更高的吞吐量。知識(shí)點(diǎn),在比特幣改進(jìn)協(xié)議中提出,能夠減少網(wǎng)絡(luò)節(jié)點(diǎn)廣播區(qū)塊所需的帶寬數(shù)量。下面我們來(lái)進(jìn)一步分析這些協(xié)議的安全性功能性和吞吐量。當(dāng)這些安全性假設(shè)被違反,會(huì)為這些協(xié)議帶來(lái)災(zāi)難性的后果。 帶寬實(shí)際上是區(qū)塊鏈吞吐量的最大限制,在美國(guó)舊金山舉辦的 Scaling Bitcoin Meetup 中,Nervos & Cryptape 研究員...
摘要:最后,在中采用了一個(gè)的變體作為共識(shí)協(xié)議,擁有更高的吞吐量。知識(shí)點(diǎn),在比特幣改進(jìn)協(xié)議中提出,能夠減少網(wǎng)絡(luò)節(jié)點(diǎn)廣播區(qū)塊所需的帶寬數(shù)量。 本期秘猿科技區(qū)塊鏈小課堂將會(huì)就 PoW 共識(shí)的突破進(jìn)行展開(kāi)。帶寬實(shí)際上是區(qū)塊鏈吞吐量的最大限制,在美國(guó)舊金山舉辦的 Scaling Bitcoin Meetup 中,秘猿科技研究員張韌從「帶寬利用率」角度分析了諸多共識(shí)協(xié)議的效率和可行性。理解本文需要以下知...
閱讀 1706·2021-11-24 09:39
閱讀 2489·2021-11-18 10:07
閱讀 3668·2021-08-31 09:40
閱讀 3341·2019-08-30 15:44
閱讀 2637·2019-08-30 12:50
閱讀 3658·2019-08-26 17:04
閱讀 1435·2019-08-26 13:49
閱讀 1271·2019-08-23 18:05