
- Python 區塊鏈教程
- Python 區塊鏈 - 首頁
- Python 區塊鏈 - 簡介
- 區塊鏈 - 開發客戶端
- 區塊鏈 - 客戶端類
- 區塊鏈 - 交易類
- 建立多個交易
- 區塊鏈 - 區塊類
- 區塊鏈 - 建立創世區塊
- 區塊鏈 - 建立區塊鏈
- 區塊鏈 - 新增創世區塊
- 區塊鏈 - 建立礦工
- 區塊鏈 - 新增區塊
- 區塊鏈 - 範圍和結論
- Python 區塊鏈資源
- Python 區塊鏈 - 快速指南
- Python 區塊鏈 - 資源
- Python 區塊鏈 - 討論
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”開頭,當然,它可能需要更多次的迭代。如您所見,擁有更多處理能力的礦工能夠更早地挖掘給定的訊息。這就是礦工們相互競爭以賺取收入的方式。
現在,我們準備向我們的區塊鏈新增更多區塊。讓我們在下一章學習這一點。