区块链初探:从零实现一个简易账本系统

深巷里的服务器
2026-04-29 14:36
阅读 2257

大家好,我是 VibeCoding 的讲师,985 计算机科班出身,过去几年在掘金写了上百篇技术教程。最近很多零基础的朋友问我:“区块链到底是什么?是不是只能用来炒币?”其实不然!作为一项底层技术,区块链在金融、供应链、数字身份等领域都有广阔前景。

我当初学的时候,也一度被“哈希”“共识算法”这些术语吓退。但后来发现,只要动手写一遍,理解起来并不难。今天这篇教程,就带你用最简单的代码,亲手实现一个迷你区块链系统——不仅能帮你理解原理,还能应对面试题!

为什么区块链值得学?

首先明确一点:区块链 ≠ 比特币。比特币是区块链的第一个应用,而区块链本身是一种去中心化的分布式账本技术

简单说,它能让多个互不信任的节点,在没有中央权威的情况下,共同维护一份不可篡改的数据记录。这听起来抽象?别急,我们马上动手。


环境准备:三分钟搭好开发环境

我们用 Python 来实现,因为它语法简洁,适合教学。即使你没学过 Python,也能看懂逻辑。

安装步骤

  1. 安装 Python(推荐 3.7+)

    • Windows/Mac:访问 python.org 下载安装
    • Linux:sudo apt install python3
  2. 安装必要库
    打开终端,执行:

    pip install flask hashlib datetime
    

💡 新手提示:如果你连 pip 是什么都不知道,先花 10 分钟了解下 Python 基础。推荐廖雪峰的 Python 教程。

  1. 创建项目目录
    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 的理解。接下来可以:

  1. 扩展功能

    • 给交易加上数字签名(用 ecdsa 库)
    • 实现简单的 PoW(要求哈希以若干个 0 开头)
    • 用 Flask 暴露 API,模拟多节点
  2. 深入学习方向

    • 学习 Ethereum 和 Solidity(智能合约语言)
    • 研究 Hyperledger Fabric(企业级联盟链)
    • 探索 Layer2、零知识证明等前沿技术
  3. 实战项目推荐

    • 实现一个带挖矿难度调整的区块链
    • 构建一个去中心化投票系统
    • 模拟 NFT 铸造流程

写在最后

技术探索的本质,不是记住所有细节,而是建立直觉。我当初第一次跑通这个 demo 时,突然就明白了“为什么改不了账本”——那种顿悟感,比刷十道 LeetCode 还爽。

区块链不是魔法,它只是巧妙地组合了密码学、分布式系统和经济学激励。只要你愿意动手,每个人都能成为探索者。

如果你跟着教程敲完了代码,欢迎在评论区晒出你的哈希值!也欢迎关注我的掘金账号,我会持续更新《Web3 入门实战》系列。

记住:最好的学习,永远发生在你按下回车键之后

评论 0

最热最新
暂无评论
深巷里的服务器Lv.1
0
影响力
0
文章
0
粉丝