目錄
前言
一、代碼展示
二、代碼注釋
1.簡單的區(qū)塊鏈模擬實現(xiàn),這段代碼定義了一個簡單的區(qū)塊鏈類,可以創(chuàng)建一個新的區(qū)塊鏈,并能夠添加新的區(qū)塊到鏈上,同時獲取最新的區(qū)塊信息。這個模擬的區(qū)塊鏈可以用于教學或演示區(qū)塊鏈的基本概念。
2.這段代碼是一個簡單的工作量證明(Proof of Work)算法的實現(xiàn),它是區(qū)塊鏈技術(shù)中的一個關(guān)鍵概念。工作量證明是一種用來防止網(wǎng)絡(luò)濫用和垃圾信息的機制,它要求用戶在進行某些操作(如創(chuàng)建新區(qū)塊)之前,必須完成一項計算工作。這個計算工作通常是解決一個難題,而解決這個難題的“答案”就是工作量證明。
3.這段代碼定義了一個名為 hash 的方法,它屬于 Blockchain 類,用于計算區(qū)塊鏈中某個區(qū)塊的哈希值。哈希值是區(qū)塊內(nèi)容的唯一表示,它是通過哈希函數(shù)對區(qū)塊數(shù)據(jù)進行計算得到的。在區(qū)塊鏈中,哈希值用于確保數(shù)據(jù)的完整性和不可篡改性。
5、這段代碼展示了如何使用 Flask 框架創(chuàng)建一個簡單的 Web 應(yīng)用程序,并結(jié)合之前定義的 Blockchain 類和相關(guān)方法來實現(xiàn)一個區(qū)塊鏈挖礦的功能。
6、這段代碼定義了一個 Flask 應(yīng)用程序的路由處理函數(shù),用于響應(yīng)客戶端對 /get_chain 路徑的 GET 請求。當這個路徑被訪問時,這個函數(shù)將返回當前區(qū)塊鏈的完整數(shù)據(jù)和一個表示鏈長度的計數(shù)。
7、這段代碼是Flask應(yīng)用中的一個路由處理函數(shù),用于檢查區(qū)塊鏈的完整性和有效性
8、這行代碼是 Flask 應(yīng)用程序的啟動命令,它會啟動一個本地開發(fā)服務(wù)器,使得應(yīng)用程序能夠響應(yīng)外部的 HTTP 請求
三、擴展(postman測試)
總結(jié)
前言
本文演示了如何創(chuàng)建一個簡單的區(qū)塊鏈,并使用 Flask 框架提供一個簡單的 Web 接口來與區(qū)塊鏈交互。
一、代碼展示
# Module 1 -Create a Blockchain
#時間戳
import datetime
import hashlib
import json
#Flask可以定義Web應(yīng)用的路由(URL到Python函數(shù)的映射),并處理HTTP請求和響應(yīng)。jsonify是一個函數(shù),用于將Python對象轉(zhuǎn)換為JSON格式的響應(yīng)。當你在Flask路由函數(shù)中返回一個jsonify對象時,F(xiàn)lask會自動將該對象對應(yīng)的數(shù)據(jù)轉(zhuǎn)換為JSON格式,并設(shè)置合適的HTTP響應(yīng)頭,以便客戶端可以正確解析響應(yīng)內(nèi)容。
from flask import Flask, jsonify
# 1******
class Blockchain:
def __init__(self):
self.chain=[]
self.create_block(proof=1,previous_hash='0')
def create_block(self,proof,previous_hash):
block={'index':len(self.chain)+1,
'timestamp':str(datetime.datetime.now()),
'proof':proof,
'previous_hash':previous_hash}
self.chain.append(block)
return block
def get_previous_block(self):
return self.chain[-1]
def proof_of_work(self,previous_proof):
new_proof=1
check_proof=False
while check_proof is False:
hash_oparation=hashlib.sha256(str(new_proof**2-previous_proof**2).encode()).hexdigest()
if hash_oparation[:4]=='0000':
check_proof=True
else:
new_proof+=1
return new_proof
def hash(self, block):
encode_block = json.dumps(block, sort_keys=True).encode()
return hashlib.sha256(encode_block).hexdigest()
def is_chain_valid(self,chain):
previous_block=chain[0]
block_index=1
while block_index<len(chain):
block=chain[block_index]
if block['previous_hash'] !=self.hash(previous_block):
return False
previous_proof=previous_block['proof']
proof=block['proof']
hash_oparation=hashlib.sha256(str(proof**2-previous_proof**2).encode()).hexdigest()
if hash_oparation[:4] !='0000':
return False
previous_block=block
block_index+=1
return True
#Part 2 -Mining our Blockchain
#Creating a Web App
app = Flask(__name__)
#Creating a Blockchain
blockchain=Blockchain()
#Mining a new block
@app.route('/mine_block',methods=['GET'])
def mine_block():
previous_block=blockchain.get_previous_block()
previous_proof=previous_block['proof']
proof=blockchain.proof_of_work(previous_proof)
previous_hash=blockchain.hash(previous_block)
block=blockchain.create_block(proof, previous_hash)
response={'message':'Congratulation,you just mined a block',
'index':block['index'],
'timestamp':block['timestamp'],
'proof':block['proof'],
'previous_hash':block['previous_hash']}
return jsonify(response),200
#Getting the full Blockchain
@app.route('/get_chain',methods=['GET'])
def get_chain():
response={'chain':blockchain.chain,
'length':len(blockchain.chain)}
return jsonify(response),200
#Checking if the Blockchain
@app.route('/is_valid',methods=['GET'])
def get_valid():
is_valid=blockchain.is_chain_valid(blockchain.chain)
if is_valid:
response={'message':'All good. The Blockchain is valid.'}
else:
response={'message':'Houston,we have a problem.The Blockchain is not valid.'}
return jsonify(response),200
app.run(host='0.0.0.0',port=5000)
二、代碼注釋
1.簡單的區(qū)塊鏈模擬實現(xiàn),這段代碼定義了一個簡單的區(qū)塊鏈類,可以創(chuàng)建一個新的區(qū)塊鏈,并能夠添加新的區(qū)塊到鏈上,同時獲取最新的區(qū)塊信息。這個模擬的區(qū)塊鏈可以用于教學或演示區(qū)塊鏈的基本概念。
#這行代碼導入了Python的datetime模塊,用于處理日期和時間。
import datetime
#這行代碼導入了hashlib模塊,用于生成哈希值,但在這段代碼中并未使用到。
import hashlib
#用于處理JSON數(shù)據(jù)格式,但在這段代碼中并未使用到
import json
#從flask模塊中導入了Flask和jsonify兩個對象。Flask是一個輕量級的Web應(yīng)用框架,jsonify是一個函數(shù),用于將Python對象轉(zhuǎn)換為JSON格式的響應(yīng)。
from flask import Flask,jsonify
#定義了一個名為Blockchain的類,用于模擬區(qū)塊鏈的基本功能。
class Blockchain:
#這是Blockchain類的構(gòu)造函數(shù),用于初始化區(qū)塊鏈實例。在這個函數(shù)中,創(chuàng)建了一個空字典self.chain來存儲區(qū)塊鏈中的區(qū)塊,并通過調(diào)用self.create_block()方法創(chuàng)建了第一個區(qū)塊。
?? ?def __init__(self):
?? ??? ?self.chain=[]
#,創(chuàng)建了區(qū)塊鏈的第一個區(qū)塊。proof參數(shù)設(shè)置為1,previous_hash參數(shù)設(shè)置為字符串'0'。
?? ??? ?self.create_block(proof=1,previous_hash='0')
?? ??? ?
#這是Blockchain類的一個方法,用于創(chuàng)建一個新的區(qū)塊并將其添加到區(qū)塊鏈中。方法接收兩個參數(shù):proof(工作量證明值)和previous_hash(前一個區(qū)塊的哈希值)。
?? ?def create_block(self,proof,previous_hash):
#這行代碼創(chuàng)建了一個新的字典block,它代表一個新的區(qū)塊。index鍵對應(yīng)的值是當前區(qū)塊鏈中區(qū)塊的數(shù)量加1,即新創(chuàng)建的區(qū)塊的索引。
?? ??? ?block={'index':len(self.chain)+1,
?? ??? ??? ??? ?'timetamp':str(datetime.datetime.now()),
#block字典添加了proof鍵,其值是創(chuàng)建區(qū)塊時提供的工作量證明值。
?? ??? ??? ??? ?'proof':proof,
?? ??? ??? ??? ?'previous_hash':previous_hash}
#新創(chuàng)建的區(qū)塊添加到self.chain字典列表中,從而將新區(qū)塊添加到區(qū)塊鏈中。
?? ??? ?self.blain.append(block)
#返回新創(chuàng)建的區(qū)塊,可以用于驗證或顯示新區(qū)塊的信息。
?? ??? ?return block
#這是Blockchain類的一個方法,用于獲取區(qū)塊鏈中的最后一個區(qū)塊。
?? ?def get_previous_block(self):
#這行代碼返回self.chain列表中的最后一個元素,即最新的區(qū)塊
?? ??? ?return self.chain[-1]?
2.這段代碼是一個簡單的工作量證明(Proof of Work)算法的實現(xiàn),它是區(qū)塊鏈技術(shù)中的一個關(guān)鍵概念。工作量證明是一種用來防止網(wǎng)絡(luò)濫用和垃圾信息的機制,它要求用戶在進行某些操作(如創(chuàng)建新區(qū)塊)之前,必須完成一項計算工作。這個計算工作通常是解決一個難題,而解決這個難題的“答案”就是工作量證明。
#這行代碼定義了一個名為proof_of_work的方法,它屬于之前定義的Blockchain類。這個方法接收一個參數(shù)previous_proof,它代表前一個區(qū)塊的工作量證明值。
def_proof_of_work(self,previous_proof)
#這行代碼初始化一個新的變量new_proof,它的初始值設(shè)為1。這個變量將用于生成新的工作量證明。
?? ?new_proof=1
#初始化一個布爾變量check_proof,用于檢查新生成的工作量證明是否滿足條件。初始值設(shè)為False,表示還沒有找到滿足條件的工作量證明。
?? ?check_proof=False
#它會一直執(zhí)行,直到check_proof變量的值為True,即找到了滿足條件的工作量證明。
?? ?while check_proof is False:
#這行代碼執(zhí)行了核心的哈希計算操作。首先,它計算new_proof的平方減去previous_proof的平方的結(jié)果,然后將這個結(jié)果轉(zhuǎn)換為字符串,并進行SHA-256哈希運算。hashlib.sha256()是Python中用于SHA-256算法的函數(shù),.encode()將字符串轉(zhuǎn)換為字節(jié)流,以便進行哈希運算。.hexdigest()將哈希結(jié)果轉(zhuǎn)換為十六進制字符串。
?? ??? ?hash_oparation=hashlib.sha256(str(new_proof**2-previous_proof**2).encode()).hexdigest()
#檢查哈希結(jié)果的前四個字符是否為'0000'。這是工作量證明的條件,意味著新生成的工作量證明必須滿足這個條件才能被接受。
?? ??? ?if hash_oparation[:4]='0000':
?? ??? ??? ?check_proof=Ture
?? ??? ?else
?? ??? ??? ?new_proof+=1
?? ?return new_proof
3.這段代碼定義了一個名為 hash 的方法,它屬于 Blockchain 類,用于計算區(qū)塊鏈中某個區(qū)塊的哈希值。哈希值是區(qū)塊內(nèi)容的唯一表示,它是通過哈希函數(shù)對區(qū)塊數(shù)據(jù)進行計算得到的。在區(qū)塊鏈中,哈希值用于確保數(shù)據(jù)的完整性和不可篡改性。
#它接收一個參數(shù) block,這個參數(shù)代表一個區(qū)塊的數(shù)據(jù)。在區(qū)塊鏈的上下文中,一個區(qū)塊通常包含多個字段,如 index、timestamp、proof、previous_hash 等。
def_hash(self,block):
#首先使用 json.dumps() 函數(shù)將區(qū)塊數(shù)據(jù) block 轉(zhuǎn)換為 JSON 格式的字符串。sort_keys=True 參數(shù)確保 JSON 字符串的輸出是鍵值對排序后的格式,這有助于生成一致的哈希值。接著,.encode() 方法將 JSON 字符串轉(zhuǎn)換為字節(jié)串,這是因為哈希函數(shù)需要一個字節(jié)串作為輸入。
?? ?encode_block=json.dumps(block,sort_keys=True).encode()
#使用 hashlib.sha256() 函數(shù)對字節(jié)串 encode_block 進行 SHA-256 哈希計算。SHA-256 是一種加密哈希函數(shù),它可以將任意長度的輸入數(shù)據(jù)轉(zhuǎn)換為固定長度(256位)的哈希值。.hexdigest() 方法將計算得到的哈希值轉(zhuǎn)換為十六進制字符串形式,并返回這個字符串作為區(qū)塊的哈希值。
?? ?return hashlib.sha256(encode_block).hexdigest()
4、這段代碼定義了一個名為 is_chain_valid
的方法,它用于驗證一個區(qū)塊鏈的有效性。具體來說,它檢查鏈中的每個區(qū)塊的 previous_hash
值是否與其前一個區(qū)塊的哈希值相匹配,以及每個區(qū)塊的工作量證明(Proof of Work)是否滿足特定條件。
def is_chain_valid(self,chain):
#將區(qū)塊鏈中的第一個區(qū)塊賦值給變量 previous_block。這個區(qū)塊是初始的“創(chuàng)世區(qū)塊”,它的 previous_hash 通常設(shè)置為一個特定的值(如 '0' 或 '0000' 等)。
? ? ? ? previous_block=chain[0]
#碼初始化一個變量 block_index,用于跟蹤當前正在驗證的區(qū)塊在區(qū)塊鏈中的索引位置。由于 previous_block 是第一個區(qū)塊,所以從索引 1 開始。
? ? ? ? block_index=1
#用于遍歷區(qū)塊鏈中的每個區(qū)塊。循環(huán)條件是 block_index 小于區(qū)塊鏈的長度,確保每個區(qū)塊都被檢查。
? ? ? ? while block_index<len(chain):
#根據(jù) block_index 的值獲取當前正在驗證的區(qū)塊。
? ? ? ? ? block=chain[block_index]
#檢查當前區(qū)塊的 previous_hash 字段是否與 previous_block 經(jīng)過 self.hash() 方法計算后的哈希值相匹配。如果不匹配,說明區(qū)塊鏈的連續(xù)性被破壞,即某個區(qū)塊被篡改或替換,因此返回 False。
? ? ? ? ? if block['previous_hash'] !=self.hash(previous_block):
? ? ? ? ? ? ? return False
#獲取 previous_block 的 proof 字段值,并將其賦值給變量 previous_proof。
? ? ? ? ? previous_proof=previous_block['proof']
? ? ? ? ? proof=block['proof']
? ? ? ? ? hash_oparation=hashlib.sha256(str(proof**2-previous_proof**2).encode()).hexdigest()
? ? ? ? ? if hash_oparation[:4] !='0000':
? ? ? ? ? ? ? return False
#更新 previous_block 變量,將其設(shè)置為當前正在驗證的區(qū)塊 block。
? ? ? ? ? previous_block=block
#增加 block_index 的值,以便在下一次循環(huán)中驗證下一個區(qū)塊。
? ? ? ? ? block_index+=1
? ? ? ? return True
這個方法是區(qū)塊鏈安全性的一個重要保障,確保了區(qū)塊鏈的不可篡改性和數(shù)據(jù)的完整性。通過驗證每個區(qū)塊的哈希值和工作量證明,可以確保區(qū)塊鏈的每個區(qū)塊都是按照正確的順序和規(guī)則添加的。
5、這段代碼展示了如何使用 Flask 框架創(chuàng)建一個簡單的 Web 應(yīng)用程序,并結(jié)合之前定義的 Blockchain 類和相關(guān)方法來實現(xiàn)一個區(qū)塊鏈挖礦的功能。
#創(chuàng)建了一個 Flask 應(yīng)用程序?qū)嵗?br> app=Flask(__name__)
#創(chuàng)建了一個 Blockchain 類的實例,這個實例將用于管理區(qū)塊鏈數(shù)據(jù)。
blockchain=Blockchain()
#這是一個裝飾器,用于定義 Flask 應(yīng)用程序的路由。當用戶訪問 /mine_block 路徑時,并且請求方法為 GET,就會調(diào)用 mine_block 函數(shù)。
@app.route('mine_block',methods=['GET'])
#定義了一個名為 mine_block 的函數(shù),它是 /mine_block 路徑的處理函數(shù)。
def mine_block():
#這行代碼調(diào)用 blockchain 實例的 get_previous_block 方法來獲取區(qū)塊鏈中最后一個區(qū)塊的信息。
?? ? previous_block=blockchain.get_previous_block()
#這行代碼從上一個區(qū)塊中提取 proof(工作量證明)值。
?? ? previous_proof=previous_block['proof']
#這行代碼調(diào)用 blockchain 實例的 proof_of_work 方法來計算新的工作量證明值。
? ? ?proof=blockchain.proof_of_work(previous_proof)
#這行代碼調(diào)用 blockchain 實例的 hash 方法來獲取上一個區(qū)塊的哈希值。
? ? ?previous_hash=blockchain.hash(previous_block)
#這行代碼調(diào)用 blockchain 實例的 create_block 方法來創(chuàng)建一個新的區(qū)塊,新的區(qū)塊包含新的工作量證明值和上一個區(qū)塊的哈希值。
? ? ?block=blockchain.create_block(proof, previous_hash)
#這行代碼創(chuàng)建了一個字典 response,用于存儲響應(yīng)信息。這個字典包含了恭喜消息、新挖礦區(qū)塊的索引、時間戳、工作量證明值和前一個區(qū)塊的哈希值。
? ? ?response={'message':'Congratulation,you just mined a block',
? ? ? ? ? ? 'index':block['index'],
? ? ? ? ? ? ?'timestamp':block['timestamp'],
? ? ? ? ? ? ?'proof':block['proof'],
? ? ? ? ? ? ?'previous_hash':block['previous_hash']}
#這行代碼使用 Flask 的 jsonify 函數(shù)將 response 字典轉(zhuǎn)換為 JSON 格式的響應(yīng),并返回狀態(tài)碼 200。200 表示請求成功。
? ? ? ? return jsonify(response),200
這段代碼通過 Flask 創(chuàng)建了一個 Web 應(yīng)用程序,用戶可以通過訪問 /mine_block
路徑來觸發(fā)挖礦過程。應(yīng)用程序?qū)?zhí)行工作量證明算法來創(chuàng)建一個新的區(qū)塊,并將其添加到區(qū)塊鏈中。然后,它會向用戶返回新挖礦區(qū)塊的相關(guān)信息。這是一個簡單但有效的區(qū)塊鏈挖礦 Web 應(yīng)用程序的實現(xiàn)。
6、這段代碼定義了一個 Flask 應(yīng)用程序的路由處理函數(shù),用于響應(yīng)客戶端對 /get_chain 路徑的 GET 請求。當這個路徑被訪問時,這個函數(shù)將返回當前區(qū)塊鏈的完整數(shù)據(jù)和一個表示鏈長度的計數(shù)。
@app.route('/get_chain',methods=['GET'])
def get_chain():
#在 get_chain 函數(shù)內(nèi)部,創(chuàng)建了一個名為 response 的字典,它包含兩個鍵值對。第一個鍵值對是 'chain',它的值是 blockchain 實例的 chain 屬性,這是一個包含區(qū)塊鏈中所有區(qū)塊的列表。第二個鍵值對是 'length',它的值是 blockchain.chain 的長度,即區(qū)塊鏈中區(qū)塊的數(shù)量。
?? ?response={'chain':blockchain.chain,
? ? ? ? ? ? ?'length':len(blockchain.chain)}
? ? return jsonify(response),200
客戶端(如 Web 瀏覽器或其他 HTTP 客戶端)向 Flask 應(yīng)用程序發(fā)送一個 GET
請求到 /get_chain
路徑時,應(yīng)用程序?qū)⒄{(diào)用 get_chain
函數(shù),并將當前區(qū)塊鏈的完整數(shù)據(jù)和區(qū)塊數(shù)量作為 JSON 響應(yīng)返回給客戶端。這樣,客戶端就可以查看和驗證區(qū)塊鏈的狀態(tài)。這個功能對于區(qū)塊鏈的透明度和可審計性是非常重要的。
7、這段代碼是Flask應(yīng)用中的一個路由處理函數(shù),用于檢查區(qū)塊鏈的完整性和有效性
#Checking if the Blockchain
@app.route('/is_valid',methods=['GET'])?
定義了一個名為get_valid的函數(shù),它是當訪問/is_valid路由時被調(diào)用的。
def get_valid():
這一行調(diào)用了Blockchain類的一個方法is_chain_valid,傳入了blockchain.chain作為參數(shù)。blockchain.chain是存儲區(qū)塊鏈數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(在這個例子中是一個列表)。is_chain_valid方法會檢查區(qū)塊鏈的每個區(qū)塊,確保它們的哈希值和前一個區(qū)塊的哈希值是正確的,以及每個區(qū)塊的工作量證明(Proof of Work)也是正確的。如果所有檢查都通過,它會返回True,表示區(qū)塊鏈是有效的;
? ? is_valid=blockchain.is_chain_valid(blockchain.chain)
? ? if is_valid:
? ? ? ? response={'message':'All good. The Blockchain is valid.'}
? ? else:
? ? ? ? response={'message':'Houston,we have a problem.The Blockchain is not valid.'}
? ? return jsonify(response),200
8、這行代碼是 Flask 應(yīng)用程序的啟動命令,它會啟動一個本地開發(fā)服務(wù)器,使得應(yīng)用程序能夠響應(yīng)外部的 HTTP 請求
app.run(host='0.0.0.0',port=5000)?
三、擴展(postman測試)
運行成功以后
1、模擬挖礦過程,并在區(qū)塊鏈上創(chuàng)建一個新的區(qū)塊:在postman輸入http://127.0.0.1:5000/mine_block(網(wǎng)址得看你運行成功以后給出的是什么,我給出的是這個)
2、查看當前區(qū)塊鏈的狀態(tài),包括所有已經(jīng)挖掘的區(qū)塊和區(qū)塊鏈的總長度:在postman中輸入“http://127.0.0.1:5000/get_chain”
3、驗證區(qū)塊鏈是否有效:輸入“http://127.0.0.1:5000/is_valid”
文章來源:http://www.zghlxwxcb.cn/news/detail-851011.html
總結(jié)
總的來說,這段代碼演示了如何創(chuàng)建一個簡單的區(qū)塊鏈,并使用 Flask 框架提供一個簡單的 Web 接口來與區(qū)塊鏈交互。用戶可以通過 GET 請求來挖礦、獲取區(qū)塊鏈信息和驗證區(qū)塊鏈的有效性。這個示例展示了區(qū)塊鏈技術(shù)的基本概念和 Flask Web 應(yīng)用的創(chuàng)建與路由處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-851011.html
到了這里,關(guān)于創(chuàng)建一個簡單的區(qū)塊鏈,并使用 Flask 框架提供一個簡單的 Web 接口來與區(qū)塊鏈交互。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!