สารบัญ:

ESP8266 Bitcoin Miner: 3 ขั้นตอน
ESP8266 Bitcoin Miner: 3 ขั้นตอน

วีดีโอ: ESP8266 Bitcoin Miner: 3 ขั้นตอน

วีดีโอ: ESP8266 Bitcoin Miner: 3 ขั้นตอน
วีดีโอ: Crypto Mining ทุนหลักร้อย 05 ESP8266 2024, พฤศจิกายน
Anonim
ESP8266 Bitcoin Miner
ESP8266 Bitcoin Miner

ด้วยราคาของ Bitcoin ที่เพิ่มขึ้นอย่างต่อเนื่องและกับ ESP8266 สองสามตัวที่เสียบปลั๊กอยู่เสมอ แต่ไม่ได้ทำอะไรมาก ฉันคิดว่าทำไมไม่ลองใช้ Solo Bitcoin Miner หลังจากการทดลองเล็กน้อย ฉันได้รับ ESP8266 สูงถึง ~ 1200 hashes/วินาที และ ณ เดือนธันวาคม 2017 เครือข่าย Bitcoin มีประสิทธิภาพประมาณ 12,000, 000 tera hashes ต่อวินาที (คุณสามารถตรวจสอบ blockchaininfo สำหรับตัวเลขล่าสุดได้)

จากตัวเลขเหล่านั้น เราจะมีโอกาส 1 ใน 1e16 ในการขุดบล็อกได้สำเร็จทุก ๆ สิบนาที ซึ่งปัจจุบันบล็อกมีมูลค่า $221, 000 แน่นอนว่ามันเหมือนกับการซื้อสลากลอตเตอรี่ โดยมีโอกาสถูกรางวัลน้อยกว่ามาก แต่คุณรู้คำโบราณว่าต้องมีคนชนะ ด้วยทั้ง Gate Mate และ Super Squirter ESP8266 โปรเจ็กต์โดยส่วนใหญ่พวกเขาไม่ได้ทำงานอะไรเลย พวกเขาเพียงแค่เสียบปลั๊กและรอคำขอหรืออินพุต ดังนั้นทำไมไม่ลองใส่มันลงไปและอาจชนะเหรียญบ้าง ขั้นตอนแรกคือลองคิดดูว่าสามารถใช้ SHA256 แบบคู่บน Blockheader บน ESP8266 ได้หรือไม่ ในโลกของ Bitcoin 'แฮช' เป็น SHA256 สองเท่า แต่เราจะเรียกมันว่าแฮช อย่างไรก็ตาม หลังจากสำรวจไปรอบๆ เล็กน้อย ฉันพบสองหน้านี้ซึ่งให้ข้อมูลทั้งหมดที่จำเป็นในการรับแฮช

1. บล็อกอัลกอริทึมการแฮช

2. การขุด Bitcoin ด้วยวิธีที่ยาก: อัลกอริธึม โปรโตคอล และไบต์

เป็นที่น่าสังเกตว่าโปรโตคอล getwork ตามรายละเอียดในลิงก์ด้านบนเลิกใช้งานแล้ว มันถูกแทนที่ด้วยโปรโตคอล getblocktemplate ซึ่งทำให้การสร้างส่วนหัวของบล็อกซับซ้อนขึ้นเล็กน้อย โดยเฉพาะคุณต้องสร้าง Merkle root ของคุณเอง สำหรับข้อมูลสำคัญทั้งหมดลองดู getblocktemplate wiki

ขั้นตอนที่ 1: อัลกอริทึม

อัลกอริทึม
อัลกอริทึม

เข้าไปกันเถอะ รหัส ESP8266 อยู่ที่ repo ของ ESP8266BitcoinMiner GitHub ฉันจะไม่แฮชข้อมูลทั้งหมดจากลิงก์ด้านบน แต่เน้นเฉพาะประเด็นหลัก

ถ่าน header_hex="0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122bc7f5d417442df2146"

char header_hex เป็นส่วนหัวของบล็อกและสร้างขึ้นจากหกฟิลด์ ได้แก่ Version, hashPrevBlock, hashMerkleRoot, Time, Bits และ Nonce ทั้งหมดรวมกันเป็นค่า endian เพียงเล็กน้อยในรูปแบบเลขฐานสิบหก นั่นเพิ่งคัดลอกมาจากลิงค์ด้านบน แต่ในตัวขุดที่เต็มเปี่ยมจริง ๆ คุณจะได้รับแต่ละฟิลด์เหล่านั้นในวัตถุ json แล้วต้องแยกแยะ endianness และรวมเข้าด้วยกันทันทีทุก ๆ 10 นาที

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

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 รับสตริง header_hex ซึ่งมีอักขระ ascii เลขฐานสิบหก และเติม uint8_t hashbytes[80] ด้วยค่าไบต์ตามลำดับที่พร้อมสำหรับแฮช SHA256

แฮชเป็นโมฆะ (){

hex_decode(header_hex, strlen(header_hex), แฮชไบต์); การเริ่มต้นแบบยาวที่ไม่ได้ลงนาม = micros(); hasher.doUpdate(hashbytes, sizeof(hashbytes)); ไบต์แฮช[SHA256_SIZE]; hasher.doFinal(แฮช); hashagain.doUpdate(แฮช, ขนาดของ(แฮช)); ไบต์แฮช2[SHA256_SIZE]; hashagain.doFinal(แฮช2); ปลายยาวที่ไม่ได้ลงนาม = 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("Little Endian: "); สำหรับ (ไบต์ i=0; i < SHA256_SIZE; i++){ if (hash2<0x10) { Serial.print('0'); } Serial.print(hash2, HEX); } }

แฮชเพียงแค่แฮชแฮชไบต์สองครั้ง (SHA256 สองเท่า) พิมพ์ useconds ที่ใช้และพิมพ์แฮชผลลัพธ์ออกมาเป็น endian ขนาดใหญ่และ endian น้อย หากแฮชซ้อนอยู่ในแฮช SHA256 เพียงตัวเดียว มันอาจจะเร็วกว่าเล็กน้อย แต่อย่างไรก็ตาม ด้วยโค้ดด้านบนจะใช้เวลา 832 useconds เพื่อทำการแฮชสองครั้ง และคุณจะเห็นได้จากภาพหน้าจอที่เราได้รับแฮชที่ถูกต้อง

ขั้นตอนที่ 2: ตีกำแพงและบล็อกใหญ่จริงๆ

ชนกำแพงและบล็อกใหญ่จริงๆ
ชนกำแพงและบล็อกใหญ่จริงๆ

ดังนั้นหากใช้เวลา 832 useconds ในการทำหนึ่ง hash เราสามารถดำเนินการได้ 1/0.000834 = 1201 hashes /sec

เพื่อให้ชัดเจน เราได้นำข้อมูลจากบล็อก #125552 ที่เรารู้จัก nonce อยู่แล้ว มันถูกขุดแล้วและใช้ข้อมูลนั้นเป็นกรณีทดสอบเพื่อให้แน่ใจว่าเราจะได้แฮชเดียวกันกับ ESP8266 ดังนั้นเมื่อได้กำไรจากตัวขุดที่สมบูรณ์ คุณจะสุ่มเดาที่ nonce แฮชบล็อกเฮดเดอร์กับมัน แล้วเปรียบเทียบผลลัพธ์กับความยากของบล็อกนั้น หากแฮชตรงตามความยาก แฮชจะถูกส่งไปยังเครือข่ายเพื่อตรวจสอบ

โอเค ดีมากที่เราสามารถทำแฮชได้ แน่นอนว่าอัตรานั้นแย่มาก แต่เมื่อมองว่าเป็นลอตเตอรี การเดาเป็นการเดา ต่อไปนี้คือ แต่เมื่อตรวจสอบอย่างถี่ถ้วนแล้ว ในไม่ช้าก็จะกลายเป็นที่ชัดเจนว่าคุณต้องเรียกใช้โหนดแบบเต็มเพื่อให้สามารถสื่อสารกับเครือข่ายได้ ซึ่งชัดเจนเมื่อคุณหยุดและคิดว่าการขุดจริงๆ คืออะไร

ดังนั้นหากคุณดูแผนภาพ คุณจะเห็นว่า bitcoin daemon ซึ่งเป็นส่วนหนึ่งของแกน bitcoin ดูแลการสื่อสารระหว่างเครือข่ายและผู้ขุด สิ่งนี้หมายความว่าจริง ๆ แล้ว คุณต้องใช้งาน Bitcoin core บนเซิร์ฟเวอร์ เพื่อให้ ESP8266 สามารถรับบล็อคเฮดเดอร์ใหม่ทุกๆ 10 นาที แล้วจึงสามารถส่งกลับไปยังเครือข่ายได้

ฉันไม่ได้ลอง แต่ดูเหมือนว่าคุณจะต้องซิงค์บล็อกเชนทั้งหมดที่ประมาณ 130 Gigs ก่อนจึงจะสามารถสื่อสารกับเครือข่ายได้อย่างเหมาะสม ใน wiki พวกเขาพูดถึงขั้นตอนบางอย่างที่ต้องทำให้เสร็จก่อนฟังก์ชันทั้งหมดจึงจะพร้อมใช้งาน ค่อนข้างแน่นอน นั่นคือสิ่งที่พวกเขาหมายถึง

นั่นดึงฉันขึ้นไปที่นั่น จากมุมมองของการวิจัย มันน่าสนใจมาก และมันก็ค่อนข้างเจ๋งที่ได้เห็น ESP8266 ตัวเล็กแฮชกรณีทดสอบได้สำเร็จ แต่ในเชิงปฏิบัติ ฉันไม่เห็นคนจำนวนมากดาวน์โหลดคอร์และซิงค์ทั้งหมด blockchain ทำให้ทุกอย่างเป็นปัจจุบัน ติดตามปัญหาด้านความปลอดภัยทั้งหมดเพื่อโอกาส 1 ใน 1e16 ในการชนะบล็อก สะพานที่ไกลสำหรับฉัน

ตั้งแต่เริ่มต้น ฉันรู้ว่าอัตราแฮชจะแย่มาก แต่ความอยากรู้ทำให้ฉันดีขึ้นและฉันต้องปล่อยมันไป แทนที่จะทำเหมืองคนเดียว อาจมีกลุ่มการขุดที่สามารถเชื่อมต่อโดยตรงจาก ESP8266 โดยไม่ต้องใช้ความพยายามอย่างมาก หรืออาจมีสกุลเงินดิจิทัลอื่นที่เหมาะสมกว่า หากคุณพบอย่างใดอย่างหนึ่งโปรดแจ้งให้เราทราบ

ขั้นตอนที่ 3: การอ้างอิง

1. ESP8266 Bitcoin Miner GitHub Repository

2. ESP8266 Crypto GitHub Repository

3. การขุด Bitcoin ด้วยวิธีที่ยาก: อัลกอริธึม โปรโตคอล และไบต์

4. บล็อกอัลกอริทึมการแฮช

5. บล็อก 125552

แนะนำ: