區塊鏈
位元幣從誕生到現在已經10年了,最近接觸到了區塊鏈相關的技術,為了揭開其背后的神秘面紗,我就從頭開始構建一個簡單的區塊鏈,
文章目錄
- 區塊鏈
- 一、位元幣內部結構
- 二、實作的位元幣結構
- 三、代碼實作
- 1.定義區塊的結構
- 2.創世區塊構造
- 3.挖礦函式定義
- 4.定義區塊鏈結構
- 四、代碼運行
一、位元幣內部結構
位元幣內部結構有四部分:
- 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值相等,這代表區塊沒有被篡改,資料有效,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/279647.html
標籤:區塊鏈
上一篇:區塊鏈是時代趨勢,然而Filecoin存在的意義你看清了嗎
下一篇:投資最重要的是選擇
