61行程式碼構建最簡單區塊鏈

Gb16978 發表於 2022-07-19
區塊鏈

首先,我匯入了 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/,如需轉載,請註明出處,否則將追究法律責任。