核心关键词:Python 加密货币、Python区块链技术、自建区块链、挖矿算法、数字钱包、去中心化、UTXO 模型、智能合约入门、PoW 机制、加密货币开发教程
加密货币热潮已从极客圈扩展到全球市值万亿美元,但仍有不少开发者苦于“看不懂也写不出”。本文借 15 年编程教学经验,用 纯 Python 手搓一条精简区块链,实现 代币发行、转账记账与挖矿奖励 三大功能。跟着做,30 分钟内即可在本地运行一条带币功能的个人链。
为什么你还在观望?三大冷启动顾虑一次说清
- 门槛过高 ❌ 多数教程直接 ERC-20 合约,Solidity & Gas 费先劝退。
- 概念碎片化 ❌ 哈希、UTXO、Merkle 树、nonce 满屏黑话,读者晕。
- 脱离实践 ❌ 复制粘贴跑不通,调试全靠猜,最终弃坑。
本篇优势:
- 全程 Python,零 Gas 费,本地秒跑。
- 先用“最小可行链”跑通转账,再拆概念。
- 每段代码配有“动手指南”,小白也能痛快点绿色按钮一路 Next。
1. 初学者必懂的 3 个层级:链、币、钱包
层级 | 作用 | 关键词 |
---|---|---|
网络层 | 去中心化广播与同步 | P2P、Gossip |
共识层 | 没有会计也能统账本 | PoW、PoS |
数据层 | 记录转账即“钱”本身 | Tx、UTXO、签名 |
概念太多?先跳过,把代码跑起来再回头嚼碎!
2. 三步搭建核心链
2.1 定义 Block 形状
import hashlib, time
class Block:
def __init__(self, index, ts, data, prev_hash):
self.index = index
self.timestamp = ts
self.data = data # 转帐列表或任意信息
self.prev_hash = prev_hash
self.nonce = 0
self.hash = self.calc_hash()
def calc_hash(self):
text = f"{self.index}{self.timestamp}{self.data}{self.prev_hash}{self.nonce}"
return hashlib.sha256(text.encode()).hexdigest()
2.2 生成创世区块并追加新区块
class Blockchain:
def __init__(self):
self.chain = [self.genesis()]
self.pending = []
def genesis(self):
return Block(0, time.time(), "创世红包", "0")
def add_block(self):
last = self.chain[-1]
block = Block(len(self.chain), time.time(), self.pending.copy(), last.hash)
block = self.mine(block) # PoW 挖矿
self.chain.append(block)
self.pending.clear()
动手指南:复制文件 chain.py
,运行后看到两条区块记录可继续。
2.3 挖矿:用 CPU 烤出 4 个 0
PoW 难度调节非常简单——哈希前缀出现 4 个 0 即通过。
def mine(self, block, difficulty=4):
target = "0" * difficulty
while not block.hash.startswith(target):
block.nonce += 1
block.hash = block.calc_hash()
print(f"Nonce={block.nonce}, Hash={block.hash}")
return block
让你的风扇响起来,这就是去中心化共识的魅力。
3. 让币真正流通:添加交易模型
一条链没币,只剩记账本能难以动人。给 Block.data 放入 Transaction 字典:
class Tx:
def __init__(self, sender, receiver, amount):
self.sender, self.receiver, self.amount = sender, receiver, amount
def to_dict(self):
return {"from": self.sender, "to": self.receiver, "amount": self.amount}
在 Blockchain 新增 send()
接口:
def send(self, sender, receiver, amount):
tx = Tx(sender, receiver, amount)
self.pending.append(tx.to_dict())
演示:
my_chain = Blockchain()
my_chain.send("Alice", "Bob", 50)
my_chain.send("Bob", "Charlie", 25)
my_chain.add_block()
控制台瞬间输出区块哈希,内部树形结构形似:
Block 0 ➜ [["创世红包"]]
Block 1 ➜ [["Alice→Bob:50", "Bob→Charlie:25"]]
4. 升级玩法:数字钱包 & 余额查询
最简单的余额模型:扫链累加。保留 UTXO 细节到未来高阶篇。
def balance(self, addr):
amt = 0
for block in self.chain:
for tx in block.data:
if isinstance(tx, dict) and 'from' in tx:
if tx['from'] == addr: amt -= tx['amount']
if tx['to'] == addr: amt += tx['amount']
return amt
print(my_chain.balance("Bob")) # 输出:25
5. 可视化实战:十分钟发一次空投
想要吸引社区?把代码改造成 每分钟自动空投向 3 个地址:
- 启动定时器
schedule.every().minute.do(airdrop)
。 - 在
airdrop
函数里随机生成奖励列表,调用send()
。 - 实时打印链高,模拟网络节点同步。
常见问题解答(FAQ)
Q1:个人电脑跑 PoW,会不会电量爆炸?
A:演示难度仅 4 个 0,CPU 占用 <5%。真实主网难度为 70+ 零,需要矿机。
Q2:如何让链在多节点之间实时同步?
A:另起 UDP 服务广播新区块,或使用现成的 asyncio+websockets
库;本文暂略,未来扩容再议。
Q3:PoS 能否用 Python 部署?
A:可以。用一个外部质押池合约或本地轻节点即可;只需替换 mine()
,改为抛出“谁权益大谁记账”算法。
Q4:交易没有签名安全吗?
A:当然不安全!本篇专注逻辑;真实环境需引入 ecdsa
椭圆曲线签名与公钥校验。
Q5:代码能否直接上线交易所?
A:不能。交易所对接需稳定网络、防女巫攻击、钱包生态、多级权限,本文只给玩具链。
Q6:下一步学什么?
A:Merkle 树持久化、智能合约虚拟机、跨链桥。学完再去补读 Solidity 事半功倍。
写在最后:把玩具链推向商用只差五步
- 扩展数据层 → 使用 JSON 或 RocksDB 保存区块,增强宕机恢复。
- 共识多样化 → 引入 PoS+BFT,实现绿色挖矿。
- API 网关 → Flask/FastAPI 曝 REST,方便前端迭代。
- 钱包插件 → 接入 MetaMask 通过 JSON-RPC,一键发币转账。
- 代币经济模型 → 设计通胀曲线,节点奖励与空投策略。
如果你迫不及待想把脚本变成 product,别错过下一篇 《从 Python 原型到 Layer-3 高并发侧链》。
全文 1,300+ 字,祝你链上顺利,区块高度永不回滚。