Sommario:

ESP8266 Bitcoin Miner: 3 passaggi
ESP8266 Bitcoin Miner: 3 passaggi

Video: ESP8266 Bitcoin Miner: 3 passaggi

Video: ESP8266 Bitcoin Miner: 3 passaggi
Video: MINING DuCo dengan nodemcu esp8266. . 2024, Novembre
Anonim
ESP8266 Minatore di Bitcoin
ESP8266 Minatore di Bitcoin

Con il prezzo di Bitcoin che continua a salire e con un paio di ESP8266 sempre collegati ma senza fare molto, ho pensato perché non provare a implementare un Solo Bitcoin Miner. Dopo un po' di esperimenti ho ottenuto l'ESP8266 fino a ~1200 hash/sec ea dicembre 2017 la rete Bitcoin stava eseguendo circa 12.000.000 tera hash al secondo (puoi controllare blockchaininfo per gli ultimi numeri).

Quindi, sulla base di questi numeri, avremmo una possibilità di 1 su 1e16 di estrarre con successo un blocco ogni dieci minuti in cui un blocco vale attualmente $ 212.000. Certo è molto come comprare un biglietto della lotteria, solo con una possibilità di vincita molto molto più piccola, ma conosci il vecchio detto, qualcuno deve vincerlo. Con entrambi i progetti Gate Mate e Super Squirter ESP8266 la maggior parte delle volte non stanno facendo alcun lavoro, sono semplicemente collegati e in attesa di richieste o input, quindi perché non metterli su e magari vincere qualche moneta. Il primo passo è stato cercare di capire se fosse anche possibile eseguire un doppio SHA256 sul Blockheader su un ESP8266. Nel mondo Bitcoin l'"hash" è in realtà un doppio SHA256, ma lo chiameremo semplicemente hash. Ad ogni modo, dopo aver cercato un po' su Google, ho trovato queste due pagine che fornivano tutte le informazioni necessarie per ottenere l'hashing.

1. Algoritmo di hashing dei blocchi

2. Bitcoin Mining nel modo più duro: algoritmi, protocolli e byte

Vale la pena notare che il protocollo getwork, come dettagliato nei collegamenti sopra, è stato deprecato. È stato sostituito con il protocollo getblocktemplate che rende un po' più complicato creare un'intestazione di blocco, in particolare devi creare la tua merkle root. Per tutto il nocciolo, dai un'occhiata al wiki getblocktemplate.

Passaggio 1: l'algoritmo

L'algoritmo
L'algoritmo

Entriamo subito, il codice ESP8266 si trova nel repository ESP8266BitcoinMiner GitHub. Non ho intenzione di ripassare tutte le informazioni dai link sopra, ma piuttosto evidenzierò solo i punti principali.

char header_hex="0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122d94d94";a2b5f

char header_hex è l'intestazione del blocco ed è costituito da sei campi, Version, hashPrevBlock, hashMerkleRoot, Time, Bits e Nonce, tutti concatenati insieme come valori little endian in notazione esadecimale. Questo è stato appena copiato dal link sopra, ma in un vero e proprio minatore a tutti gli effetti riceveresti ciascuno di quei campi in un oggetto json e quindi dovresti risolvere l'endianness e metterlo insieme al volo ogni 10 minuti.

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

unsigned int i, mg, ng, rg; for (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 prende la stringa header_hex, che contiene caratteri ascii esadecimali, e popola gli hashbytes[80] uint8_t con i rispettivi valori di byte pronti per l'hashing SHA256.

cancelletto vuoto(){

hex_decode(header_hex, strlen(header_hex), hashbytes); inizio lungo senza segno = 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(); delta lungo senza segno = terminato - inizio; Serial.println(delta); Serial.print("Big Endian: "); for (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: "); for (byte i=0; i < SHA256_SIZE; i++){ if (hash2<0x10) { Serial.print('0'); } Serial.print(hash2, HEX); } }

hash esegue semplicemente l'hash degli hashbyte due volte (doppio SHA256), stampa gli ussecondi necessari e stampa l'hash risultante come big endian e little endian. Se gli hash fossero nidificati in un solo hash SHA256, probabilmente sarebbe un po' più veloce, ma comunque con il codice sopra ci vogliono 832 ussecondi per eseguire il doppio hash e puoi vedere dallo screenshot che otteniamo l'hash corretto.

Passaggio 2: colpire un muro e un blocco davvero grande

Colpire un muro e un blocco davvero grande
Colpire un muro e un blocco davvero grande

Quindi, se ci vogliono 832 ussecondi per fare un hash, possiamo eseguire 1/0,000834 = 1201 hash/sec.

Giusto per essere chiari, abbiamo preso le informazioni dal blocco #125552 dove conoscevamo il nonce, è già stato estratto e abbiamo usato quelle informazioni come test per assicurarci di poter ottenere lo stesso hash con ESP8266. Quindi, una volta ottenuto un guadagno con un minatore completamente potenziato, avresti casualmente indovinato il nonce, hash il blockheader con esso e quindi confrontato il risultato con la difficoltà per quel blocco. Se l'hash incontra la difficoltà, viene quindi inviato alla rete per la verifica.

Ok, è fantastico, possiamo eseguire l'hash, certo che il tasso è terribile, ma quando lo guardi come una lotteria, un'ipotesi è un'ipotesi. Ecco il ma, a un'ispezione più attenta, diventa presto chiaro che è necessario eseguire un nodo completo per poter comunicare con la rete, un po' ovvio quando ti fermi e pensi a cosa sia effettivamente il mining.

Quindi se guardi il diagramma puoi vedere che il demone bitcoin che fa parte del core bitcoin si occupa della comunicazione tra la rete e il miner. Ciò significa che è necessario eseguire il core Bitcoin su un server in modo che ESP8266 possa ottenere un nuovo blockheader ogni 10 minuti e quindi essere in grado di inviare nuovamente alla rete.

Non l'ho provato ma sembra che dovresti sincronizzare l'intera blockchain a circa 130 Giga prima che possa comunicare correttamente con la rete, nel wiki menzionano che alcuni passaggi devono essere completati prima che tutte le funzionalità siano disponibili, quindi abbastanza sicuro questo è ciò che significano.

Quindi questo mi ha portato lassù, da un punto di vista della ricerca è stato tutto molto interessante ed è stato piuttosto bello vedere il piccolo ESP8266 eseguire l'hash del test case con successo, ma in pratica non vedo molte persone che scaricano il core, sincronizzando l'intero blockchain, mantenendo tutto aggiornato, tenendo il passo con i problemi di sicurezza tutto per una possibilità 1 su 1e16 di vincere il blocco. Un ponte lontano per me.

Fin dall'inizio sapevo che il tasso di hash sarebbe stato terribile, ma la curiosità ha avuto la meglio su di me e ho dovuto provarci. Piuttosto che il mining da solo, potrebbe esserci un pool di mining che può essere collegato direttamente dall'ESP8266 senza uno sforzo monumentale o potrebbe esserci un'altra criptovaluta più adatta. Se trovi uno dei due per favore fammi sapere.

Passaggio 3: riferimenti

1. ESP8266 Bitcoin Miner Repository GitHub

2. Repository GitHub di crittografia ESP8266

3. Bitcoin mining nel modo più duro: algoritmi, protocolli e byte

4. Algoritmo di hashing dei blocchi

5. Blocco 125552

Consigliato: