Wie wird der 1-GB-Datensatz generiert, der vom Ethash-Algorithmus verwendet wird?

Ich möchte algorithmisch verstehen, wie der 1-GB-Datensatz generiert und basierend auf Blockdaten in Ethash aktualisiert wird. Ich würde auch gerne sehen, wo im Code es in Go-Etherum implementiert ist. Es wäre wünschenswert, wenn der Link für diesen Teil des Codes der Antwort beigefügt wäre.

Antworten (1)

Der Algorithmus

Der Algorithmus wird detailliert unter Verwendung von (Python-)Pseudocode auf der Ethash-Wiki-Seite erklärt . Es gibt auch eine verwandte Design-Rationale-Seite .

Diese Seiten sind schön geschrieben, prägnant und sollten alles abdecken, was Sie wissen müssen, also werde ich sie hier nicht noch einmal aufwärmen. (Wortspiel nicht beabsichtigt, aber ich tue so, als wäre es so.) Stattdessen werde ich mich unten auf die Codestellen konzentrieren.


Der Code

Der Code befindet sich im consensus/ethashVerzeichnis des go-ethereumRepositorys.

Die Hauptdatei, an der Sie interessiert sein werden, ist ethash.go. Hier gibt es mehrere Sehenswürdigkeiten.

Was folgendes bewirkt:

// New creates a full sized ethash PoW scheme.
func New(cachedir string, cachesinmem, cachesondisk int, dagdir string, dagsinmem, dagsondisk int) *Ethash {

Was folgendes bewirkt:

// 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 {

Sie können dieser letzten Funktion weiter folgen, um Aufrufe an beide memoryMapAndGenerate()und die übergebene generator()Funktion durchzuführen.


Bearbeiten:

Und der Teil des Codes, der die beiden obigen Abschnitte tatsächlich miteinander verbindet – und meine Antwort zu einer tatsächlichen Antwort macht, und nicht zu zwei leicht unzusammenhängenden Absätzen – kann in gefunden werden algorithm.go. Lob gebührt Péter, der tatsächlich weiß, wovon er spricht. :-)

Hier ist der eigentliche Algorithmus, der die Verifizierungs-Caches und den DAG generiert github.com/ethereum/go-ethereum/blob/master/consensus/ethash/…