Inhaltsverzeichnis:

ESP8266 Bitcoin Miner - Gunook
ESP8266 Bitcoin Miner - Gunook

Video: ESP8266 Bitcoin Miner - Gunook

Video: ESP8266 Bitcoin Miner - Gunook
Video: Kiosk mode Bruteforce Evasion with Flipper Zero 2024, November
Anonim
ESP8266 Bitcoin-Miner
ESP8266 Bitcoin-Miner

Da der Preis von Bitcoin weiter steigt und ein paar ESP8266 immer angeschlossen sind, aber nicht wirklich viel tun, dachte ich, warum nicht versuchen, einen Solo Bitcoin Miner zu implementieren. Nach ein wenig Experimentieren habe ich den ESP8266 auf ~1200 Hashes/Sek gebracht und im Dezember 2017 hat das Bitcoin-Netzwerk etwa 12.000.000 Tera-Hashes pro Sekunde durchgeführt (Sie können die Blockchaininfo für die neuesten Zahlen überprüfen).

Basierend auf diesen Zahlen hätten wir also eine 1 zu 1e16-Chance, alle zehn Minuten einen Block erfolgreich abzubauen, wobei ein Block derzeit 212.000 US-Dollar wert ist, aber Sie kennen das alte Sprichwort, jemand muss es gewinnen. Sowohl bei den Gate Mate- als auch bei den Super Squirter ESP8266-Projekten erledigen sie die meiste Zeit keine Arbeit, sie sind nur eingesteckt und warten auf Anfragen oder Eingaben. Warum also nicht sie dazu bringen und vielleicht etwas Münzgeld gewinnen? Der erste Schritt bestand darin, herauszufinden, ob es überhaupt möglich ist, einen doppelten SHA256 auf dem Blockheader auf einem ESP8266 durchzuführen. In der Bitcoin-Welt ist der „Hash“eigentlich ein doppelter SHA256, aber wir werden ihn einfach als Hash bezeichnen. Wie auch immer, nachdem ich ein wenig herumgegoogelt hatte, fand ich diese beiden Seiten, die alle Informationen lieferten, die zum Hashing benötigt werden.

1. Block-Hashing-Algorithmus

2. Bitcoin Mining auf die harte Tour: die Algorithmen, Protokolle und Bytes

Es ist erwähnenswert, dass das Getwork-Protokoll, wie in den obigen Links beschrieben, veraltet ist. Es wurde durch das getblocktemplate-Protokoll ersetzt, wodurch es etwas komplizierter wird, einen Blockheader zu erstellen, insbesondere müssen Sie Ihren eigenen Merkle-Root erstellen. Für alle wichtigen Details schau dir das getblocktemplate-Wiki an.

Schritt 1: Der Algorithmus

Der Algorithmus
Der Algorithmus

Lassen Sie uns gleich loslegen, der ESP8266-Code befindet sich im ESP8266BitcoinMiner GitHub-Repository. Ich werde nicht alle Informationen aus den obigen Links aufarbeiten, sondern nur die wichtigsten Punkte hervorheben.

char header_hex= 0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122bc7f94d41;

char header_hex ist der Blockheader und besteht aus sechs Feldern, Version, hashPrevBlock, hashMerkleRoot, Time, Bits und Nonce, die alle als Little-Endian-Werte in Hex-Notation verkettet sind. Das wurde gerade aus dem obigen Link kopiert, aber in einem echten vollwertigen Miner würden Sie jedes dieser Felder in einem Json-Objekt erhalten und dann die Endianness aussortieren und alle 10 Minuten im Handumdrehen zusammenstellen.

uint8_t* hex_decode(const char *in, size_t len, uint8_t *out){

unsigned int i, mg, ng, rg; für (mg = 0, i = 0; i '9' ? in - 'a' + 10: in - '0'; rg = in[i+1] > '9' ? in[i+1] - 'a' + 10: in[i+1] - '0'; out[mg] = (ng << 4) | rg; } return out; }

hex_decode nimmt den header_hex-String, der hexadezimale ASCII-Zeichen enthält, und füllt die uint8_t-Hashbytes[80] mit ihren jeweiligen Bytewerten bereit für den SHA256-Hasher.

Leere Hash(){

hex_decode(header_hex, strlen(header_hex), Hashbytes); unsigned long start = micros(); hasher.doUpdate(Hashbytes, sizeof(Hashbytes)); Byte-Hash[SHA256_SIZE]; hasher.doFinal(Hash); hashagain.doUpdate(hash, sizeof(hash)); Byte-Hash2[SHA256_SIZE]; hashagain.doFinal(hash2); unsigned long ended = micros(); vorzeichenloses langes Delta = beendet - Start; Serial.println (Delta); Serial.print ("Big Endian:"); für (Byte i = 32; i > 0; i--) { if (hash2 [i-1] < 0x10) {Serial.print ('0'); } Serial.print (hash2[i-1], HEX); } Serial.println(); Serial.print ("Little Endian:"); für (Byte i=0; i <SHA256_SIZE; i++) {if (hash2<0x10) {Serial.print('0'); } Serial.print (hash2, HEX); } }

hash hasht einfach die Hashbytes zweimal (double SHA256), druckt die dafür benötigten us-Sekunden und gibt den resultierenden Hash als Big-Endian und Little-Endian aus. Wenn die Hashes in nur einem SHA256-Hasher verschachtelt wären, wäre es wahrscheinlich etwas schneller, aber mit dem obigen Code dauert es trotzdem 832 ussekunden, um den doppelten Hash durchzuführen, und Sie können aus dem Screenshot sehen, dass wir den richtigen Hash erhalten.

Schritt 2: Auf eine Wand und einen wirklich großen Block treffen

Eine Wand und einen wirklich großen Block treffen
Eine Wand und einen wirklich großen Block treffen

Wenn es also 832 us-Sekunden dauert, um einen Hash zu erstellen, können wir 1/0,000834 = 1201 Hashes / Sek. ausführen.

Um das klarzustellen, haben wir die Informationen aus Block #125552 genommen, wo wir die Nonce kannten, sie wurde bereits abgebaut und diese Informationen als Testfall verwendet, um sicherzustellen, dass wir den gleichen Hash mit dem ESP8266 erhalten. Sobald Sie also einen Gewinn mit einem vollständig ausgearbeiteten Miner haben, würden Sie zufällig die Nonce raten, den Blockheader damit hashen und dann das Ergebnis mit der Schwierigkeit für diesen Block vergleichen. Wenn der Hash die Schwierigkeit erfüllt, wird er dann zur Überprüfung an das Netzwerk gesendet.

Ok, das ist großartig, wir können den Hash durchführen, sicher ist die Rate schrecklich, aber wenn man es als Lotterie betrachtet, ist eine Vermutung eine Vermutung. Hier ist das, aber bei näherer Betrachtung wird schnell klar, dass Sie einen vollständigen Knoten ausführen müssen, um mit dem Netzwerk kommunizieren zu können, was offensichtlich ist, wenn Sie aufhören und darüber nachdenken, was Mining eigentlich ist.

Wenn Sie sich also das Diagramm ansehen, können Sie sehen, dass der Bitcoin-Daemon, der Teil des Bitcoin-Kerns ist, die Kommunikation zwischen dem Netzwerk und dem Miner übernimmt. Das bedeutet wirklich, dass Sie den Bitcoin-Kern auf einem Server ausführen müssen, damit der ESP8266 alle 10 Minuten einen neuen Blockheader erhält und dann wieder an das Netzwerk senden kann.

Ich habe es nicht ausprobiert, aber es sieht so aus, als müsstest du die gesamte Blockchain mit etwa 130 Gigs synchronisieren, bevor sie richtig mit dem Netzwerk kommunizieren würde. Im Wiki wird erwähnt, dass bestimmte Schritte abgeschlossen sein müssen, bevor alle Funktionen verfügbar sind, also ziemlich sicher das meinen sie.

Das hat mich also dorthin gebracht, aus der Sicht der Forschung war alles sehr interessant und es war ziemlich cool zu sehen, wie der kleine ESP8266 den Testfall erfolgreich hashte, aber praktisch gesehen sehe ich nicht viele Leute, die den Kern herunterladen und das gesamte synchronisieren Blockchain, alles auf dem neuesten Stand zu halten, mit Sicherheitsproblemen Schritt zu halten, alles für eine 1 zu 1e16 Chance, den Block zu gewinnen. Eine Brücke zu weit für mich.

Von Anfang an wusste ich, dass die Hash-Rate schrecklich sein würde, aber die Neugier überwältigte mich und ich musste es versuchen. Anstelle von Solo-Mining könnte es einen Mining-Pool geben, der ohne großen Aufwand direkt vom ESP8266 aus verbunden werden kann, oder es könnte eine andere Kryptowährung geben, die besser geeignet ist. Wenn Sie eines finden, lassen Sie es mich bitte wissen.

Schritt 3: Referenzen

1. ESP8266 Bitcoin Miner GitHub-Repository

2. ESP8266 Crypto GitHub-Repository

3. Bitcoin-Mining auf die harte Tour: die Algorithmen, Protokolle und Bytes

4. Block-Hashing-Algorithmus

5. Block 125552

Empfohlen: