定义区块结构
import hashlib
from datetime import datetime
class Block:
"""
区块结构
prev_hash: 父区块哈希值
data: 区块内容
timestamp: 区块创建时间 ---时间戳
hash: 区块哈希值 ---简化了没有考虑Nonce值只计算前三个参数的hash值
Nonce: 增加随机数字段
"""
def __init__(self, data, prev_hash):
# 将传入的父哈希值和数据保存到类变量中
self.previous_hash = prev_hash
print(f"父区块哈希{prev_hash}")
self.data = data
# 获取当前时间
self.timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# #设置Nonce和hash的初始值是None
# self.Nonce = None
# self.hash = None
# def __repr__(self): #当直接打印实例化对象时会自动执行
# return "区块内容:%s\n哈希值:%s" % (self.data,self.hash)
# 计算区块的哈希值
message = hashlib.sha256()
message.update(str(self.previous_hash).encode('utf-8'))
message.update(str(self.data).encode('utf-8'))
message.update(str(self.timestamp).encode('utf-8')) #等同于三个参数拼接在一起用hash 一模一样的
print("当前区块哈希"+message.hexdigest())
self.hash = message.hexdigest()
定义区块链结构
class BlockChain:
"""
区块链结构体
blocks: 包含的区块列表
"""
def __init__(self):
self.blocks = [] #blocks先定义为一个空链表
def add_block(self, block): #添加区块
"""
添加区块
"""
self.blocks.append(block)
创建区块
其中需要注意的是第一个区块,也叫创世区块,它是一个特殊的区块,没有父区块,在区块链创建的时候会生成,定义如下:
# 生成创世区块
# 创世区块是第一个区块,无父区块哈希
genesis_block = Block(data="创世区块", prev_hash="0") #利用区块类创建一个对象(创世区块)
# 再新建两个区块, prev_hash分别为前一个哈希值
new_block1 = Block(data="张三转给李四1个比特币", prev_hash=genesis_block.hash)
new_block2 = Block(data="张三转给王五2个比特币", prev_hash=new_block1.hash)
# 新建一个区块链
blockchain = BlockChain()
# 将上面的几个区块添加到区块链中
blockchain.add_block(genesis_block)
blockchain.add_block(new_block1)
blockchain.add_block(new_block2)
#打印区块链
print("区块链包含区块个数: %d\n" % len(blockchain.blocks))
no=0
for block in blockchain.blocks:
print(f"这是第{no}个区块")
print("上一个区块哈希是:%s"%block.previous_hash)
print("本区块交易内容是:%s"%block.data)
print("本区块哈希是:%s"%block.hash)
no += 1
# 打印区块链
上面的函数创建了一个区块链,并生成两个区块,加上创世区块一共三个区块。
引入共识机制中的PoW工作量证明机制:通过不断计算随机数(Nonce)