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)
最后,记住一句话:“区块链不是魔法,而是数学。” 😄