📜  使用Python创建简单的区块链(1)

📅  最后修改于: 2023-12-03 15:36:36.439000             🧑  作者: Mango

使用Python创建简单的区块链

区块链是一种分布式、去中心化的数据库技术,它可以记录交易、存储数据并且保护数据不被篡改。在本文中,我们将使用Python语言创建一条简单的区块链。

区块链的基本概念

一个区块链通常由多个区块组成。每个区块都包含一个区块头和数据。

区块头包含:

  • 版本号:用于识别当前区块链的版本号。
  • 时间戳:当前的时间戳,用于解决多个节点之间的时间不一致的问题。
  • Merkle Tree根哈希值:一个用于校验有效性的哈希值。
  • 前一区块哈希值:指向前一区块的哈希值。

数据可以是任何内容,最常见的是交易数据。

创建一个区块链

首先,我们需要创建一个区块链的类。

class Block:
    def __init__(self, index, timestamp, data, previous_hash):
        self.index = index
        self.timestamp = timestamp
        self.data = data
        self.previous_hash = previous_hash
        self.hash = self.calculate_hash()

    def calculate_hash(self):
        pass


class Blockchain:
    def __init__(self):
        self.chain = [self.create_genesis_block()]

    def create_genesis_block(self):
        return Block(0, "01/01/2021", "Genesis Block", "0")

首先,我们定义了一个Block类,用于存储每个区块的信息。在该类中,我们定义了indextimestampdataprevious_hashhash属性。calculate_hash方法将计算区块的哈希值。

接下来,我们定义了一个Blockchain类,用于存储所有的区块。在初始化函数中,我们创建了一个包含创世区块的空链表。

现在,让我们实现计算每个区块的哈希值的函数。

import hashlib


class Block:
    def __init__(self, index, timestamp, data, previous_hash):
        self.index = index
        self.timestamp = timestamp
        self.data = data
        self.previous_hash = previous_hash
        self.hash = self.calculate_hash()

    def __str__(self):
        return f"""
Block:
    Index: {self.index}
    Timestamp: {self.timestamp}
    Data: {self.data}
    Previous Hash: {self.previous_hash}
    Hash: {self.hash}
"""

    def calculate_hash(self):
        sha = hashlib.sha256()
        sha.update(str(self.index).encode('utf-8') +
                   str(self.timestamp).encode('utf-8') +
                   str(self.data).encode('utf-8') +
                   str(self.previous_hash).encode('utf-8'))
        return sha.hexdigest()


class Blockchain:
    def __init__(self):
        self.chain = [self.create_genesis_block()]

    def create_genesis_block(self):
        return Block(0, "01/01/2021", "Genesis Block", "0")

    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.hash = new_block.calculate_hash()
        self.chain.append(new_block)

    def __str__(self):
        result = ""
        for block in self.chain:
            result += str(block)
        return result

calculate_hash方法中,我们使用hashlib库计算SHA-256哈希值。我们使用str.encode('utf-8')将字符串转换为字节串并将其传递给哈希函数。最后,我们得到了一个哈希值,我们将其返回。

我们已经实现了计算哈希值的函数,现在,我们需要实现添加新区块的函数。在add_block方法中,我们首先设置新区块的previous_hash为上一个区块的哈希值。然后,我们使用calculate_hash方法为新区块生成一个哈希值,并将其添加到链中。

此外,我们还实现了__str__方法,用于展示区块链的链表信息。

现在,我们已经创建了一条区块链,让我们来测试一下。

blockchain = Blockchain()

blockchain.add_block(Block(1, "01/02/2021", "Transaction 1", ""))
blockchain.add_block(Block(2, "01/03/2021", "Transaction 2", ""))
blockchain.add_block(Block(3, "01/04/2021", "Transaction 3", ""))

print(blockchain)

以上代码将创建一条包含三个区块的区块链,并将其打印出来。

验证区块链的有效性

现在,我们已经创建了一条区块链,但是如何验证这条链的有效性呢?

在区块链中,每个区块的previous_hash都指向前一个区块的哈希值。因此,我们可以在验证一个区块的有效性时,去验证上一个区块的哈希值是否与其previous_hash一致。

我们可以使用以下代码来验证区块链的有效性。

def is_blockchain_valid(blockchain):
    for i in range(1, len(blockchain.chain)):
        current_block = blockchain.chain[i]
        previous_block = blockchain.chain[i-1]

        if current_block.hash != current_block.calculate_hash():
            return False
        if current_block.previous_hash != previous_block.hash:
            return False

    return True

print(f"Is Blockchain Valid? {is_blockchain_valid(blockchain)}")

以上代码中,is_blockchain_valid函数遍历整个区块链,并验证每个区块的哈希值和前一个区块的哈希值是否匹配。如果其中任何一个不匹配,该区块链就被认为是无效的。否则,我们将返回True表示该链是有效的。

在这里,我们可以看到我们的区块链是有效的。

以上是使用Python创建简单的区块链的介绍和实现。