Cuprins:

ESP8266 Bitcoin Miner: 3 pași
ESP8266 Bitcoin Miner: 3 pași

Video: ESP8266 Bitcoin Miner: 3 pași

Video: ESP8266 Bitcoin Miner: 3 pași
Video: Arduino Bitcoin Miner 2024, Noiembrie
Anonim
ESP8266 Bitcoin Miner
ESP8266 Bitcoin Miner

Având în vedere că prețul Bitcoin continuă să crească și cu câteva ESP8266 conectate întotdeauna, dar nu prea fac multe, m-am gândit de ce să nu încerc să implementez un Solo Bitcoin Miner. După un pic de experimentare, am primit ESP8266 până la ~ 1200 hash / sec și, din decembrie 2017, rețeaua Bitcoin funcționa în jur de 12, 000, 000 tera hash pe secundă (puteți verifica blockchaininfo pentru ultimele numere).

Deci, pe baza acestor numere, am avea o șansă de 1 la 1e16 să extragem cu succes un bloc la fiecare zece minute, în cazul în care un bloc valorează în prezent 212 000 USD., dar știi vechea zicală, cineva trebuie să o câștige. Atât cu proiectele Gate Mate, cât și cu Super Squirter ESP8266, de cele mai multe ori nu fac nici o treabă, sunt doar conectate și așteaptă cererile sau intrările, așa că de ce să nu le puneți și poate câștiga niște monede. Primul pas a fost să încercăm să ne dăm seama dacă era chiar posibil să realizăm un SHA256 dublu pe Blockheader pe un ESP8266. În lumea Bitcoin, „hash” este de fapt un SHA256 dublu, dar ne vom referi doar la acesta ca hash. Oricum, după un pic de căutare, am găsit aceste două pagini care furnizau toate informațiile necesare pentru a obține hashing.

1. Blocați algoritmul Hashing

2. Bitcoin Mining în mod greu: algoritmii, protocoalele și octeții

Este demn de remarcat faptul că protocolul getwork, așa cum este detaliat în linkurile de mai sus, a fost învechit. A fost înlocuit cu protocolul getblocktemplate, ceea ce face un pic mai complicată construirea unui antet de bloc, în special trebuie să vă construiți propria rădăcină merkle. Pentru toți aceia care sunt înrăiți, consultați getblocktemplate wiki.

Pasul 1: Algoritmul

Algoritmul
Algoritmul

Să intrăm direct, codul ESP8266 se află la repo GitHub ESP8266BitcoinMiner. Nu am să refac toate informațiile de pe linkurile de mai sus, ci mai degrabă să evidențiez principalele puncte.

char header_hex = "0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122bc7f5d74df2b9441a42a14695";

char header_hex este antetul blocului și este construit din șase câmpuri, Versiune, hashPrevBlock, hashMerkleRoot, Time, Bits și Nonce toate concatenate împreună ca mici valori endian în notație hexagonală. Aceasta a fost doar copiată de pe linkul de mai sus, dar într-un miner cu drepturi depline, ați primi fiecare dintre acele câmpuri într-un obiect JSON și apoi ar trebui să sortați endianitatea și să le puneți împreună din mers la fiecare 10 minute.

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

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

hex_decode preia șirul header_hex, care conține caractere ascii hexazecimale și populează hashbytes uint8_t [80] cu valorile lor de octeți respectivi gata pentru hasher-ul SHA256.

void hash () {

hex_decode (header_hex, strlen (header_hex), hashbytes); start fără semnare lungă = micros (); hasher.doUpdate (hashbytes, sizeof (hashbytes)); octet hash [SHA256_SIZE]; hasher.doFinal (hash); hashagain.doUpdate (hash, sizeof (hash)); octet hash2 [SHA256_SIZE]; hashagain.doFinal (hash2); unsigned long ended = micros (); unsigned long delta = încheiat - start; Serial.println (delta); Serial.print ("Big Endian:"); for (octet i = 32; i> 0; i -) {if (hash2 [i-1] <0x10) {Serial.print ('0'); } Serial.print (hash2 [i-1], HEX); } Serial.println (); Serial.print ("Micul Endian:"); for (octet i = 0; i <SHA256_SIZE; i ++) {if (hash2 <0x10) {Serial.print ('0'); } Serial.print (hash2 , HEX); }}

hash pur și simplu hashbyte de două ori (SHA256 dublu), tipărește secunde de utilizare și imprimă hash-ul rezultat ca un endian mare și un endian mic. Dacă hashurile ar fi cuibărite într-un singur hasher SHA256, ar fi probabil puțin mai rapid, dar oricum cu codul de mai sus este nevoie de 832 secunde pentru a efectua hash-ul dublu și puteți vedea din captura de ecran obținem hash-ul corect.

Pasul 2: Lovirea unui perete și a unui bloc cu adevărat mare

Lovirea unui zid și a unui bloc cu adevărat mare
Lovirea unui zid și a unui bloc cu adevărat mare

Deci, dacă este nevoie de 832 de secunde pentru a face un hash, putem efectua 1 / 0.000834 = 1201 hash / sec.

Pentru a fi clar, am luat informațiile din blocul # 125552, unde știam nonce, au fost deja exploatate și am folosit acele informații ca caz de testare pentru a ne asigura că putem obține același hash cu ESP8266. Deci, odată ce ați câștigat cu un miner complet complet, ați presupune în mod aleatoriu o ghicire la nonce, ați hash-ul cu antetul și apoi ați comparat rezultatul cu dificultatea pentru acel bloc. Dacă hashul întâmpină dificultatea, acesta este apoi trimis rețelei pentru verificare.

Ok, așa că este minunat că putem efectua hash, sigur că rata este groaznică, dar când o privim ca o loterie, o presupunere este o presupunere. Iată, dar, la o inspecție mai atentă, devine curând clar că trebuie să rulați un nod complet pentru a putea comunica cu rețeaua, un fel de evident atunci când vă opriți și vă gândiți la ce este mineria de fapt.

Deci, dacă vă uitați la diagramă, puteți vedea că demonul bitcoin care face parte din nucleul bitcoin se ocupă de comunicarea dintre rețea și miner. Ceea ce înseamnă cu adevărat acest lucru este că trebuie să rulați nucleul Bitcoin pe un server, astfel încât ESP8266 să poată obține un nou blockheader la fiecare 10 minute și apoi să poată fi trimis înapoi la rețea.

Nu l-am încercat, dar se pare că ar trebui să sincronizați întregul blockchain la aproximativ 130 de concerte înainte ca acesta să comunice corect cu rețeaua, în wiki menționând că trebuie parcurși anumiți pași înainte ca toate funcționalitățile să fie disponibile, deci destul de sigur asta înseamnă.

Așa că asta m-a atras acolo, din punct de vedere al cercetării, a fost foarte interesant și a fost destul de mișto să văd că micul ESP8266 hash cu succes cazul testului, dar practic vorbind, nu văd mulți oameni care descarcă nucleul, sincronizând întregul blockchain, ținând totul la curent, ținând pasul cu problemele de securitate, toate pentru o șansă 1 la 1e16 de a câștiga blocul. Un pod până departe pentru mine.

De la început, am știut că rata hash-ului va fi teribilă, dar curiozitatea a fost mai bună decât mine și a trebuit să încerc. Mai degrabă decât exploatarea individuală, ar putea exista un bazin de exploatare care poate fi conectat direct de la ESP8266 fără un efort monumental sau ar putea exista o altă criptomonedă care este mai potrivită. Dacă găsiți oricare, vă rugăm să ne anunțați.

Pasul 3: Referințe

1. ESP8266 Bitcoin Miner GitHub Repository

2. Depozit ESP8266 Crypto GitHub

3. Extragerea Bitcoin în mod dificil: algoritmi, protocoale și octeți

4. Blocați algoritmul Hashing

5. Blocul 125552

Recomandat: