Mining
Dieses Dokument soll es Mining-Pools und Minern erleichtern, Alephium zu integrieren. Es enthält hauptsächlich:
- das Kommunikationsprotokoll zwischen dem Mining-Pool und dem Full Node
- wie der Miner den Blockhash basierend auf den Mining-Jobs berechnet
Hinsichtlich der Implementierung des Kommunikationsprotokolls zwischen Mining-Pool und Minern können Sie sich auf das Stratum-Protokoll hier beziehen. Beachten Sie, dass Mining-Pools das Protokoll nicht genau befolgen. In diesem Dokument werde ich den Code von mining-pool und gpu-miner als Referenz verwenden.
Mining Pool
Der Mining-Pool muss sich mit dem Alephium Full Node verbinden, um Mining-Jobs zu erhalten,
und der Standard-Mining-API-Server ist localhost:10973
.
Der Mining-Pool kommuniziert mit dem Full Node über ein binäres Protokoll, das Format der Nachricht sieht wie folgt aus:
Mining-Jobs vom Full Node erhalten
Jedes Mal, wenn der Full Node einen neuen Block empfängt, sendet er eine Jobs
Nachricht an den Mining-Pool.
Sie können auch das Zeitintervall in der
Mining-Konfiguration
des Full Nodes festlegen, um Jobs
-Nachrichten zu senden, wenn es keine neuen Blöcke gibt.
Da es jetzt 16 Chains in Alephium gibt, wird es in jeder Jobs
-Nachricht 16 Blockvorlagen geben.
Und die Blockvorlage besteht aus den folgenden Feldern:
fromGroup
undtoGroup
: der Chain-Index der Blockvorlage.headerBlob
: die serialisierten binären Daten des BlockHeader, exklusive der ersten 24 Bytes (Nonce).txsBlob
: die serialisierten binären Daten der Transaktionen.targetBlob
: die serialisierten binären Daten des Targets.
Sie können den bereitgestellten Code hier verwenden,
um mehr über das Format der Jobs
-Nachricht und das Parsen der Jobs
-Nachricht zu erfahren.
Sobald der Mining-Pool die Jobs
-Nachricht vom Full Node empfängt, kann er die Mining-Jobs basierend auf ihrer Hashrate an die Miner senden.
Für jede Chain erfordert die Berechnung des Nonce nur die Felder targetBlob
und headerBlob
. Daher kann der Mining-Pool Bandbreite sparen,
indem er das Feld txsBlob
ausschließt, wenn er Mining-Jobs an die Miner sendet. Sie können den bereitgestellten
Code hier verwenden.
Blöcke an den Full Node senden
Sobald der Mining-Pool eine gültige nonce
vom Miner erhält, kann er den Block an den Full Node senden, wobei der Block aus der
nonce
, headerBlob
und txsBlob
besteht. Sie können den bereitgestellten Code hier verwenden.
Dann können Sie den bereitgestellten Code hier verwenden,
um eine gültige SubmitBlock
-Nachricht zu konstruieren und diese Nachricht an den Full Node zu senden.
Nachdem der Full Node den Block überprüft hat, sendet er eine SubmitBlockResult
-Nachricht, um dem Mining-Pool mitzuteilen,
ob der Block gültig ist. Sie können den bereitgestellten Code hier verwenden,
um die SubmitBlockResult
-Nachricht zu parsen.
Miner
Berechnung des Blockhash
In Alephium beträgt die Größe der nonce
24 Bytes, und der Hash des Blocks lautet: blake3(blake3(serialize(blockHeader))
.
Wie zuvor erwähnt, ist blockBlob
in jedem Job die serialisierten binären Daten von BlockHeader
ohne dem Feld nonce
.
Daher muss der Miner beim Berechnen des Blockhash die nonce
vor dem headerBlob
voranstellen. Sie können den bereitgestellten
Code hier und
hier verwenden.
Überprüfen des Chain-Index
Zusätzlich zur Überprüfung des Ziels muss der Miner auch den Chain-Index des Blocks überprüfen, da Alephium den Chain-Index in den Blockhash kodiert. Sie können den bereitgestellten Code hier verwenden, um zu überprüfen, ob der Chain-Index des Blockhash korrekt ist.