תוכן עניינים:

ESP8266 Bitcoin Miner: 3 שלבים
ESP8266 Bitcoin Miner: 3 שלבים

וִידֵאוֹ: ESP8266 Bitcoin Miner: 3 שלבים

וִידֵאוֹ: ESP8266 Bitcoin Miner: 3 שלבים
וִידֵאוֹ: Обновление сервера Chia Farming — возвращение второго процессора 2024, נוֹבֶמבֶּר
Anonim
ESP8266 Bitcoin Miner
ESP8266 Bitcoin Miner

כשהמחיר של ביטקוין ממשיך לטפס ועם כמה ESP8266 תמיד מחובר אבל לא ממש עושה הרבה חשבתי למה לא לנסות וליישם סולו ביטקון כורה. לאחר קצת ניסיונות קיבלתי את ה- ESP8266 עד ~ 1200 hashes/sec ונכון לדצמבר 2017 רשת הביטקוין ביצעה בסביבות 12, 000, 000 hasa tera בשנייה (אתה יכול לבדוק את המידע של blockchain לגבי המספרים האחרונים).

אז בהתבסס על המספרים האלה יהיה לנו סיכוי של 1 ל 1e16 לכרות בהצלחה בלוק כל עשר דקות, כשגוש שווה כרגע 212 אלף דולר. אין ספק שזה דומה לרכישת כרטיס לוטו, רק עם סיכוי קטן בהרבה לזכות, אבל אתה מכיר את האמרה הישנה, מישהו צריך לזכות בה. עם פרוייקטים של Gate Mate ו- Super Squirter ESP8266 רוב הזמן הם לא מבצעים שום עבודה, הם פשוט מחוברים לחשמל ומחכים לבקשות או תשומות, אז למה שלא תשימו אותם ואולי תזכו במטבעות. השלב הראשון היה לנסות ולברר אם אפשר בכלל לבצע SHA256 כפול על Blockhead על ESP8266. בעולם הביטקוין ה'חשיש 'הוא למעשה SHA256 כפול, אבל רק נתייחס לזה כאל החשיש. בכל מקרה אחרי קצת חיפוש בגוגל מצאתי את שני הדפים האלה שסיפקו את כל המידע הדרוש כדי להשיג hashing.

1. חסימת אלגוריתם חשיש

2. ביטקוין כריית הדרך הקשה: האלגוריתמים, הפרוטוקולים והבייטים

ראוי לציין כי פרוטוקול getwork, כמפורט בקישורים לעיל, הוצא משימוש. הוא הוחלף בפרוטוקול getblocktemplate מה שהופך אותו קצת יותר מסובך לבנות כותרת בלוק, במיוחד עליך לבנות שורש מרקלי משלך. לכל הגרועים, בדוק את ויקי getblocktemplate.

שלב 1: האלגוריתם

האלגוריתם
האלגוריתם

בואו נקפוץ ישר, קוד ESP8266 נמצא במאגר ESP8266BitcoinMiner GitHub. אני לא מתכוון לערוך מחדש את כל המידע מהקישורים לעיל אלא רק להדגיש את הנקודות העיקריות.

char header_hex = 0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0fbfc8892b0fbfc892b0cbfbfcfbfbfcfbfbfbfbfcfbfbfbfbfbfcfbfcfbfcfdcfcfcbcdcfcbcbcbcbfcfdcfcfdcfdcfcfdcfcfdcfcfcfdcbcf

char header_hex הוא כותרת החסימה והוא בנוי משישה שדות, Version, hashPrevBlock, hashMerkleRoot, Time, Bits וה- Nonce כולם משולבים יחד כערכי אנדיאן קטנים בסימון hex. זה פשוט הועתק מהקישור שלמעלה, אבל בכורה ממש מלא היית מקבל כל אחד מהשדות האלה באובייקט 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 הקסדצימליים, ומאכלס את hashbytes uint8_t [80] עם ערכי הבייט המתאימים שלהם ל- hasher SHA256.

hash hash () {

hex_decode (header_hex, strlen (header_hex), hashbytes); התחלה ארוכה ללא סימן = micros (); hasher.doUpdate (hashbytes, sizeof (hashbytes)); חבטת בתים [SHA256_SIZE]; hasher.doFinal (חשיש); hashagain.doUpdate (hash, sizeof (hash)); בייט hash2 [SHA256_SIZE]; hashagain.doFinal (hash2); סימן ארוך לא חתום = micros (); דלתא ארוכה ללא סימן = הסתיימה - התחלה; Serial.println (דלתא); Serial.print ("אנדיאן גדול:"); עבור (בת i = 32; i> 0; i-) {if (hash2 [i-1] <0x10) {Serial.print ('0'); } Serial.print (hash2 [i-1], HEX); } Serial.println (); Serial.print ("אנדיאן הקטן:"); עבור (בתים i = 0; i <SHA256_SIZE; i ++) {if (hash2 <0x10) {Serial.print ('0'); } Serial.print (hash2 , HEX); }}

hash פשוט מגשט את ההאשבייטים פעמיים (SHA256 כפולה), מדפיס את שניות השימוש שהוא לקח ומדפיס את החשיש שהתקבל כאנדיאן גדול ואנדיאן קטן. אם החשיפות היו מקוננות רק ב- hasher אחד של SHA256 זה כנראה היה קצת יותר מהיר אבל בכל מקרה עם הקוד הנ ל לוקח 832 שניות לשניות לבצע את החשיש הכפול ואתה יכול לראות מצילום המסך נקבל את החשיש הנכון.

שלב 2: מכות קיר וגוש ממש גדול

להכות קיר וגוש ממש גדול
להכות קיר וגוש ממש גדול

אז אם לוקח 832 שניות לשניות לעשות חשיש אחד נוכל לבצע 1 /0.000834 = 1201 hashes /sec.

רק כדי להיות ברור לקחנו את המידע מגוש #125552 שבו הכרנו את ה- nonce, הוא כבר כרה והשתמשנו במידע זה כמקרה ניסוי כדי לוודא שנוכל לקבל את אותו חשיש עם ה- ESP8266. אז ברגע שהרווח עם כורה ממולא לגמרי היית מנחש באופן אקראי את ה- nonce, חבש איתו את הבלוקדר ואז משווה את התוצאה לקושי של הבלוק הזה. אם החשיש עונה על הקושי, הוא נשלח לרשת לאימות.

אוקי אז זה נהדר שנוכל לבצע את החשיש, בטוח שהתעריף נורא אבל כשמסתכלים עליו כהגרלה ניחוש הוא ניחוש. הנה, אך לאחר בחינה מעמיקה יותר מהר מתברר שאתה צריך להפעיל צומת מלא כדי לתקשר עם הרשת, די ברור כשאתה עוצר וחושב מהו בעצם כרייה.

אז אם מסתכלים על התרשים אפשר לראות שהדמון הביטקוין שהוא חלק מגרעין הביטקוין דואג לתקשורת בין הרשת לכורה. מה זה באמת אומר שאתה צריך להריץ את ליבת הביטקוין בשרת, כך ש- ESP8266 יוכל לקבל בלוקרהר חדש כל 10 דקות ואז תוכל לשלוח בחזרה לרשת.

לא ניסיתי את זה אבל נראה שתצטרך לסנכרן את כל הבלוקצ'יין בסביבות 130 הופעות לפני שהוא יתקשר כראוי עם הרשת, בויקי הם מציינים שצעדים מסוימים חייבים להסתיים לפני שכל הפונקציונליות תהיה זמינה, אז די בטוח לזה הם מתכוונים.

אז זה משך אותי לשם, מנקודת מבט מחקרית הכל היה מאוד מעניין וזה היה די מגניב לראות את ה- ESP8266 הקטן מצליח להצמיד את מקרה הבדיקה אבל למעשה, אני לא רואה הרבה אנשים מורידים את הליבה ומסנכרן את כל blockchain, שמירה על הכל מעודכן, שמירה על בעיות אבטחה והכל בסיכוי של 1 ל 1e16 לזכות בחסימה. גשר רחוק בשבילי.

מההתחלה ידעתי ששיעור החשיש יהיה נורא אבל הסקרנות השתלטה עלי והייתי צריך לנסות. במקום כריית סולו ייתכן שיש שם בריכת כרייה שאפשר לחבר אליה ישירות מה- ESP8266 ללא מאמץ מונומנטאלי או שאולי יש עוד מטבע קריפטוגרפי שמתאים יותר. אם אתה מוצא, אנא יידע אותי.

שלב 3: הפניות

1. מאגר GitHub של Bitcoin Miner Bitcoin

2. מאגר Crypto GitHub של Crypto

3. כריית הביטקוין בדרך הקשה: האלגוריתמים, הפרוטוקולים והבייטים

4. חסום אלגוריתם חשיש

5. בלוק 125552

מוּמלָץ: