python实现简单区块链
生活随笔
收集整理的這篇文章主要介紹了
python实现简单区块链
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
python實現簡單區塊鏈
import hashlib import json from time import time from typing import Any, Dict, List, Optional from urllib.parse import urlparse from uuid import uuid4 import requests from flask import Flask, jsonify, request import mathclass Blockchain(object):def __init__(self):self.current_transactions = []self.chain = []# 創建“創世塊”self.new_block(previous_hash=1, proof=100)def new_block(self, proof, previous_hash=None):"""生成新塊:param proof: <int> 工作量證明,它是一個工作算法對應的一個值:param previous_hash: (Optional) <str> 前一個區塊的hash值:return: <dict> 返回一個新的塊,這個塊block是一個字典結構"""block = {# 新block對應的index'index': len(self.chain) + 1,# 時間戳,記錄區塊創建的時間'timestamp': time(),# 記錄當前的交易記錄,即通過new_transactions創建的交易,記錄在這個新的block里'transactions': self.current_transactions,# 工作量證明'proof': proof,# 前一個block對應的hash值'previous_hash': previous_hash or self.hash(self.chain[-1]),}# 重置當前的交易,用于記錄下一次交易self.current_transactions = []# 將新生成的block添加到block列表中self.chain.append(block)# 返回新創建的blcokreturn blockdef new_transaction(self, sender, recipient, amount):"""生成新交易信息,信息將加入到下一個待挖的區塊中:param sender: <str> 發送者的地址:param recipient: <str> 接受者的地址:param amount: <int> 交易額度:return: <int> 返回新的Block的Id值,新產生的交易將會被記錄在新的Block中"""# 實現很簡單,向交易列表中添加一個字典,這個字典中記錄交易雙發的信息self.current_transactions.append({'sender': sender,'recipient': recipient,'amount': amount,})# 返回最后一個區塊的index加上1,即對應到新的區塊上return self.last_block['index'] + 1@staticmethoddef hash(block):"""生成塊的 SHA-256 hash值:param block: <dict> Block:return: <str>"""# 首先將block字典結構轉換成json字符串,通過sort_keys指定按key拍好序。block_string = json.dumps(block, sort_keys=True).encode()# 調用sha256函數求取摘要return hashlib.sha256(block_string).hexdigest()@propertydef last_block(self):return self.chain[-1]def proof_of_work(self, last_proof):"""簡單的工作量證明:- 查找一個數 p 使得 hash(p+last_proof) 以'abc'開頭- last_proof 是上一個塊的證明, p是當前的證明:param last_proof: <int>:return: <int>"""proof = 0# 定義一個死循環,直到valid_proof驗證通過while self.valid_proof(last_proof, proof) is False:proof += math.pireturn proof@staticmethoddef valid_proof(last_proof, proof):"""驗證證明: 是否hash(last_proof, proof)以'abc'開頭?:param last_proof: <int> 前一個證明:param proof: <int> 當前證明:return: <bool> """guess = f'{last_proof}{proof}'.encode()guess_hash = hashlib.sha256(guess).hexdigest()return guess_hash[:3] == "abc"#實例化一個Flask節點 app = Flask(__name__)# 為當前節點生成一個全局唯一的地址,使用uuid4方法 node_identifier = str(uuid4()).replace('-', '')#初始化區塊鏈 blockchain = Blockchain()# 告訴服務器去挖掘新的區塊 @app.route('/mine', methods=['GET']) def mine():#獲取區塊鏈最后一個blocklast_block = blockchain.last_block#取出最后一個block的proof工作量證明last_proof = last_block['proof']# 運行工作量的證明和驗證算法,得到proof。proof = blockchain.proof_of_work(last_proof)# 給工作量證明的節點提供獎勵.# 發送者為 "0" 表明是新挖出的幣# 接收者是我們自己的節點,即上面生成的node_identifier。實際中這個值可以用用戶的賬號。blockchain.new_transaction(sender="0",recipient=node_identifier,amount=1,)# 產生一個新的區塊,并添加到區塊鏈中block = blockchain.new_block(proof)#構造返回響應信息response = {'message': "New Block Forged",'index': block['index'],'transactions': block['transactions'],'proof': block['proof'],'previous_hash': block['previous_hash'],}return jsonify(response), 200# 創建一個交易并添加到區塊,POST接口可以給接口發送交易數據 @app.route('/transactions/new', methods=['POST']) def new_transaction():#獲取請求的參數,得到參數的json格式數據values = request.get_json()print('request parameters:%s'%(values))#檢查請求的參數是否合法,包含sender,recipient,amount幾個字段required = ['sender', 'recipient', 'amount']if not all(k in values for k in required):return 'Missing values', 400# 使用blockchain的new_transaction方法創建新的交易index = blockchain.new_transaction(values['sender'], values['recipient'], values['amount'])#構建response信息response = {'message': f'Transaction will be added to Block {index}'}#返回響應信息return jsonify(response), 201#返回整個區塊鏈,GET接口 @app.route('/chain', methods=['GET']) def full_chain():response = {'chain': blockchain.chain,'length': len(blockchain.chain),}return jsonify(response), 200if __name__ == '__main__':#服務器運行在5000端口上app.run(host='localhost', port=5000)總結
以上是生活随笔為你收集整理的python实现简单区块链的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拜占庭共识Tendermint介绍及简单
- 下一篇: Python 多因素方差分析