欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解python實現簡單區(qū)塊鏈結構

 更新時間:2021年04月25日 11:19:56   作者:凌小皮_177  
區(qū)塊鏈是一種數據結構,也是一個分布式數據庫。這篇文章主要介紹了python實現簡單區(qū)塊鏈結構的相關知識,需要的朋友可以參考下

區(qū)塊鏈

比特幣從誕生到現在已經10年了,最近接觸到了區(qū)塊鏈相關的技術,為了揭開其背后的神秘面紗,我就從頭開始構建一個簡單的區(qū)塊鏈。

從技術上來看:區(qū)塊是一種記錄交易的數據結構,反映了一筆交易的資金流向。系統中已經達成的交易的區(qū)塊連接在一起形成了一條主鏈,所有參與計算的節(jié)點都記錄了主鏈或主鏈的一部分。

一、比特幣內部結構

比特幣內部結構有四部分:

  1. previous hash: 上一個區(qū)塊的hash
  2. data:交易數據
  3. time stamp:區(qū)塊生成的時間戳
  4. nonce:挖礦計算次數

二、實現的比特幣結構

  1. index :當前區(qū)塊索引
  2. timestamp :該區(qū)塊創(chuàng)建時的時間戳
  3. data :交易信息
  4. previous hash: 前一個區(qū)塊的hash
  5. hash: 當前區(qū)塊的hash
  6. nonce : 挖礦計算次數

注意:當前實現了一個簡單的區(qū)塊鏈結構,并不完整。

三、代碼實現

1.定義區(qū)塊的結構

代碼如下:

"""
區(qū)塊設計
"""
import time
import hashlib

class Block:
    # 初始化一個區(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ū)塊構造

創(chuàng)世區(qū)塊:沒有前一個區(qū)塊,這里的previous_hashdata是自己寫死的。

# 生成創(chuàng)世區(qū)塊,這是第一個區(qū)塊,沒有前一個區(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()函數是后面的挖礦函數.

3.挖礦函數定義

代碼如下:

def mime(block):
    """
    挖礦函數——更新區(qū)塊結構,加入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ū)塊鏈結構

代碼如下:

"""
區(qū)塊鏈設計
"""
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ū)塊鏈時,先挖礦在將新區(qū)塊加入區(qū)塊鏈。

四、代碼運行

測試代碼:

from BlockChain import *
# 創(chuàng)建一個區(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')

運行結果:

區(qū)塊鏈

這里添加了4個區(qū)塊(包括創(chuàng)世區(qū)塊),處了創(chuàng)世區(qū)塊,每個區(qū)塊的pre_hash都與前一個區(qū)塊的hash值相等,這代表區(qū)塊沒有被篡改,數據有效。

到此這篇關于python實現簡單區(qū)塊鏈結構的文章就介紹到這了,更多相關python區(qū)塊鏈結構內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python Socket編程詳解

    Python Socket編程詳解

    這篇文章主要介紹了Python Socket編程的相關資料,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-04-04
  • Python判斷一個文件夾內哪些文件是圖片的實例

    Python判斷一個文件夾內哪些文件是圖片的實例

    今天小編就為大家分享一篇Python判斷一個文件夾內哪些文件是圖片的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 使用Python畫股票的K線圖的方法步驟

    使用Python畫股票的K線圖的方法步驟

    這篇文章主要介紹了使用Python畫股票的K線圖的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • Python?GUI布局工具Tkinter入門之旅

    Python?GUI布局工具Tkinter入門之旅

    這篇文章主要為大家介紹了Python?GUI布局工具Tkinter的基礎,Tkinter?作為?Python?的標準庫,是非常流行的?Python?GUI?工具,同時也是非常容易學習的,今天我們就來開啟?Tkinter的入門之旅
    2022-08-08
  • Matplotlib直方圖繪制中的參數bins和rwidth的實現

    Matplotlib直方圖繪制中的參數bins和rwidth的實現

    本文主要介紹了Matplotlib直方圖繪制中的參數bins和rwidth的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-02-02
  • 基于Python的OCR實現示例

    基于Python的OCR實現示例

    這篇文章主要介紹了基于Python的OCR實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Python實現將圖像轉換為ASCII字符圖

    Python實現將圖像轉換為ASCII字符圖

    使用Python進行圖像處理,非??旖莘奖悖喍處仔写a就可以實現功能強大的效果。在這篇文章中,我們將使用Python將圖像轉換為ASCII字符照,感興趣的可以了解一下
    2022-08-08
  • Python利用神經網絡解決非線性回歸問題實例詳解

    Python利用神經網絡解決非線性回歸問題實例詳解

    這篇文章主要介紹了Python利用神經網絡解決非線性回歸問題,結合實例形式詳細分析了Python使用神經網絡解決非線性回歸問題的相關原理與實現技巧,需要的朋友可以參考下
    2019-07-07
  • Python函數生成器原理及使用詳解

    Python函數生成器原理及使用詳解

    這篇文章主要介紹了Python函數生成器原理及使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • python并發(fā)編程多進程 互斥鎖原理解析

    python并發(fā)編程多進程 互斥鎖原理解析

    這篇文章主要介紹了python并發(fā)編程多進程 互斥鎖原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08

最新評論