Python 區塊鏈 - 建立礦工



為了啟用挖礦,我們需要開發一個挖礦函式。挖礦功能需要對給定的訊息字串生成摘要並提供工作量證明。讓我們在本章中討論這個問題。

訊息摘要函式

我們將編寫一個名為 sha256 的實用函式,用於對給定的訊息建立摘要 -

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

sha256 函式以 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”開頭,當然,它可能需要更多次的迭代。如您所見,擁有更多處理能力的礦工能夠更早地挖掘給定的訊息。這就是礦工們相互競爭以賺取收入的方式。

現在,我們準備向我們的區塊鏈新增更多區塊。讓我們在下一章學習這一點。

廣告