詳解python實(shí)現(xiàn)簡(jiǎn)單區(qū)塊鏈結(jié)構(gòu)
區(qū)塊鏈
比特幣從誕生到現(xiàn)在已經(jīng)10年了,最近接觸到了區(qū)塊鏈相關(guān)的技術(shù),為了揭開(kāi)其背后的神秘面紗,我就從頭開(kāi)始構(gòu)建一個(gè)簡(jiǎn)單的區(qū)塊鏈。
從技術(shù)上來(lái)看:區(qū)塊是一種記錄交易的數(shù)據(jù)結(jié)構(gòu),反映了一筆交易的資金流向。系統(tǒng)中已經(jīng)達(dá)成的交易的區(qū)塊連接在一起形成了一條主鏈,所有參與計(jì)算的節(jié)點(diǎn)都記錄了主鏈或主鏈的一部分。

一、比特幣內(nèi)部結(jié)構(gòu)
比特幣內(nèi)部結(jié)構(gòu)有四部分:
- previous hash: 上一個(gè)區(qū)塊的hash
- data:交易數(shù)據(jù)
- time stamp:區(qū)塊生成的時(shí)間戳
- nonce:挖礦計(jì)算次數(shù)
二、實(shí)現(xiàn)的比特幣結(jié)構(gòu)
- index :當(dāng)前區(qū)塊索引
- timestamp :該區(qū)塊創(chuàng)建時(shí)的時(shí)間戳
- data :交易信息
- previous hash: 前一個(gè)區(qū)塊的hash
- hash: 當(dāng)前區(qū)塊的hash
- nonce : 挖礦計(jì)算次數(shù)
注意:當(dāng)前實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的區(qū)塊鏈結(jié)構(gòu),并不完整。
三、代碼實(shí)現(xiàn)
1.定義區(qū)塊的結(jié)構(gòu)
代碼如下:
"""
區(qū)塊設(shè)計(jì)
"""
import time
import hashlib
class Block:
# 初始化一個(gè)區(qū)塊
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()
# 獲取區(qū)塊的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()
# 修改區(qū)塊的hash值
def set_hash(self,hash):
self.hash = hash
2.創(chuàng)世區(qū)塊構(gòu)造
創(chuàng)世區(qū)塊:沒(méi)有前一個(gè)區(qū)塊,這里的previous_hash和data是自己寫死的。
# 生成創(chuàng)世區(qū)塊,這是第一個(gè)區(qū)塊,沒(méi)有前一個(gè)區(qū)塊
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()函數(shù)是后面的挖礦函數(shù).
3.挖礦函數(shù)定義
代碼如下:
def mime(block):
"""
挖礦函數(shù)——更新區(qū)塊結(jié)構(gòu),加入nonce值
block:挖礦區(qū)塊
"""
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.定義區(qū)塊鏈結(jié)構(gòu)
代碼如下:
"""
區(qū)塊鏈設(shè)計(jì)
"""
from Block import *
# 區(qū)塊鏈
class BlockChain:
def __init__(self):
self.blocks = [creat_genesis_block()]
# 添加區(qū)塊到區(qū)塊鏈上
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
在添加新區(qū)塊到區(qū)塊鏈時(shí),先挖礦在將新區(qū)塊加入?yún)^(qū)塊鏈。
四、代碼運(yùn)行
測(cè)試代碼:
from BlockChain import *
# 創(chuàng)建一個(gè)區(qū)塊鏈
bc = BlockChain()
# 添加區(qū)塊
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')
運(yùn)行結(jié)果:

這里添加了4個(gè)區(qū)塊(包括創(chuàng)世區(qū)塊),處了創(chuàng)世區(qū)塊,每個(gè)區(qū)塊的pre_hash都與前一個(gè)區(qū)塊的hash值相等,這代表區(qū)塊沒(méi)有被篡改,數(shù)據(jù)有效。
到此這篇關(guān)于python實(shí)現(xiàn)簡(jiǎn)單區(qū)塊鏈結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)python區(qū)塊鏈結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python判斷一個(gè)文件夾內(nèi)哪些文件是圖片的實(shí)例
今天小編就為大家分享一篇Python判斷一個(gè)文件夾內(nèi)哪些文件是圖片的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Matplotlib直方圖繪制中的參數(shù)bins和rwidth的實(shí)現(xiàn)
本文主要介紹了Matplotlib直方圖繪制中的參數(shù)bins和rwidth的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
Python實(shí)現(xiàn)將圖像轉(zhuǎn)換為ASCII字符圖
使用Python進(jìn)行圖像處理,非??旖莘奖悖?jiǎn)短幾行代碼就可以實(shí)現(xiàn)功能強(qiáng)大的效果。在這篇文章中,我們將使用Python將圖像轉(zhuǎn)換為ASCII字符照,感興趣的可以了解一下2022-08-08
Python利用神經(jīng)網(wǎng)絡(luò)解決非線性回歸問(wèn)題實(shí)例詳解
這篇文章主要介紹了Python利用神經(jīng)網(wǎng)絡(luò)解決非線性回歸問(wèn)題,結(jié)合實(shí)例形式詳細(xì)分析了Python使用神經(jīng)網(wǎng)絡(luò)解決非線性回歸問(wèn)題的相關(guān)原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07
python并發(fā)編程多進(jìn)程 互斥鎖原理解析
這篇文章主要介紹了python并發(fā)編程多進(jìn)程 互斥鎖原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08

