詳解python實現簡單區塊鏈結構

2022-09-25 20:48:12 字數 3071 閱讀 3992

位元幣從誕生到現在已經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...