通常Python自带hashlib,无需额外安装
Python区块链应用代码:从零构建你的第一个区块链
区块链技术以其去中心化、不可篡改和透明可追溯的特性,正在金融、供应链、物联网等多个领域引发变革,Python,凭借其简洁的语法、丰富的库生态和强大的开发效率,成为区块链应用开发的热门选择,本文将带你了解如何使用Python编写区块链应用代码,从核心概念到实践实现,助你快速入门。
区块链核心概念回顾
在动手编写代码前,我们先简要回顾区块链的核心组成部分:
- 区块(Block):记录了一定时间内的交易数据,包含区块头(前一区块哈希、本区块哈希、时间戳、随机数等)和区块体(交易列表)。
- 链(Chain):由区块通过密码学方法按时间顺序串联而成,每个区块都指向前一个区块,形成不可篡改的链条。
- 哈希(Hash):将任意长度的输入数据转换为固定长度的输出值(如SHA-256),用于确保数据完整性和区块链接。
- 工作量证明(Proof of Work, PoW):一种共识机制,矿工通过不断尝试随机数(Nonce),使得区块头的哈希值满足特定条件(如前若干位为0),从而获得记账权。
- 交易(Transaction):区块链中数据的基本单元,如转账记录。
使用Python构建简单区块链
下面,我们将用Python实现一个简化版的区块链,这个区块链将包含区块创建、添加、挖矿以及验证等功能。
环境准备
确保你的Python环境已安装,我们将使用hashlib库来进行哈希计算。
定义区块结构
我们定义一个Block类,用于表示区块链中的每一个区块。

s="brush:python;toolbar:false">import hashlib
import time
class Block:
def __init__(self, index, previous_hash, timestamp, data, hash):
self.index = index # 区块索引
self.previous_hash = previous_hash # 前一个区块的哈希值
self.timestamp = timestamp # 时间戳
self.data = data # 区块数据(如交易信息)
self.hash = hash # 本区块的哈希值
self.nonce = 0 # 用于工作量证明的随机数
def __str__(self):
return f"Block #{self.index}\nPrevious Hash: {self.previous_hash}\nTimestamp: {self.timestamp}\nData: {self.data}\nHash: {self.hash}\nNonce: {self.nonce}"
创建创世区块
区块链的第一个区块称为“创世区块”(Genesis Block),它没有前一个区块。
def create_genesis_block():
"""
创建创世区块
"""
genesis_block_index = 0
genesis_block_previous_hash = "0" # 创世区块的前哈希为0
genesis_block_timestamp = time.time()
genesis_block_data = "Genesis Block" # 创世区块数据
genesis_block_hash = calculate_hash(genesis_block_index, genesis_block_previous_hash, genesis_block_timestamp, genesis_block_data, 0)
return Block(genesis_block_index, genesis_block_previous_hash, genesis_block_timestamp, genesis_block_data, genesis_block_hash)
哈希计算函数
编写一个函数来计算区块的哈希值,我们将区块的各个属性拼接后进行SHA-256哈希。
def calculate_hash(index, previous_hash, timestamp, data, nonce):
"""
计算区块的哈希值
"""
value = str(index) + str(previous_hash) + str(timestamp) + str(data) + str(nonce)
return hashlib.sha256(value.encode('utf-8')).hexdigest()
工作量证明(PoW)与挖矿
挖矿就是通过不断调整nonce,使得区块的哈希值满足特定难度条件(前4位为0)。
def proof_of_work(block, difficulty=4):
"""
工作量证明,挖矿
:param block: 要挖矿的区块
:param difficulty: 难度,控制哈希值前导0的个数
:return: 挖矿成功的区块
"""
target = "0" * difficulty
while block.hash[:difficulty] != target:
block.nonce += 1
block.hash = calculate_hash(block.index, block.previous_hash, block.timestamp, block.data, block.nonce)
print(f"Block mined: {block.hash}")
return block
创建新区块并添加到链中
编写一个函数来创建新区块,并将其添加到现有的区块链中。
def create_new_block(blockchain, data):
"""
创建新区块并添加到区块链
:param blockchain: 现有的区块链
:param data: 新区块的数据
:return: 更新后的区块链
"""
previous_block = blockchain[-1]
new_block_index = previous_block.index + 1
new_block_timestamp = time.time()
new_block_previous_hash = previous_block.hash
new_block_data = data
new_block_hash = calculate_hash(new_block_index, new_block_previous_hash, new_block_timestamp, new_block_data, 0) # 初始哈希,PoW后会变
new_block = Block(new_block_index, new_block_previous_hash, new_block_timestamp, new_block_data, new_block_hash)
# 挖矿
mined_block = proof_of_work(new_block)
blockchain.append(mined_block)
return blockchain
验证区块链的有效性
为了确保区块链没有被篡改,我们需要验证其有效性。
def is_chain_valid(blockchain):
"""
验证区块链是否有效
:param blockchain: 要验证的区块链
:return: True if valid, False otherwise
"""
for i in range(1, len(blockchain)):
current_block = blockchain[i]
previous_block = blockchain[i-1]
# 检查当前区块的前哈希是否等于前一个区块的哈希
if current_block.previous_hash != previous_block.hash:
print(f"Invalid blockchain: Previous hash of block {current_block.index} does not match block {previous_block.index}'s hash.")
return False
# 检查当前区块的哈希是否正确(重新计算并与当前区块的哈希比较)
recalculated_hash = calculate_hash(current_block.index, current_block.previous_hash, current_block.timestamp, current_block.data, current_block.nonce)
if current_block.hash != recalculated_hash:
print(f"Invalid blockchain: Hash of block {current_block.index} is incorrect.")
return False
# 检查工作量证明是否有效(假设难度为4)
if current_block.hash[:4] != "0000":
print(f"Invalid blockchain: Block {current_block.index} does not satisfy PoW.")
return False
return True
主程序与测试
将上述部分组合起来,创建我们的区块链并进行测试。
if __name__ == "__main__":
# 创建区块链并添加创世区块
blockchain = [create_genesis_block()]
print("Genesis block created:")
print(blockchain[0])
print("\n" + "="*50 + "\n")
# 添加几个新区块
blockchain = create_new_block(blockchain, "First Block after Genesis")
print("New block added:")
print(blockchain[-1])
print("\n" + "="*50 + "\n")
blockchain = create_new_block(blockchain, "Second Block after Genesis")
print("New block added:")
print(blockchain[-1])
print("\n" + "="*50 + "\n")
blockchain = create_new_block(blockchain, "Third Block after Genesis")
print("New block added:")
print(blockchain[-1])
print("\n" + "="*50 + "\n")
# 打印整个区块链
print("Current Blockchain:")
for block in blockchain:
print(block)
print("-" * 20)
# 验证区块链
print("\nIs blockchain valid?", is_chain_valid(blockchain))
# 尝试篡改一个区块(例如修改第二个区块的数据)
print("\nTampering with block 1 data...")
blockchain[1].data = "Tampered Data"
print("Block 1 data changed to:", blockchain[1].data)
# 再次验证区块链
print("\nIs blockchain valid after tampering?", is_chain_valid(blockchain))
运行与结果分析
运行上述代码,你将看到创世区块的创建、新区块的挖矿过程、区块链的打印以及验证结果,当你篡改一个区块的数据后,再次验证会发现区块链无效,这体现了区块链的不可篡改性特性。
Python区块链应用拓展
上述只是一个非常基础的区块链实现,真实的区块链应用远比这复杂,Python在其中的应用也非常广泛