位元幣從誕生到現在已經10年了,最近接觸到了區塊鏈相關的技術,為了揭開其背後的神秘面紗,我就從頭開始構建乙個簡單的區塊鏈。
從技術上來看:區塊是一種記錄交易的資料結構,反映了一筆交易的資金流向。系統中已經達成的交易的區塊連線在一起形成了一條主鏈,所有參與計算的節點都記錄了主鏈或主鏈的一部分。
位元幣內部結構有四部分:
注意:當前實現了乙個簡單的區塊鏈結構,並不完整。
**如下:
"""區塊設計
"""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('utdkxwditejyf-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
創世區塊:沒有前乙個區塊,這裡的previous_hash和data是自己寫死的。
# 生成創世區塊,這是第乙個區塊,沒有前乙個區塊
def creat_genesis_block():
block = block(previous_hash= '0000',data='genesdkxwditejyis block')
nonce,digest = mime(block=block)
block.nonce = nonce
block.set_hash(digest)
return block
這裡的mime()函式是後面的挖礦函式.
**如下:
def mime(block):
"""挖礦函式——更新區塊結構,加入nonce值
blodkxwditejyck:挖礦區塊
"""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
**如下:
"""區塊鏈設計
"""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))
www.cppcns.comprint('\n')
執行結果:
這裡新增了4個區塊(包括創世區塊),處了創世區塊,每個區塊的pre_hash都與前乙個區塊的hash值相等,這代表區塊沒有被篡改,資料有效。
python 區塊鏈 區塊鏈Python實現
區塊鏈是如同鍊錶的一組記錄。每個區塊含有一些資訊以及與其他區塊關聯的方法。每個區塊有前乙個區塊的雜湊值 時間戳 資料。class block def init self,timestamp,data,previous hash self.timestamp timestamp self.data d...
區塊鏈的簡單實現
最近在學習區塊鏈的相關知識,在懂得原理後通過程式設計實現了乙個簡單的區塊鏈程式,希望對以後的學習有所增益,在這裡要感謝b站up主 是落拓呀 的對於區塊鏈的詳細講解,下面附上相關python import hashlib import json from typing import text 區塊 c...
python簡單區塊鏈模擬
最近學習了一點python,那就試著做一做簡單的程式設計練習。首先是這個程式設計的指導圖,如下 對的,類似乙個簡單區塊鏈的模擬。如下 class dadablockcoin index 索引,timestamp 時間戳,data 交易記錄,self hash交易hash,last hash,上個ha...