区块链初探:从零实现一个简易账本系统
大家好,我是 VibeCoding 的讲师,985 计算机科班出身,过去几年在掘金写了上百篇技术教程。最近很多零基础的朋友问我:“区块链到底是什么?是不是只能用来炒币?”其实不然!作为一项底层技术,区块链在金融、供应链、数字身份等领域都有广阔前景。
我当初学的时候,也一度被“哈希”“共识算法”这些术语吓退。但后来发现,只要动手写一遍,理解起来并不难。今天这篇教程,就带你用最简单的代码,亲手实现一个迷你区块链系统——不仅能帮你理解原理,还能应对面试题!
为什么区块链值得学?
首先明确一点:区块链 ≠ 比特币。比特币是区块链的第一个应用,而区块链本身是一种去中心化的分布式账本技术。
简单说,它能让多个互不信任的节点,在没有中央权威的情况下,共同维护一份不可篡改的数据记录。这听起来抽象?别急,我们马上动手。
环境准备:三分钟搭好开发环境
我们用 Python 来实现,因为它语法简洁,适合教学。即使你没学过 Python,也能看懂逻辑。
安装步骤
安装 Python(推荐 3.7+)
- Windows/Mac:访问 python.org 下载安装
- Linux:
sudo apt install python3
安装必要库
打开终端,执行:pip install flask hashlib datetime
💡 新手提示:如果你连
pip是什么都不知道,先花 10 分钟了解下 Python 基础。推荐廖雪峰的 Python 教程。
- 创建项目目录
mkdir simple-blockchain cd simple-blockchain touch blockchain.py
搞定!现在你可以用任何文本编辑器(VS Code、Sublime、甚至记事本)打开 blockchain.py 开始编码。
核心概念:用大白话讲清楚
在写代码前,先搞懂三个关键词:
1. 区块(Block)
就像账本的一页纸,记录着一批交易。每个区块包含:
- 时间戳
- 交易数据
- 前一个区块的“指纹”(即哈希值)
- 自己的哈希值
2. 哈希(Hash)
把任意长度的数据变成固定长度的唯一字符串。比如:
import hashlib
hashlib.sha256(b"hello").hexdigest()
# 输出: '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'
关键特性:输入微变,输出巨变;不可逆。
3. 链(Chain)
区块按时间顺序连接,后一个区块包含前一个的哈希。一旦某个区块被篡改,后续所有哈希都会失效——这就是“不可篡改”的来源。
实战:手写一个简易区块链
下面,我们一步步构建一个可运行的最小化区块链系统。
第一步:定义区块结构
import hashlib
import time
class Block:
def __init__(self, index, transactions, timestamp, previous_hash):
self.index = index # 区块编号
self.transactions = transactions # 交易列表
self.timestamp = timestamp # 时间戳
self.previous_hash = previous_hash # 前一个区块的哈希
self.hash = self.calculate_hash() # 当前区块的哈希
def calculate_hash(self):
# 把区块信息拼成字符串,计算SHA256哈希
block_string = f"{self.index}{self.transactions}{self.timestamp}{self.previous_hash}"
return hashlib.sha256(block_string.encode()).hexdigest()
第二步:创建区块链类
class Blockchain:
def __init__(self):
self.chain = []
self.create_genesis_block() # 创建创世区块
def create_genesis_block(self):
# 第一个区块,没有前驱
genesis_block = Block(0, [], time.time(), "0")
self.chain.append(genesis_block)
def get_latest_block(self):
return self.chain[-1]
def add_block(self, transactions):
latest_block = self.get_latest_block()
new_block = Block(
index=latest_block.index + 1,
transactions=transactions,
timestamp=time.time(),
previous_hash=latest_block.hash
)
self.chain.append(new_block)
第三步:验证链的完整性
这才是区块链安全的核心!
def is_chain_valid(self):
for i in range(1, len(self.chain)):
current = self.chain[i]
previous = self.chain[i - 1]
# 检查当前区块的哈希是否正确
if current.hash != current.calculate_hash():
return False
# 检查当前区块是否指向正确的前驱
if current.previous_hash != previous.hash:
return False
return True
第四步:完整测试脚本
把上面代码整合到 blockchain.py,在文件末尾加上:
if __name__ == "__main__":
my_chain = Blockchain()
# 添加两笔交易
my_chain.add_block(["Alice pays Bob $10"])
my_chain.add_block(["Bob pays Charlie $5"])
print("区块链是否有效?", my_chain.is_chain_valid())
# 打印所有区块哈希
for block in my_chain.chain:
print(f"区块 {block.index}: {block.hash}")
运行:
python blockchain.py
你会看到类似输出:
区块链是否有效? True
区块 0: a1b2c3...(创世块)
区块 1: d4e5f6...
区块 2: g7h8i9...
✅ 恭喜!你已经实现了一个具备核心特性的区块链!
面试题高频考点解析
很多同学学到这里会问:“这和真实区块链差太远了,面试官会不会觉得太简单?”
其实恰恰相反!能清晰解释基础原理,比背诵复杂名词更有价值。以下是几个常见面试题及回答思路:
| 面试题 | 回答要点 |
|---|---|
| “区块链如何保证不可篡改?” | 强调哈希链结构:修改任一区块 → 哈希变化 → 后续所有区块失效 → 需重做整个链(计算量极大) |
| “什么是共识机制?” | 解释:在去中心化网络中,节点如何就“哪个区块有效”达成一致。我们这个 demo 是单机版,所以不需要。但真实系统如比特币用 PoW(工作量证明) |
| “你的实现缺少什么?” | 主动指出:无 P2P 网络、无共识算法、无激励机制、交易未签名。体现你有全局视野 |
🌟 加分技巧:在回答时补充一句:“我曾用不到 50 行代码实现过简化版,理解了哈希链和验证逻辑,这让我更容易学习更复杂的系统。”
新手常见问题 & 避坑指南
Q1:为什么我的哈希每次运行都不一样?
因为 timestamp 在变!解决方法:在测试时固定时间戳,或只关注结构逻辑。
Q2:这能防黑客吗?
单机版不能。真实区块链的安全依赖于算力集中(PoW)或节点多数诚实(PoS)。我们的重点是理解机制,不是生产级安全。
Q3:交易需要加密吗?
在真实系统中,交易需用非对称加密(如 RSA 或 ECDSA)签名,确保只有私钥持有者能发起转账。我们的 demo 省略了这点以降低复杂度。
避坑提醒
- 不要一开始就啃 Bitcoin Core 源码,太庞大
- 不要混淆“区块链”和“数据库”,前者强调去中心化与不可篡改
- 别被“智能合约”吓住,它本质就是自动执行的代码(我们下一步可以学)
下一步学习路径建议
你现在已经跨过了最难的门槛——从 0 到 1 的理解。接下来可以:
扩展功能
- 给交易加上数字签名(用
ecdsa库) - 实现简单的 PoW(要求哈希以若干个 0 开头)
- 用 Flask 暴露 API,模拟多节点
- 给交易加上数字签名(用
深入学习方向
- 学习 Ethereum 和 Solidity(智能合约语言)
- 研究 Hyperledger Fabric(企业级联盟链)
- 探索 Layer2、零知识证明等前沿技术
实战项目推荐
- 实现一个带挖矿难度调整的区块链
- 构建一个去中心化投票系统
- 模拟 NFT 铸造流程
写在最后
技术探索的本质,不是记住所有细节,而是建立直觉。我当初第一次跑通这个 demo 时,突然就明白了“为什么改不了账本”——那种顿悟感,比刷十道 LeetCode 还爽。
区块链不是魔法,它只是巧妙地组合了密码学、分布式系统和经济学激励。只要你愿意动手,每个人都能成为探索者。
如果你跟着教程敲完了代码,欢迎在评论区晒出你的哈希值!也欢迎关注我的掘金账号,我会持续更新《Web3 入门实战》系列。
记住:最好的学习,永远发生在你按下回车键之后。

评论 0