Я хочу алгоритмически понять, как генерируется набор данных объемом 1 ГБ и как он обновляется на основе данных блока в Ethash. Еще хотелось бы посмотреть, где в коде это реализовано в Go-Etherum. Было бы признательно, если бы ссылка на эту часть кода была прикреплена к ответу.
Алгоритм
Алгоритм подробно объясняется с использованием (Python) псевдокода на вики-странице Ethash . Также есть связанная страница Design Rationale .
Эти страницы хорошо написаны, лаконичны и должны охватывать все, что вам нужно знать, поэтому я не буду их здесь пересказывать. (Каламбур не предназначен, но я притворюсь, что это так.) Вместо этого я сосредоточусь на расположении кода ниже.
Код
Код находится в 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
. Кредит принадлежит Питеру, который на самом деле знает, о чем говорит. :-)
Питер Силаджи