61行程式碼構建最簡單區塊鏈
首先,我匯入了 hashlib和datetime,讓我們分別計算雜湊和時間戳塊。
匯入是將程式碼從一個模組傳輸到另一個模組的修改。如果沒有 datetime 匯入,我的區塊鏈將無法處理時間戳,或者在沒有 hashlib 匯入的情況下無法建立雜湊。
區塊鏈包含兩個類:Block類和Blockchain類。新增到區塊鏈的每個塊都使用Block類進行相同的建模。
塊類
該塊必須包含以下屬性:
區塊的編號,設定為 0,因為它是鏈中的第一個區塊,稱為創世區塊
資料,設定為無
接下來,設定為無。這充當了指向下一個塊的指標,繼續連結的趨勢。
雜湊,設定為無。塊的雜湊是至關重要的,因為它是使區塊鏈如此安全和不可變的密碼學的一部分。
nonce,設定為 0。 nonce 是一個隨機整數,一遍又一遍地迭代,直到找到“Golden Nonce”。在工作量證明中,礦工們首先競爭找到正確的雜湊值。隨機數更改多次,直到它有助於生成正確的雜湊。這樣就完成了區塊的驗證,區塊就可以加入鏈中了。
前一個雜湊,設定為 0x0。儲存前一個塊的雜湊使區塊鏈不可變,因為更改一個塊的雜湊會影響所有後續塊。
時間或時間戳,描述交易發生的時間,用於同步網路中的所有塊。
Block類,它確定新增到鏈中的每個塊的標準
當我們建立一個塊時,我們儲存它的資料。建構函式init初始化類的屬性。自我和資料表示將包含在物件(塊)中的內容。
雜湊
下一步是新增雜湊函式,計算區塊的雜湊值。
將nonce、data、前一個 hash、timestamp和塊號放入一個字串並透過 SHA-256 函式執行。SHA-256 是一種常用於區塊鏈的加密雜湊演算法。“ h ”是使用 SHA-256 的變數。因為我在程式碼開頭匯入了hashlib,所以可以使用SHA-256。雜湊函式中的所有元件將建立塊的雜湊,在建立新塊時將其新增到雜湊欄位中。
圖片中的最後一行描述了將在輸出中顯示的內容或列印的內容。在這種情況下,輸出將顯示塊的雜湊和塊號。
區塊鏈類
下一步是建立程式碼的第二個類:Blockchain類。區塊鏈類包括:
難度,設定為20。透過增加難度,我們有效地減小了目標範圍。減小目標範圍會使挖掘塊變得更加困難,這在處理具有許多節點的網路時非常有用以找到可接受的雜湊值。
最大隨機數,設定為 2 的 32 次方,即 32 位數字中可以儲存的最大數。隨機數必須小於要接受的目標數。
目標數,設定為 2 的 256 次方減去難度。在這種情況下,難度為 20。
區塊鏈中的第一個塊是創世塊,如第 34 行所示。現在,我完全陷入了下一行程式碼:dummy = head = block。任何連結串列的開頭都稱為head。由於我們的連結串列的頭部是創世塊,我們在程式碼中將其寫為head = block。然而,僅此一點還不夠具體——在 Python 中,物件是透過引用傳遞的。Head和block會指向同一個東西。必須在head變數(在本例中為dummy )之前寫入一個隨機變數,以告訴計算機head與block指向的物件不同。
新增塊
我們將繼續認為區塊鏈是add函式的連結串列,用於將塊新增到鏈中。
區塊鏈在雜湊的幫助下形成一個連結串列。雜湊將塊聯絡在一起,使其不可變。前一個雜湊(第 39 行)必須設定為等於當前位於列表頂部的塊。然後,將新塊設定為等於當前塊加一,如第三行程式碼所示。
最後兩行有助於形成區塊鏈的形狀。如“self.block.next = block”所示,每個塊都有一個指向下一個塊的指標,因此下一個指標被設定為塊。這會將塊新增到列表的末尾。下一行“self.block = self.block.next”將指標向前移動以繼續將塊新增到列表末尾的趨勢。
礦業
接下來我新增了一個挖礦功能。我使用了工作量證明共識機制,比如比特幣。為了將塊新增到鏈中,節點會嘗試不同的隨機數,直到找到小於目標範圍的雜湊值。
第 46 行開始一個迴圈。它首先設定一些猜測準則(範圍),從 0 到最大隨機數。它在第 47 行繼續檢查當前塊的雜湊是否小於或等於目標。雜湊必須在 Python 中轉換為整數,因此是int。如果雜湊值低於目標值,該過程將繼續,並且可以新增塊(第 48 行)。接下來,列印塊,最後,我們暫停挖礦。但是,如果雜湊不小於目標數,我們將隨機數加 1 並重試。
整理起來
我們以從第 56 行開始的迴圈結束我們的程式碼。它計算 10 個隨機塊。你可以玩弄這些數字,但它總是會停在你插入的任何整數處。
第 60 行提示列印 10 個塊。一旦你完成了這條線,你就正式完成了!執行幾次以檢查錯誤並欣賞您的作品。僅用 61 行程式碼,您就建立了一個可以生成塊、計算雜湊並將所有內容放在一起的區塊鏈!
整體程式碼如下
import datetime
import hashlib
class Block:
blockNo = 0
data = None
next = None
hash = None
nonce = 0
previous_hash = 0x0
timestamp = datetime.datetime.now()
def __init__(self, data):
self.data = data
def hash(self):
h = hashlib.sha256()
h.update(
str(self.nonce).encode('utf-8') +
str(self.data).encode('utf-8') +
str(self.previous_hash).encode('utf-8') +
str(self.timestamp).encode('utf-8') +
str(self.blockNo).encode('utf-8')
)
return h.hexdigest()
def __str__(self):
return "Block Hash: " + str(self.hash()) + "\nBlockNo: " + str(self.blockNo) + "\nBlock Data: " + str(self.data) + "\nHashes: " + str(self.nonce) + "\n--------------"
class Blockchain:
diff = 20
maxNonce = 2**32
target = 2 ** (256-diff)
block = Block("Genesis")
dummy = head = block
def add(self, block):
block.previous_hash = self.block.hash()
block.blockNo = self.block.blockNo + 1
self.block.next = block
self.block = self.block.next
def mine(self, block):
for n in range(self.maxNonce):
if int(block.hash(), 16) <= self.target:
self.add(block)
print(block)
break
else:
block.nonce += 1
blockchain = Blockchain()
for n in range(10):
blockchain.mine(Block("Block " + str(n+1)))
while blockchain.head != None:
print(blockchain.head)
blockchain.head = blockchain.head.next
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70019421/viewspace-2906359/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 英國雜誌評孫宇晨出席WTO MC12:區塊鏈引領全球數字化轉型
- 區塊鏈如何從1.0到4.0?
- 聯瑞電子:今天你出示行程碼了嗎?
- 區塊鏈為什麼模組化?
- 終於可以一行程式碼也不用改了!ShardingSphere 原生驅動問世
- 👨💻Mybatis原始碼我搞透了,面試來問吧!寫了134個原始碼類,1.03萬行程式碼!
- Hyperledger Fabric 2.x Java 區塊鏈應用
- 區塊鏈Hyperledger Fabric 2.x 自定義智慧合約
- 零識區塊鏈對話:Web3.0與元宇宙的關係?
- HashMap原始碼深度剖析,手把手帶你分析每一行程式碼,包會!!!
- 2021年中國區塊鏈BaaS廠商市場份額(附原資料表)
- 法國西南華人華僑商會:進軍區塊鏈行業,促進技術創新專案落地
- 用Java程式碼實現區塊鏈技術
- 一整套基於Java開發的的區塊鏈系統
- 區塊鏈技術學習總結專欄前言
- 一個簡單的區塊鏈程式碼實現
- 一個簡單的區塊鏈
- 區塊鏈專案程式碼基礎名詞解釋?
- 用資料視角看看區塊鏈是啥?