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