天天看點

[區塊鍊從原理到實作]- 以太坊挖礦原理及實作

[區塊鍊從原理到實作]-索引

[區塊鍊從原理到實作]- 以太坊挖礦原理及實作

本文章主要介紹了以太坊區塊鍊的挖礦流程.

分為以下幾個部分說明:

  • 什麼是挖礦
  • 靜态代碼分析
  • 挖礦流程分析

什麼是挖礦

以太坊的挖礦類似于現實生活中在金礦的礦山上挖礦.

現實生活中在礦山中挖金礦有幾個角色可以與以太坊區塊鍊的挖礦過程很好的對應.

  • 以太坊區塊鍊 : 鍊就是一個金礦,裡面有多少金子是由以太坊的源代碼來定義的.
  • 區塊 : 區塊對應現實中從金礦挖出來的金子(每挖出一個區塊,挖出區塊的節點都會有一定的獎勵,正是因為這個獎勵才促使大家都參與到挖礦的行為中來.)
  • 礦工 : 參與以太坊網絡挖礦的節點稱為礦工.礦工通過執行"挖礦"這一動作使得以太坊持續不斷的産生新的區塊,每個區塊包含在一段時間内的交易.區塊不斷的被挖掘并被所有節點确認,進而保證了以太坊網絡的交易被确認并上鍊.
  • 挖礦 : 所謂挖礦即節點利用自己的算力,通過計算産生區塊的過程.目前的以太坊公網采用的共識機制為POW(Proof Of Work)工作量證明機制,節點使用這個機制産生區塊的過程叫做"挖礦"非常形象,因為在PoW的過程中,節點并沒有與其他節點協商,而隻是單純的憑借自己的算力計算出符合标準的數值,一旦算出的結果符合标準那麼就說這個節點挖出了一個塊.
  • 共識算法 : 節點間達成協商一緻的一種分布式算法,目前除了PoW還有其他共識機制,例如:PBFT/IBFT(拜占庭容錯算法),PoS(Proof Of Stack)權益證明,DPOS(Delegated Proof Of Stack)股份授權證明,PoA(Proof of Authority)權威證明,POB(Proof Of Burn)等等各種共識算法,這些共識算法的側重點不同,都是為了解決各自領域的問題,通過一定的手段達成節點間的共識.後續文章會對目前流行的共識算法做說明總結.

靜态代碼分析

挖礦相關的代碼都在miner檔案夾下.

[區塊鍊從原理到實作]- 以太坊挖礦原理及實作
  • agent.go: agent代碼實作,agent對象負責與共識子產品互動.
  • miner.go: miner對象控制挖礦過程的開始,結束及參數轉換等.
  • remote_agent.go: 沒有深入分析,remote_agent繼承了agent.
  • unconfirmed.go: unconfirmed子產品負責存儲已經上鍊但是未經過後續6個塊确認的塊,從代碼中來看,unconfirmed子產品影響挖礦即出塊過程,其代碼邏輯隻負責日志輸出,用于提醒使用者.
  • worker.go: worker對象也是挖礦過程中的重要對象,其負責與agent互動,負責給agent提供生成塊需要的原始資料,然後接收agent傳回來的已經經過共識,可以上鍊的塊.

    共識協定相關代碼如下,後續專門文章分析各種共識算法的實作:

    [區塊鍊從原理到實作]- 以太坊挖礦原理及實作
  • clique: ethereum的POA實作.
  • ethash: ethereum的POW實作.
  • istanbul: 此為wanchain鍊新添加的IBFT(PBFT)共識實作,在ethereum不包括此檔案夾.
  • misc: 未關注.
  • consensus.go: 共識接口定義.
  • errors.go: 共識相關error定義.
  • protocol.go: protocol接口實作.

挖礦流程分析

以太坊挖礦整體流程如下圖所示:

[區塊鍊從原理到實作]- 以太坊挖礦原理及實作

下面按照流程圖說明以太坊挖礦的過程:

  • 運作以太坊用戶端程式geth(或者運作wanchain的gwan),啟動節點.
  • 調用eth.New()函數建立ethereum對象.
  • eth的New()函數調用函數CreateConsensusEngine()建立共識算法引擎.
    • 如何确定需要使用哪種共識算法引擎? (後續确認)
  • 共識算法引擎建立完成之後eth.New()接着調用函數miner.New()建立miner對象,miner對象負責控制挖礦的過程,與其他子產品互動,控制挖礦過程的啟動及停止等.
  • 在miner.New()函數中調用newWorker()函數建立了一個worker對象,然後調用NewCpuAgent()函數建立了一個cpuAgent對象.其中worker負責給cpuAgent發送出塊需要的資料,cpuAgent才是實際與共識引擎互動負責出塊的對象,在其内部調用共識引擎的各種接口來出塊,最終cpuAgent把産生的新塊傳回給worker對象,然後worker對象發送新塊上鍊的通知并同時向它的peer廣播新塊消息.
  • worker對象建立之後會建立一個協程go worker.wait(),此協程負責接收cpuAgent傳回給worker的新塊,進行新塊的處理同時調用commitNewWork()函數發送新的出塊請求給cpuAgent對象.
  • cpuAgent對象建立之後會建立一個協程go self.update(),此協程負責接收從worker對象發送過來的出塊請求,cpuAgent()對象收到新的出塊請求之後建立一個協程go self.mine()用于對新區塊進行挖掘(對每個新區塊的出塊請求都會新建立一個協程來執行出塊的動作.)
  • worker對象有一個recv通道,用于從cpuAgent接收挖礦的傳回結果;cpuAgent的通道workCh用于從worker對象接收發送過來的用于出塊的原始資料,cpuAgent的returnCh指針在cpuAgent建立之後會被指派為worker對象的recv通道,這樣worker和cpuAgent的互動通道就關聯了起來:worker把原始資料發送給cpuAgent的workCh通道,cpuAgent把出塊結果放到worker的recv通道傳回給worker對象.
  • 圖示中藍色的箭頭表示代碼的靜态流程,即個對象的建立邏輯.
  • 圖示中黃色的箭頭表示消息流向,黃色和藍色箭頭結合起來後挖礦流程就形成了一個閉環.
  • 紫色箭頭關聯的邏輯為挖礦的開始流程,執行miner.start()開始挖礦, cpuAgent在miner.start()之後才開始監聽workCh通道,等待接收組裝區塊的原始資料的.

總結

上述部分分析了以太坊挖礦的原理及實作. 在本部分的挖礦流程示意圖中共識機制部分隻涉及到了共識的接口,并沒有對各種共識内部進行深入分析.在後續章節會多各種共識機制的原理及流程進行詳細分析.

---- END ----

繼續閱讀