python区块链简单模拟【02】

2023-12-23 21:41:20

定义区块结构

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)

文章来源:https://blog.csdn.net/weixin_43491496/article/details/135160657
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。