Golang
在 go-ethereum 中正確使用共識/ethash 模組
傳統上,乙太坊池使用已棄用的Ethash,這對於現代 golang 使用非常不方便,特別是圍繞 Go 模組的使用。Sammy007 的 Open Ethereum Pool和Etherchain.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 長度不應該有任何問題。