区块链演示

149 阅读3分钟

区块链的基本组成:

  1. 区块(Block) :每个区块包含一定数量的交易或数据。
  2. 链(Chain) :区块通过哈希值相互连接,形成一条链。
  3. 哈希(Hash) :每个区块都有一个唯一的哈希值,用来验证数据的完整性。
  4. 工作量证明(Proof of Work) :为了确保新区块的合法性,矿工需要进行一定的计算工作。

区块链示例:

这里我们用 Python 来演示一个简单的区块链模型,包括如何创建区块、生成哈希值以及如何将新区块链接到已有区块。

区块链的简化版实现:

python
复制编辑
import hashlib
import time

# 创建区块类
class Block:
    def __init__(self, index, previous_hash, timestamp, data, hash_value):
        self.index = index
        self.previous_hash = previous_hash
        self.timestamp = timestamp
        self.data = data
        self.hash_value = hash_value

    # 获取区块的哈希
    def calculate_hash(self):
        block_string = str(self.index) + str(self.previous_hash) + str(self.timestamp) + str(self.data)
        return hashlib.sha256(block_string.encode('utf-8')).hexdigest()

# 创建一个简单的区块链
class Blockchain:
    def __init__(self):
        self.chain = []
        self.create_genesis_block()

    # 创建创世区块
    def create_genesis_block(self):
        # 创世区块没有前一个区块
        genesis_block = Block(0, "0", time.time(), "Genesis Block", "0")
        genesis_block.hash_value = genesis_block.calculate_hash()
        self.chain.append(genesis_block)

    # 获取最新区块
    def get_latest_block(self):
        return self.chain[-1]

    # 添加新区块
    def add_block(self, data):
        latest_block = self.get_latest_block()
        new_index = latest_block.index + 1
        new_timestamp = time.time()
        new_block = Block(new_index, latest_block.hash_value, new_timestamp, data, "")
        new_block.hash_value = new_block.calculate_hash()
        self.chain.append(new_block)

    # 打印区块链的内容
    def print_blockchain(self):
        for block in self.chain:
            print(f"Index: {block.index}, Timestamp: {block.timestamp}, Data: {block.data}, Hash: {block.hash_value}")
            print("-----------------------------------------------------")

# 创建区块链实例
my_blockchain = Blockchain()

# 添加一些区块
my_blockchain.add_block("Block 1: Transaction data")
my_blockchain.add_block("Block 2: More transaction data")
my_blockchain.add_block("Block 3: Even more transaction data")

# 打印区块链
my_blockchain.print_blockchain()

代码解释:

  1. Block 类

    • index: 区块的索引,从 0 开始。
    • previous_hash: 前一个区块的哈希值,链式结构的关键。
    • timestamp: 区块的创建时间。
    • data: 该区块存储的数据(比如交易记录)。
    • hash_value: 区块的哈希值,是区块唯一的标识。
  2. Blockchain 类

    • create_genesis_block(): 创建创世区块(区块链的第一个区块)。
    • get_latest_block(): 获取当前区块链中的最新区块。
    • add_block(): 添加新区块到链中。
    • print_blockchain(): 打印区块链的每个区块信息。

区块链运行结果:

假设我们运行上述代码,会输出类似下面的内容:

yaml
复制编辑
Index: 0, Timestamp: 1634285767.879205, Data: Genesis Block, Hash: 6df0c0ac07373d42a1b1e7fd02a21b746ab6fa3b4006d8a225aa343a4d274727
-----------------------------------------------------
Index: 1, Timestamp: 1634285770.451314, Data: Block 1: Transaction data, Hash: 7bbf2e4a2929c92c798edc87fe22f8810a1da0cd099035f7584a957407f80a60
-----------------------------------------------------
Index: 2, Timestamp: 1634285772.578951, Data: Block 2: More transaction data, Hash: 5d9b7a7631bc20a165356567c8faeb82473ad5b8fdaf5c57c58d0b907d58dce3
-----------------------------------------------------
Index: 3, Timestamp: 1634285775.249501, Data: Block 3: Even more transaction data, Hash: 31d6d0067a6ad72c9c6f7069f47e6a1f0e9991e33a9f5407b8b95c1b0291b364
-----------------------------------------------------

解释:

  • 创世区块:第一个区块,它的 previous_hash0
  • 新区块:每次添加新区块时,都会计算当前区块的哈希值,并把它作为下一个区块的 previous_hash

区块链的核心概念:

  1. 不可篡改性:每个区块的哈希值是基于当前区块内容(包括前一个区块的哈希值)计算的。如果你想修改某个区块的数据,那么该区块的哈希值就会变化,从而导致后续所有区块的哈希值都需要重新计算,这在大规模区块链系统中是不可行的。
  2. 分布式特性:在实际的区块链应用中,区块链数据是分布式存储的,每个参与者(矿工或节点)都维护一份完整的账本,这增加了系统的安全性和可靠性

海尔运营级源码haierym.com