詳解python實現簡單區塊鏈結構
區塊鏈
比特幣從誕生到現在已經10年瞭,最近接觸到瞭區塊鏈相關的技術,為瞭揭開其背後的神秘面紗,我就從頭開始構建一個簡單的區塊鏈。
從技術上來看:區塊是一種記錄交易的數據結構,反映瞭一筆交易的資金流向。系統中已經達成的交易的區塊連接在一起形成瞭一條主鏈,所有參與計算的節點都記錄瞭主鏈或主鏈的一部分。
一、比特幣內部結構
比特幣內部結構有四部分:
- previous hash: 上一個區塊的hash
- data:交易數據
- time stamp:區塊生成的時間戳
- nonce:挖礦計算次數
二、實現的比特幣結構
- index :當前區塊索引
- timestamp :該區塊創建時的時間戳
- data :交易信息
- previous hash: 前一個區塊的hash
- hash: 當前區塊的hash
- nonce : 挖礦計算次數
註意:當前實現瞭一個簡單的區塊鏈結構,並不完整。
三、代碼實現
1.定義區塊的結構
代碼如下:
""" 區塊設計 """ import time import hashlib class Block: # 初始化一個區塊 def __init__(self,previous_hash,data): self.index = 0 self.nonce = '' self.previous_hash = previous_hash self.time_stamp = time.time() self.data = data self.hash = self.get_hash() # 獲取區塊的hash def get_hash(self): msg = hashlib.sha256() msg.update(str(self.previous_hash).encode('utf-8')) msg.update(str(self.data).encode('utf-8')) msg.update(str(self.time_stamp).encode('utf-8')) msg.update(str(self.index).encode('utf-8')) return msg.hexdigest() # 修改區塊的hash值 def set_hash(self,hash): self.hash = hash
2.創世區塊構造
創世區塊:沒有前一個區塊,這裡的previous_hash
和data
是自己寫死的。
# 生成創世區塊,這是第一個區塊,沒有前一個區塊 def creat_genesis_block(): block = Block(previous_hash= '0000',data='Genesis block') nonce,digest = mime(block=block) block.nonce = nonce block.set_hash(digest) return block
這裡的mime()
函數是後面的挖礦函數.
3.挖礦函數定義
代碼如下:
def mime(block): """ 挖礦函數——更新區塊結構,加入nonce值 block:挖礦區塊 """ i = 0 prefix = '0000' while True: nonce = str(i) msg = hashlib.sha256() msg.update(str(block.previous_hash).encode('utf-8')) msg.update(str(block.data).encode('utf-8')) msg.update(str(block.time_stamp).encode('utf-8')) msg.update(str(block.index).encode('utf-8')) msg.update(nonce.encode('utf-8')) digest = msg.hexdigest() if digest.startswith(prefix): return nonce,digest i+=1
4.定義區塊鏈結構
代碼如下:
""" 區塊鏈設計 """ from Block import * # 區塊鏈 class BlockChain: def __init__(self): self.blocks = [creat_genesis_block()] # 添加區塊到區塊鏈上 def add_block(self,data): pre_block = self.blocks[len(self.blocks)-1] new_block = Block(pre_block.hash,data) new_block.index = len(self.blocks) nonce,digest = mime(block=new_block) new_block.nonce = nonce new_block.set_hash(digest) self.blocks.append(new_block) return new_block
在添加新區塊到區塊鏈時,先挖礦在將新區塊加入區塊鏈。
四、代碼運行
測試代碼:
from BlockChain import * # 創建一個區塊鏈 bc = BlockChain() # 添加區塊 bc.add_block(data='second block') bc.add_block(data='third block') bc.add_block(data='fourth block') for bl in bc.blocks: print("Index:{}".format(bl.index)) print("Nonce:{}".format(bl.nonce)) print("Hash:{}".format(bl.hash)) print("Pre_Hash:{}".format(bl.previous_hash)) print("Time:{}".format(bl.time_stamp)) print("Data:{}".format(bl.data)) print('\n')
運行結果:
這裡添加瞭4個區塊(包括創世區塊),處瞭創世區塊,每個區塊的pre_hash
都與前一個區塊的hash
值相等,這代表區塊沒有被篡改,數據有效。
到此這篇關於python實現簡單區塊鏈結構的文章就介紹到這瞭,更多相關python區塊鏈結構內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!