Go-Ethereum

Ethash 算法使用的 1GB 數據集是如何生成的?

  • April 25, 2017

我想從算法上了解 1GB 數據集是如何生成的,以及它是如何根據 Ethash 中的塊數據進行更新的。我也想看看,它在 Go-Etherum 中的程式碼中是在哪裡實現的。如果該部分程式碼的連結附有答案,將不勝感激。

算法

該算法在Ethash wiki 頁面上使用(Python)虛擬碼進行了詳細解釋。還有一個相關的設計原理頁面

這些頁面寫得很好,簡潔,應該涵蓋你需要知道的一切,所以我不會在這裡重複它們。(雙關語不是有意的,但我會假裝是。)相反,我將專注於程式碼位置,如下所示。


編碼

程式碼位於儲存庫的consensus/ethash目錄中。go-ethereum

您將感興趣的主要文件是ethash.go. 這裡有幾個名勝古蹟。

執行以下操作:

// New creates a full sized ethash PoW scheme.
func New(cachedir string, cachesinmem, cachesondisk int, dagdir string, dagsinmem, dagsondisk int) *Ethash {

執行以下操作:

// dataset tries to retrieve a mining dataset for the specified block number
// by first checking against a list of in-memory datasets, then against DAGs
// stored on disk, and finally generating one if none can be found.
func (ethash *Ethash) dataset(block uint64) []uint32 {

您可以進一步遵循這個最終函式來呼叫兩者memoryMapAndGenerate()和傳入的generator()函式。


編輯:

將上面的兩個部分實際聯繫在一起的程式碼部分 - 並使我的答案成為實際答案,而不是兩個稍微脫節的段落 - 可以在algorithm.go. 歸功於彼得,他實際上知道他在說什麼。:-)

引用自:https://ethereum.stackexchange.com/questions/15500