Python与区块链开发:构建简单的加密货币交易系统

Python与区块链开发:构建简单的加密货币交易系统

大家好!欢迎来到今天的讲座,主题是“Python与区块链开发:构建简单的加密货币交易系统”。如果你对区块链技术感兴趣,但又觉得它像外星科技一样复杂,别担心!今天我们将用轻松诙谐的语言,手把手教你用Python构建一个简单的加密货币交易系统。

1. 区块链是什么?(简单科普)

在开始之前,我们先来聊聊区块链是什么。你可以把它想象成一个超级安全的账本,记录了所有人的交易历史。这个账本由许多“区块”组成,每个区块都包含一些交易数据,并通过密码学技术连接在一起。这样,一旦有人试图篡改某个区块的数据,整个链条都会崩塌。

核心概念:

  • 去中心化:没有单一的控制者。
  • 不可篡改:一旦写入,无法更改。
  • 透明性:所有人都可以看到账本内容。

听起来很酷吧?现在让我们用Python来实现一个简化版的加密货币交易系统!


2. 构建基础框架

2.1 定义交易结构

首先,我们需要定义一个交易的基本结构。交易通常包括以下几个字段:

  • 发送方地址
  • 接收方地址
  • 交易金额
class Transaction:
    def __init__(self, sender, recipient, amount):
        self.sender = sender
        self.recipient = recipient
        self.amount = amount

    def __repr__(self):
        return f"Transaction(Sender: {self.sender}, Recipient: {self.recipient}, Amount: {self.amount})"

2.2 创建区块链类

接下来,我们创建一个Blockchain类,用于管理所有的区块和交易。

import hashlib
import time

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

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

    def create_genesis_block(self):
        """创建创世区块"""
        genesis_block = Block(0, "0", time.time(), [], self.calculate_hash(0, "0", time.time(), []))
        self.chain.append(genesis_block)

    def calculate_hash(self, index, previous_hash, timestamp, transactions):
        """计算区块哈希值"""
        block_string = f"{index}{previous_hash}{timestamp}{transactions}"
        return hashlib.sha256(block_string.encode()).hexdigest()

    def add_transaction(self, transaction):
        """添加交易到当前待处理交易列表"""
        self.current_transactions.append(transaction)

    def mine_block(self):
        """挖矿:将当前交易打包成新区块"""
        if not self.current_transactions:
            print("没有待处理的交易!")
            return None

        last_block = self.chain[-1]
        new_index = last_block.index + 1
        new_timestamp = time.time()
        new_transactions = self.current_transactions
        new_hash = self.calculate_hash(new_index, last_block.hash, new_timestamp, new_transactions)

        new_block = Block(new_index, last_block.hash, new_timestamp, new_transactions, new_hash)
        self.chain.append(new_block)
        self.current_transactions = []  # 清空待处理交易
        return new_block

3. 测试我们的系统

现在我们已经完成了基本的区块链框架,让我们来测试一下!

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

# 创建几笔交易
transaction1 = Transaction("Alice", "Bob", 10)
transaction2 = Transaction("Bob", "Charlie", 5)
transaction3 = Transaction("Charlie", "Alice", 3)

# 添加交易到区块链
blockchain.add_transaction(transaction1)
blockchain.add_transaction(transaction2)

# 挖矿生成新区块
print("正在挖矿...")
new_block = blockchain.mine_block()
if new_block:
    print(f"新区块已生成:{new_block}")

# 再添加一笔交易并挖矿
blockchain.add_transaction(transaction3)
print("正在挖矿...")
new_block = blockchain.mine_block()
if new_block:
    print(f"新区块已生成:{new_block}")

运行结果可能类似于以下内容:

正在挖矿...
新区块已生成:Block(Index: 1, Previous Hash: 0, Timestamp: 1698765432.123456, Transactions: [Transaction(Sender: Alice, Recipient: Bob, Amount: 10), Transaction(Sender: Bob, Recipient: Charlie, Amount: 5)], Hash: a1b2c3d4...)
正在挖矿...
新区块已生成:Block(Index: 2, Previous Hash: a1b2c3d4..., Timestamp: 1698765433.654321, Transactions: [Transaction(Sender: Charlie, Recipient: Alice, Amount: 3)], Hash: e5f6g7h8...)

4. 扩展功能:钱包与签名

为了让系统更加真实,我们可以引入钱包和数字签名的概念。钱包负责生成公钥和私钥,而数字签名则用于验证交易的真实性。

4.1 引入cryptography

我们可以使用Python的cryptography库来生成密钥对和签名。以下是代码示例:

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes, serialization

class Wallet:
    def __init__(self):
        self.private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
        self.public_key = self.private_key.public_key()

    def sign_transaction(self, transaction):
        """为交易签名"""
        transaction_str = str(transaction.sender) + str(transaction.recipient) + str(transaction.amount)
        signature = self.private_key.sign(
            transaction_str.encode(),
            padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH),
            hashes.SHA256()
        )
        return signature

    @staticmethod
    def verify_signature(public_key, transaction, signature):
        """验证签名"""
        transaction_str = str(transaction.sender) + str(transaction.recipient) + str(transaction.amount)
        try:
            public_key.verify(
                signature,
                transaction_str.encode(),
                padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH),
                hashes.SHA256()
            )
            return True
        except:
            return False

4.2 使用钱包进行交易

# 创建两个钱包
alice_wallet = Wallet()
bob_wallet = Wallet()

# 创建交易并签名
transaction = Transaction(alice_wallet.public_key, bob_wallet.public_key, 10)
signature = alice_wallet.sign_transaction(transaction)

# 验证签名
is_valid = Wallet.verify_signature(alice_wallet.public_key, transaction, signature)
print(f"签名验证结果:{'有效' if is_valid else '无效'}")

5. 总结

通过今天的讲座,我们用Python实现了一个简单的加密货币交易系统。虽然它还有很多可以改进的地方(比如性能优化、共识算法等),但它已经具备了区块链的核心特性:去中心化、不可篡改和透明性。

希望这篇文章能激发你对区块链技术的兴趣!如果你想深入学习,可以参考以下国外文档:

  • Bitcoin白皮书(Satoshi Nakamoto)
  • Ethereum官方文档(Vitalik Buterin)

最后,记住一句话:“区块链不是魔法,而是数学。” 😄

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注