Obsah:

Bitcoinový miner ESP8266: 3 kroky
Bitcoinový miner ESP8266: 3 kroky

Video: Bitcoinový miner ESP8266: 3 kroky

Video: Bitcoinový miner ESP8266: 3 kroky
Video: Invalid Bitcoin Block Mined? 2024, Júl
Anonim
Bitcoinový miner ESP8266
Bitcoinový miner ESP8266

Vzhľadom na to, že cena bitcoinu stále stúpa a pár ESP8266 je vždy zapojených, ale v skutočnosti nerobí veľa, napadlo ma, prečo neskúsiť a implementovať sólo bitcoinový miner. Po troche experimentovania som dostal ESP8266 až ~ 1200 hash/s a v decembri 2017 sieť Bitcoin vykonávala približne 12 000 000 tera hash za sekundu (najnovšie čísla môžete skontrolovať na blockchaininfo).

Na základe týchto čísel by sme teda mali šancu 1 v 1e16 úspešne vyťažiť blok každých desať minút, kde má blok v súčasnosti hodnotu 212 000 dolárov. Iste, je to veľa ako kúpiť lístok na lotto, ale s oveľa menšou šancou na výhru, ale poznáte staré príslovie, niekto to musí vyhrať. Pri projektoch Gate Mate a Super Squirter ESP8266 väčšinu času nevykonávajú žiadnu prácu, iba sú zapojené a čakajú na požiadavky alebo vstupy, tak prečo ich do toho nezapojiť a možno vyhrať razenie mincí. Prvým krokom bolo pokúsiť sa zistiť, či je vôbec možné vykonať dvojitý SHA256 na Blockheader na ESP8266. Vo svete bitcoinov je „hash“v skutočnosti dvojnásobný SHA256, ale budeme ho označovať iba ako hash. Každopádne, po troche googlenia som našiel tieto dve stránky, ktoré poskytovali všetky informácie potrebné na hašovanie.

1. Algoritmus hashovania blokov

2. Ťažba bitcoinov ťažkou cestou: algoritmy, protokoly a bajty

Stojí za zmienku, že protokol getwork, ako je podrobne popísané vo vyššie uvedených odkazoch, je zastaraný. Bol nahradený protokolom getblocktemplate, čo komplikuje zostavenie hlavičky bloku, konkrétne si musíte vytvoriť vlastný koreň merkle. Všetky odvážne veci nájdete na wiki getblocktemplate.

Krok 1: Algoritmus

Algoritmus
Algoritmus

Vrhnime sa rovno, kód ESP8266 je v repo ESP8266BitcoinMiner GitHub. Nebudem prehodnocovať všetky informácie z vyššie uvedených odkazov, ale iba zdôrazniť hlavné body.

char header_hex = 0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a30800000000000000320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f

char header_hex je záhlavie bloku a je zostavené zo šiestich polí, verzia, hashPrevBlock, hashMerkleRoot, Time, Bits a Nonce, všetky spolu spojené ako malé endiánové hodnoty v hexadecimálnom zápise. To bolo skopírované z vyššie uvedeného odkazu, ale v skutočnom plnohodnotnom baníku by ste každé z týchto polí dostali do objektu json a potom by ste museli vyriešiť endianness a dať ho dohromady za behu každých 10 minút.

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

bez znamienka int i, mg, ng, rg; pre (mg = 0, i = 0; i '9'? v - 'a' + 10: v - '0'; rg = v [i + 1]> '9'? v [i+1] - 'a'+10: v [i+1] - '0'; von [mg] = (ng << 4) | rg;} návrat;}

hex_decode vezme reťazec header_hex, ktorý obsahuje hexadecimálne znaky ascii, a naplní uint8_t hashbytes [80] s ich príslušnými bajtovými hodnotami pripravenými pre hash SHA256.

neplatný hash () {

hex_decode (header_hex, strlen (header_hex), hashbytes); nepodpísaný dlhý štart = mikro (); hasher.doUpdate (hashbytes, sizeof (hashbytes)); hash bajtov [SHA256_SIZE]; hasher.doFinal (hash); hashagain.doUpdate (hash, sizeof (hash)); bajt hash2 [SHA256_SIZE]; hashagain.doFinal (hash2); bez znamienka, dlhé konce = mikro (); nepodpísaná dlhá delta = ukončená - štart; 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 jednoducho dvakrát zahašuje bajty hash (dvojnásobok SHA256), vytlačí potrebné doby použitia a vytlačí výsledný hash ako veľký endian a malý endian. Ak by boli hashe vnorené iba do jedného hasha SHA256, bolo by to pravdepodobne o niečo rýchlejšie, ale napriek tomu s vyššie uvedeným kódom trvá 832 sekúnd na vykonanie dvojitého hashovania a zo snímky obrazovky vidíte, že získame správny hash.

Krok 2: Náraz na stenu a skutočne veľký blok

Náraz na stenu a skutočne veľký blok
Náraz na stenu a skutočne veľký blok

Ak teda na jeden hash trvá 832 použití, môžeme vykonať 1 /0,000834 = 1201 hash /s.

Aby bolo jasné, vzali sme informácie z bloku #125552, kde sme poznali nonce, už boli vyťažené a použili sme ich ako testovací prípad, aby sme sa uistili, že s ESP8266 môžeme získať rovnaký hash. Takže akonáhle získate s plne rozvinutým baníkom, náhodne by ste uhádli nonce, hasli s ním blockheader a potom porovnali výsledok s náročnosťou daného bloku. Ak hash spĺňa ťažkosti, potom sa odošle do siete na overenie.

Dobre, takže je skvelé, že môžeme hashovať, určite je tá sadzba strašná, ale keď sa na to pozeráme ako na lotériu, hádanie je hádanie. Tu je to, ale pri bližšom skúmaní čoskoro vyjde najavo, že musíte používať celý uzol, aby ste mohli komunikovať so sieťou, čo je zrejmé, keď sa zastavíte a zamyslíte sa nad tým, čo vlastne ťažba je.

Ak sa teda pozriete na diagram, môžete vidieť, že bitcoinový démon, ktorý je súčasťou jadra bitcoinu, sa stará o komunikáciu medzi sieťou a minerom. Čo to skutočne znamená, je potrebné spustiť bitcoinové jadro na serveri, aby ESP8266 mohol každých 10 minút získať nový záhlavie a potom sa mohol odoslať späť do siete.

Neskúšal som to, ale vyzerá to tak, že skôr, ako bude správne komunikovať so sieťou, budete musieť synchronizovať celý blockchain na približne 130 gigoch, vo wiki uvádzajú, že niektoré kroky je potrebné dokončiť skôr, ako budú k dispozícii všetky funkcie, takže celkom určite. to majú na mysli.

Takže to ma ťahalo tam hore, z výskumného hľadiska to bolo všetko veľmi zaujímavé a bolo celkom v pohode vidieť, ako malý ESP8266 úspešne hashuje testovací prípad, ale prakticky nevidím veľa ľudí, ktorí sťahujú jadro a synchronizujú celý blockchain, udržiavanie všetkého aktuálneho, dodržiavanie bezpečnostných problémov - šanca vyhrať blok 1: 1e16. Pre mňa most ďaleko.

Od začiatku som vedel, že miera hashovania bude strašná, ale zvedavosť ma premohla a musel som to skúsiť. Namiesto sólo ťažby môže existovať banský fond, ku ktorému sa dá pripojiť priamo z ESP8266 bez monumentálneho úsilia, alebo môže existovať iná kryptomena, ktorá je vhodnejšia. Ak nájdete niektorý z nich, dajte mi prosím vedieť.

Krok 3: Referencie

1. Úložisko ESP8266 Bitcoin Miner GitHub

2. Úložisko ESP8266 Crypto GitHub

3. Ťažba bitcoinov ťažkou cestou: algoritmy, protokoly a bajty

4. Algoritmus hashovania blokov

5. Blok 125552

Odporúča: