import hashlib
import time
# 区块类
class Block:
def __init__(self, index, previous_hash, timestamp, data, nonce=0):
self.index = index # 区块编号
self.previous_hash = previous_hash # 前一个区块的哈希值
self.timestamp = timestamp # 时间戳
self.data = data # 区块存储的数据
self.nonce = nonce # 随机数,用于挖矿
self.hash = self.calculate_hash() # 当前区块的哈希值
# 计算区块的哈希值
def calculate_hash(self):
value = str(self.index) + str(self.previous_hash) + str(self.timestamp) + str(self.data) + str(self.nonce)
return hashlib.sha256(value.encode()).hexdigest()
# 挖矿函数,调整nonce直到找到符合难度要求的哈希值
def mine_block(self, difficulty):
target = '0' * difficulty # 挖矿目标:前 difficulty 个字符为0
while self.hash[:difficulty] != target:
self.nonce += 1
self.hash = self.calculate_hash()
print(f"Block mined: {self.hash}")
# 区块链类
class Blockchain:
def __init__(self):
self.chain = [self.create_genesis_block()] # 创建创世区块
self.difficulty = 4 # 挖矿难度
# 创建创世区块(链上第一个区块)
def create_genesis_block(self):
return Block(0, "0", time.time(), "Genesis Block")
# 获取当前区块链中的最后一个区块
def get_latest_block(self):
return self.chain[-1]
# 向区块链添加新区块
def add_block(self, new_block):
new_block.previous_hash = self.get_latest_block().hash # 设置前一个区块的哈希值
new_block.mine_block(self.difficulty) # 挖矿
self.chain.append(new_block) # 添加新区块到链上
# 运行区块链
if __name__ == "__main__":
# 创建区块链实例
my_blockchain = Blockchain()
# 添加一些区块到区块链
print("Mining block 1...")
block_data = "First block data"
my_blockchain.add_block(Block(1, "", time.time(), block_data))
print("Mining block 2...")
block_data = "Second block data"
my_blockchain.add_block(Block(2, "", time.time(), block_data))
print("Mining block 3...")
block_data = "Third block data"
my_blockchain.add_block(Block(3, "", time.time(), block_data))
# 输出区块链中所有区块的信息
for block in my_blockchain.chain:
print(f"Block #{block.index}")
print(f"Previous Hash: {block.previous_hash}")
print(f"Timestamp: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(block.timestamp))}")
print(f"Data: {block.data}")
print(f"Hash: {block.hash}")
print(f"Nonce: {block.nonce}\n")
代码解释
-
区块(Block):
- 区块类保存区块的编号(
index
)、前一个区块的哈希值(previous_hash
)、时间戳(timestamp
)、数据(data
)、随机数(nonce
)和当前区块的哈希值(hash
)。 calculate_hash()
函数用于计算区块的哈希值,使用了 SHA256 加密。mine_block()
函数是一个简单的工作量证明机制,寻找满足前difficulty
个字符为 0 的哈希值。
- 区块类保存区块的编号(
-
区块链(Blockchain):
- 区块链类维护一个链表(
chain
),保存所有的区块,并通过挖矿将新区块添加到链中。 create_genesis_block()
函数创建了区块链的第一个区块(创世区块),其previous_hash
设置为0
。add_block()
函数负责将新区块添加到区块链中,并在添加之前对该区块进行挖矿。
- 区块链类维护一个链表(
-
挖矿机制:
- 挖矿通过不断调整区块的
nonce
来找到符合挖矿难度要求的哈希值(前difficulty
个字符为 0)。 - 挖矿成功后,将新区块添加到链上,并打印挖矿结果。
- 挖矿通过不断调整区块的
-
运行结果示例:
- 挖矿完成后,代码会输出区块链中所有区块的信息,包括区块的哈希值、前一个区块的哈希值、时间戳、数据和
nonce
- 挖矿完成后,代码会输出区块链中所有区块的信息,包括区块的哈希值、前一个区块的哈希值、时间戳、数据和
总结
这个 Python 实现的区块链是一个基础模型,它展示了区块链的核心概念:区块、哈希链接、工作量证明等。这种简单的实现可以帮助理解区块链技术的工作原理,并为进一步的扩展(如智能合约、交易等功能)提供了良好的基础