Go-Ethereum
Ethash 算法使用的 1GB 數據集是如何生成的?
我想從算法上了解 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()
…執行以下操作:
// 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
. 歸功於彼得,他實際上知道他在說什麼。:-)