Как генерируется набор данных объемом 1 ГБ, который используется алгоритмом Ethash?

Я хочу алгоритмически понять, как генерируется набор данных объемом 1 ГБ и как он обновляется на основе данных блока в Ethash. Еще хотелось бы посмотреть, где в коде это реализовано в Go-Etherum. Было бы признательно, если бы ссылка на эту часть кода была прикреплена к ответу.

Ответы (1)

Алгоритм

Алгоритм подробно объясняется с использованием (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 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. Кредит принадлежит Питеру, который на самом деле знает, о чем говорит. :-)

Вот фактический алгоритм, который генерирует кеши проверки и DAG github.com/ethereum/go-ethereum/blob/master/consensus/ethash/…