Πίνακας περιεχομένων:

ESP8266 Bitcoin Miner: 3 βήματα
ESP8266 Bitcoin Miner: 3 βήματα

Βίντεο: ESP8266 Bitcoin Miner: 3 βήματα

Βίντεο: ESP8266 Bitcoin Miner: 3 βήματα
Βίντεο: МАЙНИНГ НА ESP, PC, ARDUINO БОЛЬШОЙ ГАЙД | Mining in esp, pc, arduino tutorial 2024, Ιούλιος
Anonim
ESP8266 Bitcoin Miner
ESP8266 Bitcoin Miner

Με την τιμή του Bitcoin να συνεχίζει να ανεβαίνει και με ένα ζευγάρι ESP8266 να είναι πάντα συνδεδεμένο, αλλά να μην κάνει πολλά, σκέφτηκα γιατί να μην δοκιμάσω και να εφαρμόσω ένα Solo Bitcoin Miner. Μετά από λίγο πειραματισμό πήρα το ESP8266 έως και 00 1200 hashes/sec και από τον Δεκέμβριο του 2017 το δίκτυο Bitcoin εκτελούσε περίπου 12, 000, 000 tera hashes ανά δευτερόλεπτο (μπορείτε να ελέγξετε το blockchaininfo για τους πιο πρόσφατους αριθμούς).

Με βάση αυτούς τους αριθμούς, θα έχουμε 1 σε 1e16 πιθανότητες επιτυχούς εξόρυξης ενός μπλοκ κάθε δέκα λεπτά, όπου ένα μπλοκ αξίζει σήμερα 212.000 $. Σίγουρα μοιάζει πολύ με την αγορά ενός εισιτηρίου λόττο, μόνο με πολύ πολύ μικρότερες πιθανότητες νίκης, αλλά ξέρετε το παλιό ρητό, κάποιος πρέπει να το κερδίσει. Με τα έργα Gate Mate και Super Squirter ESP8266 τις περισσότερες φορές δεν κάνουν καμία δουλειά, απλώς είναι συνδεδεμένοι και περιμένουν αιτήματα ή εισόδους, οπότε γιατί να μην τα βάλουμε σε αυτό και ίσως κερδίσουμε κάποια νομίσματα. Το πρώτο βήμα ήταν να προσπαθήσουμε να καταλάβουμε εάν ήταν ακόμη δυνατό να εκτελέσουμε ένα διπλό SHA256 στο Blockheader σε ένα ESP8266. Στον κόσμο του Bitcoin, το «hash» είναι στην πραγματικότητα ένα διπλό SHA256, αλλά θα το αναφέρουμε μόνο ως hash. Τέλος πάντων, μετά από λίγο googling, βρήκα αυτές τις δύο σελίδες που παρείχαν όλες τις πληροφορίες που χρειάζονταν για να αποκτήσουν hashing.

1. Αλγόριθμος Block Hashing

2. Εξόρυξη Bitcoin με τον δύσκολο τρόπο: οι αλγόριθμοι, τα πρωτόκολλα και τα byte

Αξίζει να σημειωθεί ότι το πρωτόκολλο getwork, όπως περιγράφεται στους παραπάνω συνδέσμους, έχει καταργηθεί. Έχει αντικατασταθεί με το πρωτόκολλο getblocktemplate που καθιστά λίγο πιο περίπλοκο το χτίσιμο μιας κεφαλίδας μπλοκ, συγκεκριμένα πρέπει να δημιουργήσετε τη δική σας ρίζα merkle. Για όλα τα σπασμωδικά, δείτε το wiki getblocktemplate.

Βήμα 1: Ο αλγόριθμος

Ο Αλγόριθμος
Ο Αλγόριθμος

Ας πάμε αμέσως, ο κωδικός ESP8266 βρίσκεται στο repo του ESP8266BitcoinMiner GitHub. Δεν πρόκειται να επαναλάβω όλες τις πληροφορίες από τους παραπάνω συνδέσμους, αλλά μάλλον να επισημάνω τα κύρια σημεία.

char header_hex = "0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122bc7f5d74df2b9441a42a14695"?

Το char header_hex είναι η κεφαλίδα μπλοκ και είναι χτισμένο από έξι πεδία, Έκδοση, hashPrevBlock, hashMerkleRoot, Time, Bits and the Nonce όλα συνδεδεμένα μεταξύ τους ως μικρές τελικές τιμές σε εξαγωνική σημειογραφία. Αυτό μόλις αντιγράφηκε από τον παραπάνω σύνδεσμο, αλλά σε έναν πραγματικό εξορυκτικό ανθρακωρύχο θα λάβετε κάθε ένα από αυτά τα πεδία σε ένα αντικείμενο json και στη συνέχεια θα πρέπει να τακτοποιήσετε την ενδοτικότητα και να το συνδυάσετε κάθε 10 λεπτά.

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

ανυπόγραφο int i, mg, ng, rg; για (mg = 0, i = 0; i '9'? σε - 'a' + 10: σε - '0'; rg = σε [i + 1]> '9'? σε [i+1] - 'a'+10: σε [i+1] - '0'; έξω [mg] = (ng << 4) | rg;} επιστροφή έξω;}

Το hex_decode παίρνει τη συμβολοσειρά header_hex, η οποία περιέχει δεκαεξαδικούς χαρακτήρες ascii και συμπληρώνει τα hasintbyte uint8_t [80] με τις αντίστοιχες τιμές byte που είναι έτοιμες για το hasher SHA256.

void hash () {

hex_decode (header_hex, strlen (header_hex), hashbytes)? ανυπόγραφο μακρύ ξεκίνημα = micros (); hasher.doUpdate (hashbytes, sizeof (hashbytes)); byte hash [SHA256_SIZE]; hasher.doFinal (κατακερματισμός); hashagain.doUpdate (hash, sizeof (hash)); byte hash2 [SHA256_SIZE]; hashagain.doFinal (hash2); ανυπόγραφο μακρύ άκρο = micros (); ανυπόγραφο μακρύ δέλτα = τελείωσε - εκκίνηση. Serial.println (δέλτα); Serial.print ("Big Endian:"); για (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:"); για (byte i = 0; i <SHA256_SIZE; i ++) {if (hash2 <0x10) {Serial.print ('0'); } Serial.print (hash2 , HEX); }}

Το hash απλώς κατακερματίζει τα hashbytes δύο φορές (διπλό SHA256), εκτυπώνει τα χρήματα που χρειάστηκαν και εκτυπώνει το προκύπτον hash ως μεγάλο endian και μικρό endian. Εάν οι κατακερματισμοί τοποθετήθηκαν σε ένα μόνο SHA256 hasher θα ήταν πιθανότατα λίγο πιο γρήγορος, αλλά ούτως ή άλλως με τον παραπάνω κώδικα χρειάζονται 832 δευτερόλεπτα χρήσης για την εκτέλεση του διπλού κατακερματισμού και μπορείτε να δείτε από το στιγμιότυπο οθόνης παίρνουμε το σωστό hash.

Βήμα 2: Χτύπημα σε έναν τοίχο και ένα πραγματικά μεγάλο μπλοκ

Χτύπημα σε τοίχο και ένα πραγματικά μεγάλο μπλοκ
Χτύπημα σε τοίχο και ένα πραγματικά μεγάλο μπλοκ

Έτσι, αν χρειαστούν 832 δευτερόλεπτα χρήσης για να γίνει ένα hash, μπορούμε να εκτελέσουμε 1 /0.000834 = 1201 hashes /sec.

Για να είμαστε σαφείς, πήραμε τις πληροφορίες από το μπλοκ #125552, όπου γνωρίζαμε το nonce, έχει ήδη εξορυχθεί και χρησιμοποιήσαμε αυτές τις πληροφορίες ως δοκιμαστική υπόθεση για να βεβαιωθούμε ότι θα μπορούσαμε να έχουμε το ίδιο hash με το ESP8266. Έτσι, από τη στιγμή που ένα κέρδος με έναν πλήρως σαρκωμένο ανθρακωρύχο θα λάβατε τυχαία το nonce, κατακερματίσατε το blockheader και στη συνέχεια συγκρίνατε το αποτέλεσμα με τη δυσκολία για αυτό το μπλοκ. Εάν το hash ανταποκρίνεται στη δυσκολία, τότε υποβάλλεται στο δίκτυο για επαλήθευση.

Εντάξει, είναι υπέροχο που μπορούμε να εκτελέσουμε το hash, σίγουρα το ποσοστό είναι απαίσιο, αλλά όταν το βλέπουμε ως λαχείο, μια εικασία είναι μια εικασία. Εδώ είναι το, αλλά, με μια πιο προσεκτική επιθεώρηση, σύντομα γίνεται σαφές ότι πρέπει να τρέχετε έναν πλήρη κόμβο για να μπορείτε να επικοινωνείτε με το δίκτυο, κάπως προφανές όταν σταματάτε και σκέφτεστε τι είναι στην πραγματικότητα η εξόρυξη.

Έτσι, αν κοιτάξετε το διάγραμμα, μπορείτε να δείτε ότι ο δαίμονας bitcoin που είναι μέρος του πυρήνα του bitcoin φροντίζει για την επικοινωνία μεταξύ του δικτύου και του ανθρακωρύχου. Αυτό σημαίνει πραγματικά ότι πρέπει να τρέχετε τον πυρήνα Bitcoin σε διακομιστή, έτσι ώστε το ESP8266 να μπορεί να αποκτήσει ένα νέο blockheader κάθε 10 λεπτά και στη συνέχεια να μπορεί να υποβάλλεται ξανά στο δίκτυο.

Δεν το έχω δοκιμάσει, αλλά φαίνεται ότι θα έπρεπε να συγχρονίσετε ολόκληρο το blockchain σε περίπου 130 Gigs πριν να επικοινωνήσει σωστά με το δίκτυο, στο wiki αναφέρουν ότι πρέπει να ολοκληρωθούν ορισμένα βήματα πριν είναι διαθέσιμη όλη η λειτουργικότητα, οπότε είναι σίγουρο αυτό εννοούν.

Αυτό με τράβηξε εκεί, από την άποψη της έρευνας ήταν πολύ ενδιαφέρον και ήταν πολύ ωραίο να βλέπω το μικρό ESP8266 να έχει επιτυχώς τη δοκιμαστική θήκη, αλλά πρακτικά δεν βλέπω πολλούς ανθρώπους να κατεβάζουν τον πυρήνα, συγχρονίζοντας ολόκληρο blockchain, διατηρώντας τα πάντα ενημερωμένα, συμβαδίζοντας με ζητήματα ασφαλείας όλα για 1 σε 1e16 πιθανότητα να κερδίσετε το μπλοκ. Μια γέφυρα για μακριά για μένα.

Από την πρώτη στιγμή ήξερα ότι το ποσοστό hash θα ήταν τρομερό, αλλά η περιέργεια με κέρδισε και έπρεπε να το κάνω. Αντί για ατομική εξόρυξη, μπορεί να υπάρχει μια πισίνα εξόρυξης εκεί έξω που να μπορεί να συνδεθεί απευθείας από το ESP8266 χωρίς μια μνημειώδη προσπάθεια ή να υπάρχει κάποιο άλλο κρυπτονόμισμα που είναι πιο κατάλληλο. Αν βρείτε οποιοδήποτε, παρακαλώ ενημερώστε με.

Βήμα 3: Αναφορές

1. Αποθετήριο ESP8266 Bitcoin Miner GitHub

2. ESP8266 Crypto GitHub Repository

3. Εξόρυξη Bitcoin με τον δύσκολο τρόπο: οι αλγόριθμοι, τα πρωτόκολλα και τα byte

4. Αλγόριθμος Block Hashing

5. Μπλοκ 125552

Συνιστάται: