Innehållsförteckning:

ESP8266 Bitcoin Miner: 3 steg
ESP8266 Bitcoin Miner: 3 steg

Video: ESP8266 Bitcoin Miner: 3 steg

Video: ESP8266 Bitcoin Miner: 3 steg
Video: Сроки окупаемости Arduino в майнинге #mining 2024, Juli
Anonim
ESP8266 Bitcoin Miner
ESP8266 Bitcoin Miner

Med priset på Bitcoin fortsätter att klättra och med ett par ESP8266 alltid anslutna men inte riktigt gör mycket tänkte jag varför inte försöka implementera en Solo Bitcoin Miner. Efter lite experimenterande fick jag ESP8266 upp till ~ 1200 hashar/sek och i december 2017 utförde Bitcoin -nätverket cirka 12 000 000 tera -hashar per sekund (du kan kolla blockchaininfo för de senaste siffrorna).

Så baserat på dessa siffror skulle vi ha en 1 i 1e16 chans att lyckas bryta ett block var tionde minut där ett block för närvarande är värt $ 212 000. Visst är det ungefär som att köpa en lotto, bara med en mycket mycket mindre chans att vinna, men du vet det gamla ordspråket, någon måste vinna det. Med både Gate Mate och Super Squirter ESP8266 -projekt brukar de inte göra något arbete, de är bara inkopplade och väntar på förfrågningar eller ingångar, så varför inte lägga dem till det och kanske vinna lite mynt. Det första steget var att försöka ta reda på om det ens var möjligt att utföra en dubbel SHA256 på Blockheader på en ESP8266. I Bitcoin -världen är "hash" faktiskt en dubbel SHA256, men vi kommer bara att referera till det som hash. Hur som helst efter lite googling hittade jag dessa två sidor som gav all information som behövs för att få hash.

1. Blockera hash -algoritm

2. Bitcoin Mining den hårda vägen: algoritmerna, protokollen och byte

Det är värt att notera att getwork -protokollet, som beskrivs i ovanstående länkar, har utfasats. Det har ersatts med getblocktemplate -protokollet som gör det lite mer komplicerat att bygga ett blockhuvud, specifikt måste du bygga din egen merkle -root. För alla nitty gritty kolla in getblocktemplate wiki.

Steg 1: Algoritmen

Algoritmen
Algoritmen

Låt oss hoppa direkt in, ESP8266 -koden finns på ESP8266BitcoinMiner GitHub -repo. Jag tänker inte repetera all information från ovanstående länkar utan snarare bara markera huvudpunkterna.

char header_hex = 0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0fbfc892b0cbfcfbfbfcfbfcfbfcfbfcfbfbfcfdfbfbfbfbfcfdfbfbfcfdcfdcfdcfdcfdcfdcfdfbfcfcfdcfdcfcfdcfcfcfdcf.

char header_hex är blockhuvudet och är byggt från sex fält, Version, hashPrevBlock, hashMerkleRoot, Time, Bits och Nonce alla sammanfogade tillsammans som små endianvärden i hexnotering. Det kopierades precis från länken ovan, men i en verklig fullfjädrad gruvarbetare skulle du få var och en av dessa fält i ett json -objekt och sedan behöva reda ut slutligheten och sätta ihop den i farten var 10: e minut.

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

osignerad int i, mg, ng, rg; för (mg = 0, i = 0; i '9'? i - 'a' + 10: i - '0'; rg = i [i + 1]> '9'? i [i+1] - 'a'+10: in [i+1] - '0'; ut [mg] = (ng << 4) | rg;} gå ut;}

hex_decode tar header_hex -strängen, som innehåller hexadecimala ascii -tecken, och fyller i uint8_t hashbytes [80] med sina respektive bytevärden redo för SHA256 -hasharen.

ogiltig hash () {

hex_decode (header_hex, strlen (header_hex), hashbytes); osignerad långstart = 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); osignerad lång slut = micros (); osignerat långt delta = slutat - 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 hashar helt enkelt hashbytes två gånger (dubbel SHA256), skriver ut de sekunder det tog och skriver ut den resulterande hashen som en stor endian och liten endian. Om hasharna var kapslade i endast en SHA256 -hasher skulle det förmodligen vara lite snabbare men i alla fall med ovanstående kod tar det 832 sekunder att utföra dubbel hash och du kan se från skärmdumpen att vi får rätt hash.

Steg 2: Slå en vägg och ett riktigt stort block

Att slå en vägg och ett riktigt stort block
Att slå en vägg och ett riktigt stort block

Så om det tar 832 usekunder att göra en hash kan vi utföra 1 /0,000834 = 1201 hash /sek.

För att vara tydlig tog vi informationen från block #125552 där vi kände till nonce, den har redan bryts och använde den informationen som ett testfall för att se till att vi kunde få samma hash med ESP8266. Så en gång en vinst med en fullt utarbetad gruvarbetare skulle du slumpmässigt gissa på nonce, hash blockhead med den och sedan jämföra resultatet med svårigheten för det blocket. Om haschen möter svårigheten skickas den sedan till nätverket för verifiering.

Ok så det är bra att vi kan utföra haschen, visst är takten hemsk, men när man ser det som ett lotteri är en gissning en gissning. Här är det, men vid närmare granskning blir det snart klart att du måste köra en fullständig nod för att kunna kommunicera med nätverket, typ uppenbart när du stannar upp och tänker på vad gruvdrift egentligen är.

Så om du tittar på diagrammet kan du se att bitcoin -demonen som är en del av bitcoin -kärnan tar hand om kommunikationen mellan nätverket och gruvarbetaren. Vad detta verkligen betyder är att du måste köra Bitcoin -kärnan på en server så att ESP8266 kan få ett nytt blockhead varje 10 minuter och sedan kunna skicka tillbaka till nätverket.

Jag har inte provat det men det ser ut som om du skulle behöva synkronisera hela blockchain på cirka 130 spelningar innan det skulle kommunicera korrekt med nätverket, i wiki nämner de att vissa steg måste slutföras innan all funktionalitet är tillgänglig, så ganska säker det är vad de menar.

Så det drog mig upp dit, ur en forskningssynpunkt var det hela väldigt intressant och det var ganska häftigt att se den lilla ESP8266 framgångsrikt hasha testfallet men praktiskt taget ser jag inte att många laddar ner kärnan och synkroniserar hela blockchain, hålla allt uppdaterat, hålla koll på säkerhetsfrågor allt för en 1 i 1e16 chans att vinna blocket. En bro för långt för mig.

Från början så visste jag att hashhastigheten skulle vara fruktansvärd men nyfikenheten fick över mig och jag var tvungen att prova. I stället för solo mining kan det finnas en gruvpool där ute som kan anslutas direkt från ESP8266 utan en monumental ansträngning eller så kan det finnas en annan kryptovaluta som är mer lämplig. Hör av dig om du hittar något.

Steg 3: Referenser

1. ESP8266 Bitcoin Miner GitHub -förvar

2. ESP8266 Crypto GitHub -förvar

3. Bitcoin bryter det hårda sättet: algoritmerna, protokollen och byte

4. Blockera hash -algoritm

5. Block 125552

Rekommenderad: