Inhoudsopgave:

ESP8266 Bitcoin-mijnwerker: 3 stappen
ESP8266 Bitcoin-mijnwerker: 3 stappen

Video: ESP8266 Bitcoin-mijnwerker: 3 stappen

Video: ESP8266 Bitcoin-mijnwerker: 3 stappen
Video: CPU Mining Paling Profit Menambang Bamboo BMB Coin 2024, November
Anonim
ESP8266 Bitcoin-mijnwerker
ESP8266 Bitcoin-mijnwerker

Met de prijs van Bitcoin die blijft stijgen en met een paar ESP8266's die altijd zijn aangesloten maar niet echt veel doen, dacht ik waarom niet proberen een Solo Bitcoin Miner te implementeren. Na een beetje experimenteren kreeg ik de ESP8266 tot ~1200 hashes/sec en vanaf december 2017 voerde het Bitcoin-netwerk ongeveer 12.000.000 tera hashes per seconde uit (u kunt blockchaininfo raadplegen voor de laatste cijfers).

Dus op basis van die cijfers zouden we een kans van 1 op 1e16 hebben om elke tien minuten met succes een blok te minen, waar een blok momenteel $ 212.000 waard is. Natuurlijk lijkt het veel op het kopen van een lottokaartje, alleen met een veel veel kleinere kans om te winnen, maar je kent het oude gezegde, iemand moet het winnen. Met zowel de Gate Mate- als de Super Squirter ESP8266-projecten doen ze meestal geen werk, ze zijn gewoon aangesloten en wachten op verzoeken of invoer, dus waarom zou je ze er niet voor inzetten en misschien wat munten winnen. De eerste stap was om uit te zoeken of het zelfs mogelijk was om een dubbele SHA256 uit te voeren op de Blockheader op een ESP8266. In de Bitcoin-wereld is de 'hash' eigenlijk een dubbele SHA256, maar we noemen het gewoon de hash. Hoe dan ook, na een beetje googelen vond ik deze twee pagina's die alle informatie gaven die nodig was om hashing te krijgen.

1. Hashing-algoritme blokkeren

2. Bitcoin Mining op de harde manier: de algoritmen, protocollen en bytes

Het is vermeldenswaard dat het getwork-protocol, zoals beschreven in de bovenstaande links, is verouderd. Het is vervangen door het getblocktemplate-protocol, wat het een beetje ingewikkelder maakt om een block-header te bouwen, met name moet je je eigen merkle-root bouwen. Bekijk voor alle details de getblocktemplate-wiki.

Stap 1: Het algoritme

Het algoritme
Het algoritme

Laten we er meteen in springen, de ESP8266-code bevindt zich in de ESP8266BitcoinMiner GitHub-repo. Ik ga niet alle informatie uit de bovenstaande links herhalen, maar alleen de belangrijkste punten benadrukken.

char header_hex="0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc12274bc7fa"

char header_hex is de blokheader en is opgebouwd uit zes velden, Version, hashPrevBlock, hashMerkleRoot, Time, Bits en de Nonce, allemaal samengevoegd als kleine endian-waarden in hex-notatie. Dat is zojuist gekopieerd van de bovenstaande link, maar in een echte volwaardige mijnwerker zou je elk van die velden in een json-object ontvangen en dan de endianness moeten uitzoeken en elke 10 minuten on-the-fly samenstellen.

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

niet ondertekend 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 neemt de header_hex-tekenreeks, die hexadecimale ascii-tekens bevat, en vult de uint8_t hashbytes [80] met hun respectievelijke bytewaarden, klaar voor de SHA256-hasher.

ongeldige hash(){

hex_decode(header_hex, strlen(header_hex), hashbytes); niet-ondertekende lange 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-end = micros(); unsigned long delta = beëindigd - start; Serieel.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); } Serieel.println(); Serial.print("Little Endian: "); for (byte i=0; i <SHA256_SIZE; i++){ if (hash2<0x10) { Serial.print('0'); } Serial.print(hash2, HEX); } }

hash hasht de hashbytes eenvoudig twee keer (dubbele SHA256), drukt de benodigde useconden af en drukt de resulterende hash af als een big endian en een little endian. Als de hashes in slechts één SHA256-hasher waren genest, zou het waarschijnlijk een beetje sneller zijn, maar hoe dan ook, met de bovenstaande code duurt het 832 useconden om de dubbele hash uit te voeren en je kunt aan de screenshot zien dat we de juiste hash krijgen.

Stap 2: Een muur raken en een heel groot blok

Een muur raken en een heel groot blok
Een muur raken en een heel groot blok

Dus als het 832 useconden kost om één hash uit te voeren, kunnen we 1/0.000834 = 1201 hashes /sec uitvoeren.

Voor de duidelijkheid, we hebben de informatie uit blok #125552 genomen waar we de nonce kenden, het is al gedolven en gebruikten die informatie als een testcase om er zeker van te zijn dat we dezelfde hash konden krijgen met de ESP8266. Dus als je eenmaal winst hebt gemaakt met een volledig uitgewerkte mijnwerker, zou je willekeurig een gok nemen, de blockheader ermee hashen en dan het resultaat vergelijken met de moeilijkheidsgraad voor dat blok. Als de hash aan de moeilijkheid voldoet, wordt deze ter verificatie aan het netwerk voorgelegd.

Oké, dus dat is geweldig, we kunnen de hash uitvoeren, de koers is natuurlijk verschrikkelijk, maar als je het als een loterij bekijkt, is een gok een gok. Dit is de maar, bij nader inzien wordt het al snel duidelijk dat je een volledig knooppunt moet hebben om met het netwerk te kunnen communiceren, een beetje duidelijk als je stopt en nadenkt over wat mijnbouw eigenlijk is.

Dus als je naar het diagram kijkt, kun je zien dat de bitcoin-daemon die deel uitmaakt van de bitcoin-kern, zorgt voor de communicatie tussen het netwerk en de miner. Wat dit echt betekent, is dat je de Bitcoin-kern op een server moet draaien, zodat de ESP8266 elke 10 minuten een nieuwe blockheader kan krijgen en vervolgens weer naar het netwerk kan verzenden.

Ik heb het niet geprobeerd, maar het lijkt erop dat je de hele blockchain op ongeveer 130 Gigs zou moeten synchroniseren voordat het goed zou communiceren met het netwerk, in de wiki vermelden ze dat bepaalde stappen moeten worden voltooid voordat alle functionaliteit beschikbaar is, dus vrij zeker dat is wat ze bedoelen.

Dus dat trok me daarheen, vanuit onderzoeksoogpunt was het allemaal erg interessant en het was best gaaf om te zien hoe de kleine ESP8266 de testcase met succes hasht, maar praktisch gesproken zie ik niet veel mensen de kern downloaden en de hele blockchain, alles up-to-date houden, beveiligingsproblemen bijhouden, allemaal voor een kans van 1 op 1e16 om het blok te winnen. Een brug te ver voor mij.

Vanaf het begin wist ik dat de hash-snelheid verschrikkelijk zou zijn, maar nieuwsgierigheid kreeg de overhand en ik moest het proberen. In plaats van solo-mining is er misschien een mining-pool die direct vanaf de ESP8266 kan worden aangesloten zonder een enorme inspanning of er is misschien een andere cryptocurrency die meer geschikt is. Als je een van beide vindt, laat het me dan weten.

Stap 3: Referenties

1. ESP8266 Bitcoin Miner GitHub-repository

2. ESP8266 Crypto GitHub-repository

3. Bitcoin-mining op de harde manier: de algoritmen, protocollen en bytes

4. Hashing-algoritme blokkeren

5. Blok 125552

Aanbevolen: