Python从零构建简易区块链完整教程(含PoW共识与Flask接口)
本文详解如何使用Python从零构建一个具备不可篡改特性的分布式账本。通过面向对象设计区块数据结构,实现基于SHA-256的工作量证明(PoW)挖矿算法,并利用Flask框架暴露RESTful接口。内容涵盖交易管理、创世区块初始化、节点注册、多链冲突检测及最长有效链共识机制,提供可直接运行的完整代码逻辑。
区块链的核心概念与架构目标
区块链本质上是一种在计算机网络节点之间共享数据的分类账(分布式数据库)。与传统中心化数据库不同,区块链采用链式数据结构,以block(区块)为单位连续记录信息。其核心目标是保证数字信息的记录与分发能力,同时杜绝编辑、删除或伪造的可能,形成一条不可变的交易历史记录。去中心化架构消除了单点故障风险,即使部分服务器断电或断网,其余节点仍能维持数据一致性与业务连续性。
开发环境准备
在开始编码前,请确保本地已安装 Python 3.8+ 环境。本项目依赖轻量级Web框架,执行以下命令安装依赖:
pip install flask
建议在工程根目录准备两个独立文件:block_chain.py(核心逻辑)与 app.py(Web接口),保持模块解耦。
第1步:定义区块结构与哈希校验
目的:建立存储加密信息的基础容器,确保区块内容一旦被写入即可被快速验证完整性。
入口:新建 block_chain.py 并引入基础类骨架。
动作:初始化空列表用于保存链(self.chain)与待提交交易(self.current_transactions)。利用 json.dumps 序列化区块字典并启用 sort_keys=True,随后调用 hashlib.sha256 生成十六进制摘要。
重要参数:block_string = json.dumps(block, sort_keys=True).encode()
完成状态:实例化对象后,可通过调用静态方法获取任意区块的标准哈希值,哈希值不随内存地址变化,仅取决于区块内容。
第2步:实现交易接收与新区块铸造
目的:模拟价值流转,并建立区块间的数学关联。
入口:完善 Blockchain 类的内部方法。
动作:
- Genesis Block(创世区块):在构造函数中直接调用
self.new_block(previous_hash=1, proof=100),为链赋予起点。 - 添加交易:
new_transaction(sender, recipient, amount)将转账记录追加至current_transactions缓冲池,并返回下一个待打包区块的索引号。 - 铸造新块:
new_block(proof, previous_hash)读取当前缓冲池交易,计算区块索引、时间戳、前驱区块哈希,锁定当前交易池(清空),并将新字典推入self.chain。
第3步:编写工作量证明(PoW)挖矿逻辑
目的:通过算力竞争防止恶意节点批量制造无效区块,实现无需第三方背书的安全验证。
入口:在同一文件中补充挖矿相关方法。
动作:proof_of_work(last_proof) 从0开始递增候选数,反复代入 valid_proof 校验。校验规则为拼接前后两次Proof并SHA-256加密,要求结果前缀匹配特定安全字符(本例设为4个0)。一旦匹配成功即终止循环。
重要参数:guess_hash[:4] == '0000'
完成状态:返回合法整数Proof,该数值极难伪造但全网节点均可毫秒级肉眼核验。
第4步:配置Flask Web服务与基础接口
目的:将内存中的链转换为可远程交互的网络服务。
入口:创建同级目录 app.py 并完成路由映射。
动作:实例化 Flask 应用,使用 uuid4 生成唯一节点标识。定义三大核心端点:
GET /mine:触发挖矿流程,奖励自身1单位代币,返回新生成的区块详情。POST /transactions/new:接收前端提交的转账Payload,暂存至缓冲池。GET /chain:吐出现有全量链数据与总长度。
flask run,默认监听 host='0.0.0.0', port=5000。完成状态:终端输出Running on http://0.0.0.0:5000,浏览器或API工具可正常拉取JSON响应。

第5步:实现节点注册与多链共识机制
目的:打破单机局限,构建真正的去中心化对等网络(P2P),并自动处理因网络延迟导致的数据分叉。
入口:扩展 Blockchain 类属性与方法。
动作:
- 注册节点:新增
self.nodes = set(),通过register_node(address)解析URL提取主机名并存入集合。 - 链有效性校验:
valid_chain(chain)逐块遍历比对previous_hash与 PoW 合法性,任一段断裂即刻返回False。 - 冲突解决(共识):
resolve_conflicts()遍历所有注册节点,抓取其链长度与数据。若发现更长的合法链,则覆盖本地self.chain。
POST /nodes/register 同步节点表,GET /nodes/resolve 触发一致性对齐。完成状态:多进程或跨IP节点运行时,主链自动择优融合,局部错误数据被丢弃,网络恢复统一账本状态。

运行验证与排错指南
验证流程建议采用 本地双端口模式 模拟节点集群。将 port 分别改为 5000 与 6000 启动两个实例。先向 5000 连续请求 3 次 /mine 延长主链,随后对 6000 实例发起 GET /nodes/resolve,观察其 chain 字段是否自动扩容至与 5000 一致。
常见异常排查:
requests ConnectionError:检查目标节点防火墙是否放行对应端口,或 URL 协议头是否遗漏http://。hashlib/UnicodeEncodeError:Windows环境下部分特殊字符拼接可能导致编码中断,代码中已通过.replace('_', '')规避标识符冲突。- 挖矿卡死无响应:PoW 难度过高会大幅拉长求解时间,调试阶段可临时将验证条件改为
guess_hash[:2] == '00'加速验证。
总结
通过上述步骤,我们完整实现了具备记账、加密、挖矿、通信与共识五大特征的微型区块链系统。该方法清晰地拆解了分布式账本底层的数学逻辑与工程实现,代码结构完全剥离商业框架耦合,适合作为核心算法学习基石。以上就是用Python构建区块链的详细内容,更多关于Python区块链开发与共识算法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













