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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 300行ABAP程式碼實現一個最簡單的區塊鏈原型區塊鏈原型
- 一個簡單的區塊鏈程式碼實現區塊鏈
- 簡單說區塊鏈區塊鏈
- 什麼是區塊鏈,簡單瞭解區塊鏈區塊鏈
- 初識區塊鏈 - 用JS構建你自己的區塊鏈區塊鏈JS
- 使用ABAP實現一個最簡單的區塊鏈原型區塊鏈原型
- 構建最簡單陣列陣列
- 一個簡單的區塊鏈區塊鏈
- FISCO BCOS | 構建第一個區塊鏈應用程式區塊鏈
- 構建 EOS 區塊鏈瀏覽器區塊鏈瀏覽器
- 區塊鏈知識,區塊鏈簡史區塊鏈
- 構建 EOS 區塊鏈瀏覽器 API區塊鏈瀏覽器API
- Java中靜態程式碼塊、構造程式碼塊、建構函式、普通程式碼塊Java函式
- 和數軟體:以最簡單的方式瞭解區塊鏈技術區塊鏈
- 區塊鏈簡介區塊鏈
- 程式碼來構建一個簡單的compilerCompile
- 區塊鏈將構建完美的契約世界區塊鏈
- 用Go構建區塊鏈——6.交易2Go區塊鏈
- 區塊鏈構建資料可信流通體系區塊鏈
- 谷歌要構建自己的區塊鏈技術谷歌區塊鏈
- 使用 Swift 和 Vapor 構建區塊鏈伺服器SwiftVapor區塊鏈伺服器
- 用 Python 構建一個極小的區塊鏈Python區塊鏈
- 用java實現一個簡單的區塊鏈Java區塊鏈
- 區塊鏈2.0架構:以太坊區塊鏈的介紹區塊鏈架構
- 想學習區塊鏈?那就用 Python 構建一個區塊鏈Python
- 基於Java語言構建區塊鏈(四)—— 交易(UTXO)Java區塊鏈
- [譯] 用 Java 程式碼實現區塊鏈Java區塊鏈
- 區塊鏈-技術簡介區塊鏈
- Mybatis原始碼簡單解讀----構建MyBatis原始碼
- 一個簡單的區塊鏈貨幣,python實現區塊鏈Python
- 區塊鏈上程式設計:DApp 開發簡介區塊鏈程式設計APP
- 區塊鏈架構設計區塊鏈架構
- 區塊鏈的架構模型區塊鏈架構模型
- 區塊鏈技術研發,如今最契合區塊鏈技術應用方向區塊鏈
- 區塊鏈之--2小時構建以太坊智慧合約區塊鏈
- 在Go中構建區塊鏈 第5部分:地址Go區塊鏈
- 基於Java語言構建區塊鏈(六)—— 交易(Merkle Tree)Java區塊鏈
- 基於Java語言構建區塊鏈(五)—— 地址(錢包)Java區塊鏈