Sadržaj:

ESP8266 Bitcoin Miner: 3 koraka
ESP8266 Bitcoin Miner: 3 koraka

Video: ESP8266 Bitcoin Miner: 3 koraka

Video: ESP8266 Bitcoin Miner: 3 koraka
Video: Arduino Bitcoin Miner 2024, Novembar
Anonim
ESP8266 Bitcoin rudar
ESP8266 Bitcoin rudar

Budući da je cijena Bitcoina nastavila rasti i s nekoliko ESP8266 uvijek uključenih, ali ne radeći mnogo, pomislila sam zašto ne bih pokušala implementirati Solo Bitcoin Miner. Nakon malo eksperimentiranja, dobio sam ESP8266 do ~ 1200 hash -ova u sekundi, a od prosinca 2017. Bitcoin mreža je izvodila oko 12 000 000 tera hash -ova u sekundi (možete provjeriti blockchaininfo za najnovije brojeve).

Dakle, na osnovu tih brojeva imali bismo 1 u 1e16 šansu za uspješno rudarstvo bloka svakih deset minuta gdje blok trenutno vrijedi 212 000 dolara., ali znate onu staru izreku, neko mora pobijediti. S projektima Gate Mate i Super Squirter ESP8266 većinu vremena ne rade ništa, samo su uključeni i čekaju zahtjeve ili unose, pa zašto ih ne stavite na to i možda osvojite novac. Prvi korak bio je pokušati shvatiti je li uopće moguće izvesti dvostruki SHA256 na Blockheaderu na ESP8266. U svijetu bitcoina 'hash' je zapravo dvostruki SHA256, ali mi ćemo ga nazvati samo hash. U svakom slučaju, nakon malo googlanja, pronašao sam ove dvije stranice koje pružaju sve potrebne podatke za heširanje.

1. Algoritam blokiranja blokova

2. Bitcoin Rudarstvo na teži način: algoritmi, protokoli i bajtovi

Vrijedi napomenuti da je getwork protokol, kako je detaljno opisano u gornjim vezama, zastario. Zamijenjen je protokolom getblocktemplate koji malo komplicira izradu zaglavlja bloka, posebno morate izgraditi vlastiti merkle root. Za sve gluposti provjerite getblocktemplate wiki.

Korak 1: Algoritam

Algoritam
Algoritam

Idemo odmah, kod ESP8266 je na ESP8266BitcoinMiner GitHub repo -u. Neću ponavljati sve informacije sa gornjih linkova, već samo istaknuti glavne stvari.

char header_hex = 0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7ab7c4b7c7b7c7c7c7c7c7c7c8c8c8c8c9aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!

char header_hex je zaglavlje bloka i izgrađeno je od šest polja, Verzija, hashPrevBlock, hashMerkleRoot, Vrijeme, Bitovi i Nonce sve zajedno spojene kao male endijanske vrijednosti u heksadecimalnom zapisu. To je upravo kopirano s gornje veze, ali u stvarnom potpuno razvijenom rudaru primili biste svako od tih polja u json objekt, a zatim morali riješiti endianness i sastaviti ga u hodu svakih 10 minuta.

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

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

hex_decode uzima string_hex header, koji sadrži heksadecimalne ascii znakove, i popunjava hashbajte uint8_t [80] sa njihovim odgovarajućim bajtnim vrijednostima spremnim za SHA256 hasher.

void hash () {

hex_decode (header_hex, strlen (header_hex), hashbytes); nepotpisani dugi start = micros (); hasher.doUpdate (hashbytes, sizeof (hashbytes)); bajt hash [SHA256_SIZE]; hasher.doFinal (hash); hashagain.doUpdate (hash, sizeof (hash)); bajt hash2 [SHA256_SIZE]; hashagain.doFinal (hash2); bez potpisa dugotrajno = micros (); nepotpisana duga delta = završeno - početak; Serial.println (delta); Serial.print ("Big Endian:"); for (bajt 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 (bajt i = 0; i <SHA256_SIZE; i ++) {if (hash2 <0x10) {Serial.print ('0'); } Serial.print (hash2 , HEX); }}

hash jednostavno dva puta hešira hešbajte (dvostruki SHA256), ispisuje potrebne sekunde upotrebe i ispisuje rezultirajući hash kao veliki endian i mali endian. Da su raspršivači ugniježđeni samo u jednom SHA256 hasheru, vjerojatno bi bilo malo brže, ali u svakom slučaju s gornjim kodom potrebno je 832 sekunde za izvođenje dvostrukog raspršivanja, a sa snimka zaslona možete vidjeti da smo dobili ispravan hash.

Korak 2: Udar u zid i zaista veliki blok

Udar u zid i zaista veliki blok
Udar u zid i zaista veliki blok

Dakle, ako je potrebno 832 sekunde upotrebe za jedno raspršivanje, možemo izvesti 1 /0.000834 = 1201 raspršivanje /sek.

Samo da budemo jasni, uzeli smo podatke iz bloka #125552 gdje smo znali da nema pojma, već su minirani i koristili te podatke kao testni slučaj kako bismo bili sigurni da možemo dobiti isti hash s ESP8266. Dakle, jednom kad dobitak dobijete s potpuno razrađenim rudarom, nasumično ćete nagađati u jednom trenutku, raspršiti zaglavlje bloka s njim, a zatim usporediti rezultat s teškoćom tog bloka. Ako raspršivanje naiđe na poteškoće, ono se zatim dostavlja mreži na provjeru.

U redu, to je sjajno što možemo izvesti raspršivanje, naravno da je stopa užasna, ali kada na to gledamo kao na lutriju, pogađanje je nagađanje. Evo, ali nakon pomnijeg pregleda uskoro postaje jasno da morate pokrenuti puni čvor da biste mogli komunicirati s mrežom, što je očito kada se zaustavite i razmislite o tome što je zapravo rudarstvo.

Dakle, ako pogledate dijagram, možete vidjeti da se bitcoin demon koji je dio bitcoin jezgre brine o komunikaciji između mreže i rudara. Ono što ovo zaista znači je da morate pokrenuti Bitcoin jezgru na poslužitelju kako bi ESP8266 mogao dobiti novi blokheader svakih 10 minuta, a zatim se moći vratiti na mrežu.

Nisam probao, ali izgleda da biste morali sinkronizirati cijeli blockchain na oko 130 koncerata prije nego što bi pravilno komunicirao s mrežom, na wikiju spominju da se određeni koraci moraju dovršiti prije nego što sve funkcije budu dostupne, tako da sam prilično siguran to oni misle.

Tako da me to povuklo gore, sa istraživačkog stajališta sve je to bilo vrlo zanimljivo i bilo je super vidjeti malo ESP8266 kako uspješno raspršuje testni slučaj, ali praktično govoreći ne vidim mnogo ljudi koji preuzimaju jezgru, sinkronizirajući cijelu blockchain, ažuriranje svega, praćenje sigurnosnih pitanja za šanse 1 u 1e16 za osvajanje bloka. Za mene je to daleki most.

Od početka sam znao da će brzina raspršivanja biti užasna, ali radoznalost me obuzela i morao sam to pokušati. Umjesto solo rudarstva, tamo bi mogao postojati rudarski bazen koji se može spojiti izravno s ESP8266 bez ogromnih napora, ili bi mogla postojati druga kriptovaluta koja je prikladnija. Ako nađete bilo koji od njih, javite mi.

Korak 3: Reference

1. ESP8266 Bitcoin Miner GitHub spremište

2. ESP8266 Crypto GitHub spremište

3. Bitcoin rudarstvo na teži način: algoritmi, protokoli i bajtovi

4. Algoritam blokiranja blokova

5. Blok 125552

Preporučuje se: