Kazalo:

ESP8266 Bitcoin Miner: 3 koraki
ESP8266 Bitcoin Miner: 3 koraki

Video: ESP8266 Bitcoin Miner: 3 koraki

Video: ESP8266 Bitcoin Miner: 3 koraki
Video: CPU Mining Paling Profit Menambang Bamboo BMB Coin 2024, November
Anonim
ESP8266 Bitcoin rudar
ESP8266 Bitcoin rudar

Ker se je cena Bitcoina še naprej dvigovala in z nekaj priključenimi ESP8266, vendar v resnici ne dela veliko, sem pomislil, zakaj ne bi poskusil uvesti Solo Bitcoin Minerja. Po kratkem eksperimentiranju sem dobil ESP8266 do ~ 1200 hash/sec, decembra 2017 pa je omrežje Bitcoin izvajalo okoli 12 000 000 tera hash na sekundo (za najnovejše številke lahko preverite blockchaininfo).

Na podlagi teh številk bi imeli možnost 1 v 1e16, da vsakih deset minut uspešno izkopamo blok, kjer je blok trenutno vreden 212 000 USD. Seveda je podobno nakupu vstopnice za loto, le z veliko manjšo možnostjo za zmago, ampak poznate stari pregovor, nekdo mora zmagati. Pri projektih Gate Mate in Super Squirter ESP8266 večino časa ne opravljajo nobenega dela, samo so priključeni in čakajo na zahteve ali vložke, zakaj jih ne bi dali k temu in morda osvojili nekaj skovank. Prvi korak je bil poskusiti ugotoviti, ali je sploh mogoče izvesti dvojni SHA256 na Blockheaderju na ESP8266. V svetu Bitcoin je "hash" pravzaprav dvojni SHA256, vendar ga bomo imenovali zgolj hash. Kakorkoli že, po malo googlanja sem našel ti dve strani, ki sta vsebovali vse potrebne podatke za zgoščevanje.

1. Algoritem blokiranja blokov

2. Bitcoin Rudarstvo na težji način: algoritmi, protokoli in bajti

Omeniti velja, da je protokol getwork, kot je podrobno opisano v zgornjih povezavah, zastarel. Zamenjal ga je protokol getblocktemplate, zaradi česar je gradnja glave bloka nekoliko bolj zapletena, natančneje morate zgraditi lasten koren merkle. Za vse grdobe poglejte wiki getblocktemplate.

1. korak: Algoritem

Algoritem
Algoritem

Skočimo takoj, koda ESP8266 je na repoju ESP8266BitcoinMiner GitHub. Ne bom ponavljal vseh informacij iz zgornjih povezav, ampak bom poudaril le glavne točke.

char header_hex = 0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7b7c7b7c7b7c7c7c7c7c7c7c8c8c7cbc8cbc8c8cbc8cfbc8cfcb5

char header_hex je glava bloka in je sestavljena iz šestih polj, Version, hashPrevBlock, hashMerkleRoot, Time, Bits in Nonce, ki so med seboj povezane kot majhne vrednosti v šestnajstiškem zapisu. To je bilo pravkar skopirano iz zgornje povezave, vendar bi v dejanskem polnopravnem rudarju prejeli vsako od teh polj v objektu json, nato pa morali razvrstiti endiannost in jo vsakih 10 minut sestaviti skupaj.

uint8_t *šestnajstiška koda (const char *v, size_t len, uint8_t *out) {

brez podpisa int i, mg, ng, rg; za (mg = 0, i = 0; i '9'? v - 'a' + 10: v - '0'; rg = v [i + 1]> '9'? v [i+1] - 'a'+10: in [i+1] - '0'; out [mg] = (ng << 4) | rg;} vrnitev ven;}

hex_decode vzame header_hex niz, ki vsebuje šestnajstiške znake ascii, in naseli hashbajte uint8_t [80] z ustreznimi bajtnimi vrednostmi za razpršilnik SHA256.

void hash () {

hex_decode (head_xx, strlen (header_hex), hashbytes); nepodpisani dolgi začetek = mikroskopi (); hasher.doUpdate (hashbytes, sizeof (hashbytes)); bajtova razpršitev [SHA256_SIZE]; hasher.doFinal (hash); hashagain.doUpdate (hash, sizeof (hash)); bajtni hash2 [SHA256_SIZE]; hashagain.doFinal (hash2); dolgo podpisano brez podpisa = mikroskopi (); nepodpisana dolga delta = končano - začetek; Serial.println (delta); Serial.print ("Big Endian:"); for (bajt i = 32; i> 0; i-) {če (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 preprosto dvakrat zgosti hashbajte (dvojni SHA256), natisne porabljene sekunde in natisne nastalo razpršitev kot velik endian in mali endian. Če bi bili zgoščenki ugnezdeni samo v enem hasherju SHA256, bi bilo to verjetno nekoliko hitreje, a vseeno z zgornjo kodo traja 832 uporabnih sekund za izvedbo dvojnega hasha in iz posnetka zaslona vidite, da dobimo pravilen hash.

2. korak: Udar v zid in res velik blok

Udar v zid in res velik blok
Udar v zid in res velik blok

Če torej za eno razpršitev traja 832 sekund uporabe, lahko izvedemo 1 /0.000834 = 1201 razpršitev /s.

Da bi bilo jasno, smo vzeli podatke iz bloka #125552, kjer smo vedeli, da je nonce, že so minirani in te podatke uporabili kot testni primer, da bi zagotovili, da bi lahko dobili isti hash z ESP8266. Torej, ko dobite s popolnoma izčrpanim rudarjem, naključno ugibate o nonceu, z njim razpršite glavoglavo in nato rezultat primerjate s težavnostjo tega bloka. Če razpršitev naleti na težave, se nato pošlje omrežju v preverjanje.

V redu, tako da lahko izvedemo razpršitev, seveda je stopnja grozna, toda če gledamo na to kot na loterijo, je ugibanje ugibanje. Tukaj je, toda ob natančnejšem pregledu kmalu postane jasno, da morate zagnati polno vozlišče, da lahko komunicirate z omrežjem, kar je očitno, ko se ustavite in razmislite, kaj je rudarstvo pravzaprav.

Če torej pogledate diagram, lahko vidite, da bitcoin demon, ki je del bitcoin jedra, skrbi za komunikacijo med omrežjem in rudarjem. To v resnici pomeni, da morate jedro Bitcoin zagnati na strežniku, tako da lahko ESP8266 vsakih 10 minut dobi novo glavo za blokiranje in se nato lahko predloži nazaj v omrežje.

Nisem poskusil, vendar se zdi, da bi morali sinhronizirati celotno verigo blokov na približno 130 gigov, preden bi pravilno komunicirala z omrežjem, v wikiju omenjajo, da je treba nekatere korake dokončati, preden so na voljo vse funkcije, tako da sem prepričan to pomenijo.

To me je potegnilo tja, z raziskovalnega vidika je bilo vse zelo zanimivo in prav kul je bilo videti, kako je mali ESP8266 uspešno razpršil testni primer, vendar praktično ne vidim veliko ljudi, ki bi nalagali jedro in sinhronizirali celotno blockchain, ohranjanje vsega posodobljenega, spremljanje varnostnih vprašanj za možnost 1 v 1e16 za zmago v bloku. Zame daleč most.

Že od začetka sem vedel, da bi bila stopnja razpršitve grozna, a radovednost me je prevzela in morala sem se potruditi. Namesto samostojnega rudarjenja bi lahko obstajal rudarski bazen, ki ga je mogoče brez ogromnega napora povezati neposredno iz ESP8266, ali pa je morda primernejša druga kriptovaluta. Če najdete katerega, mi prosim sporočite.

3. korak: Reference

1. ESP8266 skladišče Bitcoin Miner GitHub

2. Skladišče ESP8266 Crypto GitHub

3. Rudarjenje bitcoinov na težji način: algoritmi, protokoli in bajti

4. Algoritem blokiranja blokov

5. Blok 125552

Priporočena: