Golang

在 go-ethereum 中正確使用共識/ethash 模組

  • June 30, 2021

傳統上,乙太坊池使用已棄用的Ethash,這對於現代 golang 使用非常不方便,特別是圍繞 Go 模組的使用。Sammy007 的 Open Ethereum PoolEtherchain.org 的 example pool就是這方面的例子。

話雖如此,這些都是四五年前的。現在建議在主要Geth 儲存庫consensus/ethash中使用該模組,如此處所指定。

那麼作為一個想要運營高性能礦池的礦池運營商,如何在consensus/ethash不浪費大量 I/O 的情況下使用該模組呢?我看到的主要不便之處是該VerifyHeader功能取代了舊的“驗證”功能,但它依賴於該ChainHeaderReader功能。

撇開必須在對像中包裝相應的 RPC 呼叫或記憶體塊數據(以避免 I/O),我看到的真正問題是您只能根據網路難度來驗證塊(即沒有根據池的難度而不是網路難度來檢查區塊的好方法)。

然後絕對有可能創建一些 hacky實現,允許您向從這裡的函式ChainHeaderReader返回的 Parent 注入一個虛假的難度,但這似乎是在跳過箍以使用現代版本的 Ethash(作為一個池操作員)。關於如何做到這一點,我有什麼遺漏嗎?GetHeader

我找到了這個替代實現etclabscore/go-etchash。我不確定性能,但它似乎符合要求(沒有 go modules 問題和沒有cgo),並且由於 Ethash 和 Etchash 之間的唯一區別是epoch 長度不應該有任何問題。

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