Python區塊鏈Creating Miners教程

為瞭實現挖掘,我們需要開發一個挖掘功能.挖掘功能需要在給定的消息字符串上生成摘要並提供工作證明.讓我們在本章討論這個.

消息摘要函數

我們將編寫一個名為 sha256 的實用程序函數來創建給定消息的摘要 :

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

sha256 函數將消息作為參數進行編碼它為ASCII,生成十六進制摘要並將值返回給調用者.

挖掘函數

我們現在開發 mine 實現我們自己的挖掘策略的功能.在這種情況下,我們的策略是在給定消息上生成一個前綴為給定數字1的散列.給定的1的數量被指定為 mine 函數的參數,指定為難度級別.

例如,如果指定難度級別為2,則在給定消息上生成的散列應該從兩個1開始 – 如11xxxxxxxx.如果難度級別為3,則生成的散列應以三個1開始 – 如111xxxxxxxx.鑒於這些要求,我們現在將開發挖掘函數,如下面給出的步驟所示.

第1步

挖掘函數有兩個參數 – 消息和難度級別.

def mine(message, difficulty=1):

第2步

難度級別需要大於或等於1,我們使用以下斷言語句 : 確保這一點;

assert difficulty >= 1

第3步

我們創建前綴變量使用設定的難度級別.

prefix = '1' * difficulty

請註意,如果難度級別為2,則前綴為"11",如果難度級別為3,則前綴為"111",依此類推.我們將檢查生成的消息摘要中是否存在此前綴.為瞭消化消息本身,我們使用以下兩行代碼 :

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

我們繼續添加一個新的數字 i 到每次迭代中的消息哈希並在組合消息上生成新摘要.由於 sha256 函數的輸入在每次迭代中都會發生變化,因此摘要值也會發生變化.我們檢查此摘要值是否高於前綴.

if digest.startswith(prefix):

如果條件滿足,我們將終止 for 循環並返回摘要給來電者的價值.

這裡顯示的是整個我的代碼 :

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 語句值和在從函數返回之前滿足條件所需的迭代次數.

測試挖掘函數

測試我們的迷你ng函數,隻需執行以下語句 :

mine("test message",2)

當你運行上面的代碼時,你會看到類似於下面和下面的輸出;

after 138 iterations found nonce:

11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c

請註意,生成的摘要以"11"開頭.如果將難度級別更改為3,則生成的摘要將以"111"開頭,當然,它可能需要更多次迭代.如您所見,具有更強處理能力的礦工將能夠更早地挖掘給定的消息.這就是礦工們為瞭賺取收入而相互競爭的方式.

現在,我們準備為區塊鏈添加更多區塊.讓我們在下一章中學習這一點,更多關於Python區塊鏈Creating Miners的資料請關註WalkonNet其它相關文章!

推薦閱讀: