Python DIY:从零起步打造自己的加密货币

·

核心关键词:Python 加密货币、Python区块链技术、自建区块链、挖矿算法、数字钱包、去中心化、UTXO 模型、智能合约入门、PoW 机制、加密货币开发教程

加密货币热潮已从极客圈扩展到全球市值万亿美元,但仍有不少开发者苦于“看不懂也写不出”。本文借 15 年编程教学经验,用 纯 Python 手搓一条精简区块链,实现 代币发行、转账记账与挖矿奖励 三大功能。跟着做,30 分钟内即可在本地运行一条带币功能的个人链。


为什么你还在观望?三大冷启动顾虑一次说清

本篇优势

  1. 全程 Python,零 Gas 费,本地秒跑。
  2. 先用“最小可行链”跑通转账,再拆概念。
  3. 每段代码配有“动手指南”,小白也能痛快点绿色按钮一路 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 个地址

  1. 启动定时器 schedule.every().minute.do(airdrop)
  2. airdrop 函数里随机生成奖励列表,调用 send()
  3. 实时打印链高,模拟网络节点同步。

👉 立即动手把脑洞落地,实战调试技巧全在下一页等你!


常见问题解答(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 事半功倍。


写在最后:把玩具链推向商用只差五步

如果你迫不及待想把脚本变成 product,别错过下一篇 《从 Python 原型到 Layer-3 高并发侧链》

👉 收藏高阶路线图,趁假期吃上技能红利!


全文 1,300+ 字,祝你链上顺利,区块高度永不回滚。