Python Blockchain - การสร้างคนงานเหมือง

สำหรับการเปิดใช้งานการขุดเราจำเป็นต้องพัฒนาฟังก์ชันการขุด ฟังก์ชันการขุดจำเป็นต้องสร้างข้อมูลย่อยบนสตริงข้อความที่กำหนดและแสดงหลักฐานการทำงาน ให้เราพิจารณาเรื่องนี้ในบทนี้

ฟังก์ชันย่อยข้อความ

เราจะเขียนฟังก์ชันยูทิลิตี้ที่เรียกว่า sha256 สำหรับการสร้างสรุปข้อความที่กำหนด -

def sha256(message):
return hashlib.sha256(message.encode('ascii')).hexdigest()

sha256 ฟังก์ชันใช้เวลา a message เป็นพารามิเตอร์เข้ารหัสเป็น ASCII สร้างการย่อยเลขฐานสิบหกและส่งคืนค่าให้กับผู้เรียก

ฟังก์ชั่นการขุด

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

ตัวอย่างเช่นหากคุณระบุระดับความยากเป็น 2 แฮชที่สร้างขึ้นในข้อความหนึ่ง ๆ ควรเริ่มต้นด้วย 1 สองตัว - เช่น 11xxxxxxxx หากระดับความยากคือ 3 แฮชที่สร้างขึ้นควรเริ่มต้นด้วยสาม 1 เช่น 111xxxxxxxx ด้วยข้อกำหนดเหล่านี้เราจะพัฒนาฟังก์ชันการขุดดังที่แสดงในขั้นตอนด้านล่าง

ขั้นตอนที่ 1

ฟังก์ชั่นการขุดใช้สองพารามิเตอร์ - ข้อความและระดับความยาก

def mine(message, difficulty=1):

ขั้นตอนที่ 2

ระดับความยากจะต้องมากกว่าหรือเท่ากับ 1 เรารับรองสิ่งนี้ด้วยข้อความยืนยันต่อไปนี้ -

assert difficulty >= 1

ขั้นตอนที่ 3

เราสร้างไฟล์ prefix ตัวแปรโดยใช้ระดับความยากที่ตั้งไว้

prefix = '1' * difficulty

โปรดทราบว่าระดับความยากคือ 2 หรือไม่คำนำหน้าจะเป็น“ 11” และหากระดับความยากคือ 3 คำนำหน้าจะเป็น“ 111” เป็นต้น เราจะตรวจสอบว่าคำนำหน้านี้มีอยู่ในส่วนย่อยที่สร้างขึ้นของข้อความหรือไม่ ในการย่อยข้อความเราใช้โค้ดสองบรรทัดต่อไปนี้ -

for i in range(1000):
   digest = sha256(str(hash(message)) + str(i))

เรายังคงเพิ่มหมายเลขใหม่ iไปยังแฮชข้อความในการวนซ้ำแต่ละครั้งและสร้างไดเจสต์ใหม่ในข้อความที่รวมกัน เป็นอินพุตไปยังไฟล์sha256 ฟังก์ชันจะเปลี่ยนไปในทุกๆการวนซ้ำไฟล์ digestมูลค่าก็จะเปลี่ยนไปเช่นกัน เราตรวจสอบว่าสิ่งนี้digest มีค่าที่ตั้งไว้ด้านบน prefix.

if digest.startswith(prefix):

หากเงื่อนไขเป็นที่พอใจเราจะยุติการใช้งาน for วนซ้ำและส่งคืนไฟล์ digest มูลค่าให้กับผู้โทร

ทั้งหมด mine รหัสแสดงที่นี่ -

def mine(message, difficulty=1):
   assert difficulty >= 1
   prefix = '1' * difficulty
   for i in range(1000):
      digest = sha256(str(hash(message)) + str(i))
      if digest.startswith(prefix):
         print ("after " + str(i) + " iterations found nonce: "+ digest)
      return digest

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

การทดสอบฟังก์ชั่นการขุด

หากต้องการทดสอบฟังก์ชันการขุดของเราเพียงดำเนินการตามคำสั่งต่อไปนี้ -

mine ("test message", 2)

เมื่อคุณรันโค้ดด้านบนคุณจะเห็นผลลัพธ์คล้ายกับโค้ดด้านล่าง -

after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c

สังเกตว่าไดเจสต์ที่สร้างขึ้นเริ่มต้นด้วย“ 11” หากคุณเปลี่ยนระดับความยากเป็น 3 ไดเจสต์ที่สร้างขึ้นจะเริ่มต้นด้วย“ 111” และแน่นอนว่าอาจต้องใช้การทำซ้ำหลายครั้ง อย่างที่คุณเห็นนักขุดที่มีพลังในการประมวลผลมากกว่าจะสามารถขุดข้อความที่ระบุได้ก่อนหน้านี้ นั่นเป็นวิธีที่คนงานเหมืองแข่งขันกันเพื่อหารายได้

ตอนนี้เราพร้อมที่จะเพิ่มบล็อกให้กับบล็อกเชนของเราแล้ว ให้เราเรียนรู้สิ่งนี้ในบทต่อไปของเรา