用python理解区块链

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")

代码解释

  1. 区块(Block):

    • 区块类保存区块的编号(index)、前一个区块的哈希值(previous_hash)、时间戳(timestamp)、数据(data)、随机数(nonce)和当前区块的哈希值(hash)。
    • calculate_hash() 函数用于计算区块的哈希值,使用了 SHA256 加密。
    • mine_block() 函数是一个简单的工作量证明机制,寻找满足前 difficulty 个字符为 0 的哈希值。
  2. 区块链(Blockchain):

    • 区块链类维护一个链表(chain),保存所有的区块,并通过挖矿将新区块添加到链中。
    • create_genesis_block() 函数创建了区块链的第一个区块(创世区块),其 previous_hash 设置为 0
    • add_block() 函数负责将新区块添加到区块链中,并在添加之前对该区块进行挖矿。
  3. 挖矿机制:

    • 挖矿通过不断调整区块的 nonce 来找到符合挖矿难度要求的哈希值(前 difficulty 个字符为 0)。
    • 挖矿成功后,将新区块添加到链上,并打印挖矿结果。
  4. 运行结果示例:

    • 挖矿完成后,代码会输出区块链中所有区块的信息,包括区块的哈希值、前一个区块的哈希值、时间戳、数据和 nonce

总结

这个 Python 实现的区块链是一个基础模型,它展示了区块链的核心概念:区块、哈希链接、工作量证明等。这种简单的实现可以帮助理解区块链技术的工作原理,并为进一步的扩展(如智能合约、交易等功能)提供了良好的基础

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值