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