第6章 看懂区块链交易流程:从发起到奖励

3,969 阅读5分钟

区块链交易的详细流程。

  • 发起交易 用户通过其钱包软件创建交易,指定接收方的地址及转账金额。 交易被数字化并通过用户的私钥进行签名,以保证交易的真实性与安全性。
  • 验证交易 交易被广播到比特币网络中的所有节点。 节点们验证交易的有效性,包括检查签名是否匹配发送者的公钥,以及发送者是否有足够的余额。
  • 竞争夺取得记账权 经过验证的交易被加入到未确认交易池中,等待被纳入新区块。 矿工通过执行工作量证明(Proof of Work, PoW)竞赛来获取记账权,即找到满足特定条件的哈希值。
  • 新区块广播 成功找到符合条件的哈希值的矿工将创建新区块,其中包含若干已验证的交易。 新区块被广播到整个网络,其他节点将验证新区块的合法性。
  • 全网验证 各节点独立验证新区块的内容,包括交易的有效性和区块的哈希值是否符合要求。 如果多数节点认可新区块,则将其添加到各自的区块链副本中。
  • 出块节点获得奖励 创建新区块成功的矿工将获得比特币作为奖励,这部分奖励包括两部分:一部分是固定数量的新发行比特币,另一部分是由新区块内所有交易的手续费组成。 image.png

image.png

image.png

image.png

image.png

image.png

image.png

实践案例

下面是一个围绕区块链交易的完整实践案例,涵盖了发起交易、验证交易、竞争记账权、新区块广播、全网验证和出块节点奖励的过程。这个案例将模拟一个微型区块链系统,并包含基本的方法来执行这些步骤。

1. 需求分析

  • 理解区块链的核心概念:区块链是一个去中心化的系统,由多个区块组成,每个区块包含一组交易记录。需要实现基本的交易、区块和区块链结构。

  • 确定功能模块:需要实现以下几个主要模块:

    • 交易(Transaction)
    • 区块(Block)
    • 区块链(Blockchain)

2. 设计结构

  • 确定类和属性

    • Transaction类

      • 属性:发送者、接收者、金额、时间戳
      • 方法:to_dict(将对象转换为字典以便于序列化),sign(对交易进行“签名”)。
    • Block类

      • 属性:索引、交易列表、时间戳、前一个区块的哈希、当前区块的哈希
      • 方法:calculate_hash(计算当前区块的哈希值),to_dict(将区块转换为字典)。
    • Blockchain类

      • 属性:链(list)、待处理交易(list)
      • 方法:create_block(创建新的区块),add_transaction(添加交易到待处理列表),mine_block(挖矿,创建新区块)。

3. 实现逻辑

  • 创建区块链实例:初始化区块链,创建创世区块。
  • 发起交易:用户发起一笔交易,生成交易对象,使用私钥对交易进行签名。
  • 验证交易:在此示例中,通过简单检查签名是否存在来模拟交易验证。在实际应用中,会有更复杂的验证过程。
  • 挖矿:通过调用mine_block方法,将待处理的交易打包到新区块中并添加到区块链。
  • 展示结果:打印新挖掘的区块及当前区块链的所有区块信息。

4. 运行和调试

  • 测试代码:运行main函数,观察交易的创建、签名、添加到区块链以及新区块的生成过程。
  • 调试问题:确保每个部分的逻辑正确,特别是在交易签名和区块哈希计算中。

Python 示例代码

import hashlib
import json
import time
from random import randint

class Transaction:
    def __init__(self, sender, recipient, amount):
        self.sender = sender
        self.recipient = recipient
        self.amount = amount
        self.timestamp = time.time()
    
    def to_dict(self):
        return {
            'sender': self.sender,
            'recipient': self.recipient,
            'amount': self.amount,
            'timestamp': self.timestamp
        }

    def sign(self, private_key):
        # 这里简化了签名过程,真实应用中应使用加密算法
        return hashlib.sha256(f"{self.sender}{self.recipient}{self.amount}{private_key}".encode()).hexdigest()

class Block:
    def __init__(self, index, transactions, previous_hash):
        self.index = index
        self.transactions = transactions
        self.timestamp = time.time()
        self.previous_hash = previous_hash
        self.hash = self.calculate_hash()
    
    def calculate_hash(self):
        block_string = json.dumps(self.to_dict(), sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()
    
    def to_dict(self):
        return {
            'index': self.index,
            'transactions': [tx.to_dict() for tx in self.transactions],
            'timestamp': self.timestamp,
            'previous_hash': self.previous_hash,
            'hash': self.hash
        }

class Blockchain:
    def __init__(self):
        self.chain = []
        self.pending_transactions = []
        self.create_block(previous_hash='0', index=0)
    
    def create_block(self, previous_hash, index):
        block = Block(index, self.pending_transactions, previous_hash)
        self.pending_transactions = []  # Reset the pending transactions
        self.chain.append(block)
        return block
    
    def add_transaction(self, transaction):
        self.pending_transactions.append(transaction)
    
    def mine_block(self):
        last_block = self.chain[-1]
        new_index = len(self.chain)
        new_block = self.create_block(last_block.hash, new_index)
        return new_block

# 模拟完整流程
def main():
    # 创建区块链实例
    blockchain = Blockchain()
    
    # 用户发起交易
    transaction1 = Transaction(sender='Alice', recipient='Bob', amount=10)
    signature1 = transaction1.sign('private_key_of_Alice')
    print(f"Transaction 1 signed with signature: {signature1}")
    
    # 添加交易到区块链
    blockchain.add_transaction(transaction1)

    # 验证交易
    if signature1:
        print("Transaction verified and ready to be mined.")

    # 矿工挖矿
    mined_block = blockchain.mine_block()
    print(f"New block mined: {mined_block.to_dict()}")
    
    # 显示区块链
    for block in blockchain.chain:
        print(block.to_dict())

if __name__ == "__main__":
    main()

代码说明

  1. Transaction类:表示交易,包含发送者、接收者、金额和时间戳,并提供签名方法。
  2. Block类:表示区块,包含索引、交易列表、时间戳、前一个区块的哈希和当前区块的哈希。
  3. Blockchain类:表示区块链,管理区块和待处理交易,提供创建新区块和添加交易的方法。
  4. main函数:模拟了用户发起交易、交易验证和矿工挖矿的整个流程。

请注意,此代码仅用于教育目的,实际应用时需增强安全性和完整性,包括对交易签名的加密、矿工的竞争机制等。