在區塊鏈的世界里,以太坊曾以其獨特的“工作量證明”(Proof of Stake, PoW)機制構建了一個龐大而活躍的去中心化網絡,雖然以太坊已于“合并”(The Merge)后正式轉向權益證明,但理解其挖礦源代碼,對于掌握區塊鏈共識機制、加密貨幣底層原理以及網絡安全的歷史演進,依然具有不可替代的價值,本文將帶領讀者深入以太坊挖礦源代碼的內部,探秘礦工們是如何將算力轉化為以太幣的。
以太坊挖礦的核心:Ethash算法
要理解源代碼,首先要理解其背后的算法,與比特幣使用的SHA-256算法不同,以太坊采用的是Ethash算法,Ethash的設計初衷是為了實現“ASIC抗性”,即讓普通用戶也能通過消費級顯卡(GPU)參與挖礦,從而避免算力被少數專用礦機壟斷。
Ethash算法的核心是兩個數據集:

- DAG(Directed Acyclic Graph,有向無環圖):一個巨大的、由算法生成的、只增不減的數據集,隨著以太坊網絡的發展,DAG的體積會越來越大,從最初的數GB增長到今天的超過50GB,DAG存儲在硬盤上,其主要作用是增加內存訪問需求,使得擁有更多顯存的GPU在挖礦中更具優勢。
- Cache(緩存):一個相對較小的數據集,大約在數MB級別,Cache會加載到GPU的高速顯存中,用于生成“挖礦種子”。
挖礦過程簡述如下: 礦工將一個區塊頭數據(包括前一區塊哈希、時間戳、難度等)與一個隨機數結合,進行哈希運算,這個哈希運算需要同時訪問Cache和DAG,如果計算出的哈希值小于一個由當前網絡難度決定的目標值,則挖礦成功,該區塊被廣播到網絡,礦工獲得區塊獎勵和交易手續費。
源代碼的入口:ethash模塊
以太坊的官方客戶端(如Go語言實現的go-ethereum或C 實現的ethereum)都包含了完整的挖礦實現,以go-ethereum(通常稱為Geth)為例,其挖礦的核心邏輯主要集中在ethash和miner兩個模塊中。
我們首先來看ethash模塊,它負責實現Ethash算法本身,關鍵文件路徑通常在core/ethash/目錄下。
-
ethash.go- 算法核心與緩存管理 這個文件是Ethash算法的“心臟”,它定義了Ethash結構體,負責管理Cache和DAG的生命周期,其中最重要的函數是GetHash,它接收一個區塊頭和一個Nonce(隨機數),執行真正的哈希計算。
// GetHash returns the hash of an header's pow block func (ethash *Ethash) GetHash(header *types.Header, nonce uint64) (hash common.Hash) { // ... 將區塊頭和Nonce組合,并調用核心計算函數 ... } -
cache.go- Cache的生成與加載 Cache的生成是計算密集型的,但一旦生成就可以在多個挖礦線程間共享。cache.go中的generateCache函數負責根據當前的“epoch”(每個epoch包含30,000個區塊,約5-7天)生成Cache數據,為了提高效率,它會將Cache緩存起來,避免重復計算。 -
dataset.go- DAG的生成與訪問 DAG比Cache龐大得多,因此它不能全部加載到內存中。dataset.go定義了如何按需生成DAG的各個部分(稱為“full datasets”),當需要訪問DAG的某個部分時,它會根據一個索引計算出該部分的數據,這個過程被稱為“計算DAG節點”。挖礦過程中,GPU驅動程序會通過特定的接口(如OpenCL或CUDA)訪問這些由Go代碼提供的數據生成函數,從而在硬件層面完成海量的并行計算。
挖礦引擎的指揮:miner模塊
如果說ethash模塊是“發動機”,那么miner模塊就是“駕駛員和導航系統”,它負責整個挖礦流程的控制、任務分發和結果驗證,關鍵文件路徑在miner/目錄下。

-
miner.go- 挖礦工作的協調者Miner結構體是挖礦的核心控制器,它負責創建和管理工作線程(worker),接收新區塊頭,并將挖礦任務分發給這些線程,當挖礦成功時,它會驗證結果,并通知共識層將新區塊提交到鏈上。 -
worker.go- 挖礦任務的執行者worker是真正執行循環挖礦的實體,它會從miner那里獲取最新的挖礦任務(包含當前區塊頭),然后在一個無限循環中,不斷地嘗試不同的Nonce值,調用ethash.GetHash進行計算,這個過程被稱為“哈希率競賽”。worker的一個重要功能是哈希率報告,它會定期統計嘗試Nonce的速度,并向外界報告,這也就是我們常說的“算力”(Hash Rate)。 -
cpuminer.go- CPU挖礦的實現 以太坊雖然鼓勵GPU挖礦,但也提供了CPU挖礦的實現。cpuminer.go展示了如何在CPU上執行Ethash算法,雖然效率遠低于GPU,但它對于測試和開發非常有用,這個文件清晰地展示了挖礦算法是如何與硬件解耦的——無論CPU還是GPU,都遵循相同的Ethash規則。
從源碼到現實:礦工軟件的橋梁
直接編譯運行官方客戶端進行挖礦對普通用戶并不友好,市面上出現了如PhoenixMiner、NBMiner、T-Rex等流行的第三方礦工軟件,這些軟件的源代碼雖然不公開,但其工作原理與以太坊官方源碼緊密相關:
- 接口對接:第三方礦工軟件通過以太坊的RPC協議(如
eth_getWork和eth_submitWork)與Geth等全節點通信。eth_getWork:礦工向節點請求一個“挖礦任務”,即一個包含區塊頭、難度和DAG“種子”的數據包。eth_submitWork:當礦工在自己的GPU上通過暴力嘗試找到一個有效的Nonce后,它會將區塊頭、Nonce和結果哈希一起提交給節點,由節點驗證并廣播。
- 硬件優化:這些軟件的核心價值在于對GPU驅動的極致優化,它們使用更高效的匯編指令和內存訪問模式,以榨干每一塊GPU的算力,其性能遠超官方客戶端默認的CPU實現。
源代碼的價值與時代的落幕
盡管以太坊已從PoW轉向PoS,但其挖礦源代碼依然是一座寶貴的知識寶庫,它向我們展示了:
- 密碼學的精妙應用:如何通過哈希函數和復雜數據集構建公平的競爭機制。
- 軟件工程的智慧:如何設計高效、可擴展的并行計算框架。
- 去中心化理念的實踐:如何通過算法設計來抵抗算力中心化的風險。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。



