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其它相關文章!