初學者用Python搭建區塊鏈
最好的學習方法是通過模仿別人,從而學會再優化迭代。如果你是第一次編碼區塊鏈,可以跟我一起學習。
迄今為止,選擇哪種語言和使用哪種解釋器來搭建區塊鏈項目的過程是這一努力中最困難的部分。之所以選擇Python,是因為它對初學者來說很簡單,并且對于高級編碼同時有效。
1.環境配置
我下載了Python 3.9與PyCharm,PyCharm界面簡單,適用于所有級別。我嘗試編寫簡單的命令,直到對PyCharm滿意為止。現在,可以構建一個區塊鏈項目了。
2.搭建實戰
如果你是第一次編碼,我強烈建議你跟著視頻或文章教程一起學習。它幫助我掌握了自己在寫什么以及為什么要寫它。
首先,我導入了hashlib和datetime,讓我們分別計算哈希和時間戳塊。
導入是將代碼從一個模塊傳輸到另一個模塊的修改。如果沒有datetime導入,我的區塊鏈將無法處理時間戳,或者如果沒有hashlib導入,則無法創建哈希。
區塊鏈包含兩個類:Block類和Blockchain類。使用Block類,添加到區塊鏈的每個塊都具有相同的模型。
積木類
該塊必須包含以下屬性:
- 塊的編號,其設置為0,因為它是鏈中的第一個塊,稱為Genesis塊數據,設置為無
- 接下來,設置為無。這充當指向下一個塊的指針,該塊繼續保持鏈接的趨勢。
- 哈希,設置為無。區塊的哈希至關重要,因為它是加密技術的一部分,使區塊鏈變得如此安全和不可變。
- 隨機數,設置為0。隨機數是一遍又一遍地迭代直到找到“ Golden Nonce”的隨機整數。在工作量證明中,礦工競相首先找到合適的哈希。隨機數變化多次,直到它有助于生成正確的哈希。這樣就完成了對塊的驗證,并且可以將塊添加到鏈中。
- 前一個哈希,設置為0x0。存儲前一個區塊的哈希值會使區塊鏈不可變,因為更改一個區塊的哈希值會影響所有后續區塊。
- 時間或時間戳記,描述了交易發生并用于同步網絡中所有塊的時間。
所述塊類,其確定標準加入到鏈中的每個塊
當我們創建一個塊時,我們存儲它的數據。構造函數init初始化類的屬性。自身和數據表示將包含在對象(塊)中的內容。
散列
下一步是添加哈希函數,該函數計算塊的哈希。
在現時的數據,在前面的哈希的時間戳和塊編號放入一個字符串,并運行通過SHA-256的功能。SHA-256是通常用于區塊鏈的密碼哈希算法。“ h ”是使用SHA-256的變量。因為我在代碼的開頭導入了hashlib,所以可以使用SHA-256。散列函數中所有組件的總和將創建塊的散列,當創建新塊時,該散列將添加到散列字段中。
圖片的最后一行告訴你將在輸出中顯示的內容或打印的內容。在這種情況下,輸出將顯示塊的哈希值和塊編號。
區塊鏈類
下一步是創建代碼的第二個類:Blockchain類。區塊鏈類包括:
- 難度設置為20。通過增加難度,我們有效地減小了目標范圍。減小目標范圍將使挖掘區塊變得更加困難,這在處理具有許多節點來查找可接受的哈希的網絡時非常有用。
- 最大隨機數,設置為2的32的冪,這是可以存儲在32位數字中的最大數字。隨機數必須小于要接受的目標數。
- 目標數,將2設置為256的冪減去難度。在這種情況下,難度為20。
區塊鏈中的第一個塊是Genesis塊,如第34行所示。現在,我完全陷入了下一行代碼:dummy = head = block。任何鏈接列表的開始都稱為head。由于鏈接列表的開頭是Genesis塊,因此我們將其記為head = block。^ h H但是,僅此還不夠具體, -在Python中,對象是通過引用傳遞。然后,head和block會指向同一件事。必須在head變量之前寫入一個隨機變量(在本例中為dummy),以告訴計算機head并不與block指向同一對象。
添加塊
我們將繼續這樣的想法,即區塊鏈是add函數的鏈表,用于將塊添加到鏈中。
借助哈希,區塊鏈將其作為鏈表的形狀。哈希將塊綁定在一起,使其不可變。前一哈希(線39)必須目前在列表的頂部被設置成等于該塊。然后,將新塊設置為等于當前塊加一,如代碼第三行所示。
最后兩行有助于形成區塊鏈的形狀。如“ self.block.next =塊”所示,每個塊都有指向下一個塊的指針,因此下一個指針被設置為塊。這會將塊添加到列表的末尾。下一行“ self.block = self.block.next”將指針向前移動以繼續向列表末尾添加塊的趨勢。
礦業挖掘
接下來,我添加了一個挖掘功能。我使用了工作量證明共識機制,例如比特幣。為了將塊添加到鏈中,節點嘗試不同的隨機數,直到發現散列小于目標范圍。
46行開始循環。首先,設置一些猜測準則(范圍),即從0到最大隨機數。通過檢查當前塊的哈希值是否小于或等于目標,它在第47行繼續。哈希值必須在Python中轉換為整數,因此必須轉換為int。如果哈希值低于目標值,則該過程繼續,并且可以添加該塊(第48行)。接下來,打印塊,最后,我們暫停一下開采。但是,如果哈希值不小于目標數,則將1加到隨機數上,然后重試。
我們以在第56行開始的循環結束代碼。它計算10個隨機塊。你可以試一下數字,但是它始終會停在你插入的整數上。
第60行提示打印10個塊,你就可以看到它的實際效果。僅用61行,你就創建了一個可以生成塊,計算散列并將其放在一起的區塊鏈。