Web3 全景:区块链到底在解决什么问题(师生对话实录)
Web3 区块链系列 · 阶段 0 · 地基与密码学 · 第 1/57 篇
上一篇:《Web3 区块链学习总纲》 · 下一篇:《哈希函数与默克尔树:区块链的指纹术》
学习大纲:《Web3 区块链学习总纲》
写在前面
我是彻底的零基础:没用过钱包,没买过币,连「链」字在这行怎么读都不确定。但最近到处都听到 Web3、区块链、智能合约,再躲下去就要变成「那个什么都不知道的人」了。
所以用最笨也最老实的方法:让 AI 当老师,我当学生,每课只讲一个概念,我有问题就打断,没问题就继续。这场对话从一个最朴素的问题开始——没有银行,两个互不信任的人,怎么就「谁欠谁多少钱」达成一致? 这是整个 Web3 存在的理由;后面 56 篇,都在回答这一篇提出的问题。
课程路线图(走到哪算哪):
① 双花:数字文件天生能复制 → ② 银行的解法:一个大家都信的人 → ③ 区块链的解法:把账本交给所有人 → ④ 亲眼看见一条真实的链 → ⑤ Web1/2/3 与「钥匙就是一切」 → ⑥ 你的第一笔链上转账
环境:WSL2 Ubuntu-22.04(root)+ Python 3.10;查真实链用公共 API(blockstream.info、ethereum-rpc.publicnode.com,无需注册)。官方背景:ethereum.org — 什么是区块链、比特币白皮书。
第 1 课:从「转一个文件」开始——双花问题
🧑🏫 老师:
先做一个 30 秒的实验,感受区块链要解决的第一个死敌。假如「数字货币」就是一个文件,转账 = 把文件复制给对方:
# doublespend.py(节选,完整脚本见文末仓库)
open("coin.txt", "w").write("10 gold coins, owner: A") # A 有 10 金币
shutil.copy("coin.txt", "coin-to-B.txt") # 「转」给 B
shutil.copy("coin.txt", "coin-to-C.txt") # 同一笔再「转」给 C本机跑(完整输出):
===== 场景一:把『币』当文件(数字商品) =====
# A 有一个『10 金币』文件,转给 B = 复制一份给他
A 手里: ['coin.txt', 'coin-to-B.txt']
# B 拿到了 coin-to-B.txt,但 A 的 coin.txt 还在——
# A 现在把同一份再『转』给 C:
A 手里: ['coin-to-B.txt', 'coin-to-C.txt', 'coin.txt']
>>> 同一笔钱花了两次(双花成立),没人拦得住同一笔钱,B 和 C 都以为自己收到了。这就是双花(double spending):数字文件天然可复制,而「钱」的定义恰恰是不可复制。任何数字货币方案,第一件事就是回答「怎么让第二笔花不出去」。
账本思路呢?同一个脚本的第二场景——不转「文件」,改在一个共享账本上记账:
===== 场景二:账本记账 =====
记账: A -> B 10,账本: {'A': 0, 'B': 10, 'C': 0}
拒绝: A -> C 10(余额不足,A 只有 0)
>>> 第二笔花不出去——账本面前,钱只能花一次第二笔被拒,双花防住了。但注意这个场景二里藏着一个巨大前提:那本账本只有一个,而且大家都认它。谁保管这本账本?谁保证保管的人不偷偷改一行?问题没有消失,只是换了形状——接下来的两课,就是在回答这个新形状。
一句话收口:双花 = 数字文件可复制 vs 钱必须唯一;账本能防双花,但前提是「一本大家都认、还没人能偷改的账」。
插问 1:你还没说「拜占庭将军」是什么,它跟双花什么关系?
🧑🎓 学生: 我搜「区块链 解决什么问题」时到处看到「拜占庭将军问题」,跟你说双花是一个事吗?
🧑🏫 老师:
是同一个问题的两种讲法,一个偏故事、一个偏场景。
拜占庭将军问题(1982 年 Lamport 等人的论文)的故事版:几支拜占庭军队围着一座城,各由一位将军指挥,只能靠信使传信。要围攻成功必须统一行动——一起攻或一起撤。麻烦在将军里可能有叛徒:他给一部分人说「攻」、给另一部分人说「撤」,把大家坑死。问:忠诚的将军们怎么在有叛徒的情况下达成一致?
翻译到分布式系统:一堆互不信任的节点,怎么就同一本账达成一致,哪怕有节点作恶(发假消息、伪造记录)? 双花攻击者就是那个叛徒——他向网络里的一部分人广播「付给 B」,向另一部分人广播「付给 C」,指望两边各自相信,把同一笔钱花两次。
所以串起来:双花是攻击手法,拜占庭将军是问题的抽象,共识机制(后面几篇的 PoW/PoS)是解法。区块链的全部核心,就是一台「拜占庭环境下的记账共识机器」。
一句话收口:拜占庭将军 = 「有叛徒也要达成一致」的抽象;双花是它在货币场景的具体攻击;共识机制是解法。
第 2 课:银行的解法——把账本交给一个大家都信的人
🧑🏫 老师:
人类历史上对这个问题的标准答案很成熟:找一个所有参与者都信任的中间人保管唯一的那本账。你用银行卡转账给朋友,走的正是这条路。把这条信任链画出来:
中心化支付(你 → 商家)
你的手机 ──► 银行的账本 ◄── 商家的 POS 机
│
▼
「A 减 100,B 加 100」
(以银行记的为准)
你信任:① 银行不乱记账 ② 银行系统不被黑
③ 银行不冻结你 ④ 监管替你盯着银行这条路好用:毫秒级到账、有客服、能退款——这些都是中心化系统的红利,别急着看不起它。
它的代价是信任被垄断:账本在银行手里,你对自己的余额只有「查询权」,没有「记账权」。银行记错了,你只能走申诉流程;银行系统周末维护,你的钱就周末冻结;换一个国家、换一家银行,同一笔账互不相认。第 1 课那个前提「一本大家都认、没人能偷改的账」,中心化的答案是靠制度和审计保证——有效,但信任的成本和风险都压在机构身上,而且机构本身可能出错或作恶(2008 年的金融危机就是一次大规模「记账的人不靠谱」)。
一句话收口:中心化 = 唯一账本交给机构,好用但信任被垄断;账本的对错,最终靠人(制度、审计)而不是靠数学保证。
第 3 课:区块链的解法——把账本交给所有人
🧑🏫 老师:
区块链的答案激进得多:把账本复制给网络里的每一个参与者,让「改账」在数学上变得不可行。
比特币转账(你 → 商家)
你的钱包 ──► 广播到全网 ──┬──► 节点 1 的账本副本
├──► 节点 2 的账本副本
├──► 节点 3 的账本副本
└──► …… 几万个副本,人人一致
你信任:① 数学(签名:只有你能花你的钱)
② 共识(多数算力:大家看到同一本账)
③ 哈希(改一行,后面全部对不上)
不需要信任:任何机构、任何个人对照着读,差异全在「信任谁」:
| 中心化账本 | 区块链(分布式账本) | |
|---|---|---|
| 账本份数 | 1 份(机构保管) | 几万份(人手一份) |
| 谁能记账 | 机构 | 任何人(按共识规则) |
| 防 double spend 靠 | 机构的风控与数据库锁 | 全网验证「这笔钱没花过」 |
| 防改账靠 | 制度、审计、刑法 | 密码学(哈希 + 签名 + 共识) |
| 出错了 | 找客服 | 没有客服,代码即规则 |
「信任锚从机构移到数学」——这句话就是 Web3 的纲领。往后每一篇都在兑现这个承诺的某一块零件:哈希保证「改没改过」看得见(0.2),签名保证「这是谁的」伪造不了(0.3),共识保证「几千个陌生人记同一本账」(1.2)。
一句话收口:分布式账本 = 账本人手一份、以数学而不是机构作信任锚;代价是没有客服、没有撤销,规则写死在代码里。
插问 2:人人都有一本账,怎么保证大家记的一样?
🧑🎓 学生: 等等,几万个人各自记账,A 的消息先到了节点 1、后到了节点 5,两本账不就不一样了?作恶者再故意发两版账本……这不比一本账更乱吗?
🧑🏫 老师:
问到系列的主脊梁上了。你说的两个现象都真实存在,名字分别叫:
- 网络延迟导致的分叉:两笔合法交易到达顺序不同,账本短暂不一致——解法是最终一致性 + 最长链原则(1.2 篇展开);
- 作恶者发假账:叛徒将军回来了——解法是 PoW/PoS 共识:让「伪造一本被全网接受的历史」需要耗尽全网的算力或押上全部押金,经济上不划算(1.2、8.1 篇展开)。
但所有这些共识机制能运转,都踩在一块共同的地基上:哈希函数——它让「账本的一页」和「上一页」用指纹焊死,改任何一笔,后面所有指纹全部对不上,假账一眼假。这块地基没有循环、没有玄学,就是下一整篇的内容(0.2)。本篇只需要记住路线:
双花问题 ──► 唯一账本 ──► 谁保管?
├── 机构(中心化)
└── 全员 + 数学(区块链)
├── 哈希:改没改过,看得见(0.2)
├── 签名:是谁的钱,伪造不了(0.3)
└── 共识:大家记的,是同一本(1.2 / 8.1)一句话收口:「大家怎么记成同一本账」= 共识问题,是后面几篇的主菜;本篇只需要把「账本人手一份 + 数学担保」这个大方向立住。
第 4 课:亲眼看见一条真实的链
🧑🏫 老师:
概念讲再多,不如亲手摸一下真链。比特币有一个公共 API(blockstream.info,无需注册),curl 一下创世区块——2009 年 1 月 3 日挖出的第 0 号区块:
curl -s https://blockstream.info/api/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f{
"id": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
"height": 0,
"version": 1,
"timestamp": 1231006505,
"tx_count": 1,
"size": 285,
"weight": 1140,
"merkle_root": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"previousblockhash": null,
"mediantime": 1231006505,
"nonce": 2083236893,
"bits": 486604799,
"difficulty": 1.0
}逐字段读几个:height: 0(第 0 块)、previousblockhash: null(它前面没有块——链的起点)、difficulty: 1.0(当年难度是 1)。这个块里只有一笔交易(挖矿奖励),交易的输入里塞了一段十六进制文本,解码:
python3 -c "print(bytes.fromhex('5468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73').decode())"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks「2009 年 1 月 3 日,财长站在第二轮银行救助的边缘」——当天《泰晤士报》头版标题,被中本聪永久刻进了区块链的第一块。既是对「中心化记账者不靠谱」的时间戳证明,也是这个系统的创世宣言。没有人能改它——这就是第 3 课「改账在数学上不可行」的实物。
再看看今天。最新区块(本机 2026-08 实查):
"height":964022,"tx_count":3700,"difficulty":125807076547197.55,...96 万多个区块后,难度从 1 涨到了 125 万亿——这条链已经不间断跑了 17 年。以太坊那边,一条命令问块高:
curl -s -X POST https://ethereum-rpc.publicnode.com \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'{"jsonrpc":"2.0","result":"0x18a2f31","id":1}0x18a2f31 = 十进制 25,872,177——以太坊已经执行到第两千五百多万个区块。你刚才没有登录任何账号、没有申请任何 key,就查到了全球共享账本的最新状态:这台「世界账本」对所有人开放读,这是中心化系统从结构上给不了的东西。
一句话收口:创世块里的泰晤士报头条 = 不可篡改的实物证据;几万节点 17 年不间断、人人可查,就是「把账本交给所有人」的活样本。
第 5 课:Web1、Web2、Web3——你在网上的东西,到底归谁
🧑🎓 学生: 「Web3」这个词我总觉得是营销话术。它和区块链是什么关系?
🧑🏫 老师:
把 Web 的三代按「谁持有数据」排开,这个词就有实义了:
| Web1(约 1990-2004) | Web2(2004-今) | Web3(进行中) | |
|---|---|---|---|
| 你能干嘛 | 只读(看门户、看论坛) | 读写(发帖、上传、社交) | 读写 + 持有 |
| 数据在哪 | 网站的服务器 | 平台的服务器 | 链上 + 你自己的密钥 |
| 账号是什么 | 没有「账号」 | 平台发的账号(手机号/邮箱) | 一对密钥 |
| 平台能对你怎样 | — | 封号、删帖、改规则、卖你的数据 | 合约规则写死,谁都改不了(包括作者) |
Web3 的技术定义就一句话:用区块链把「所有权」做成协议的一部分——你的资产、你的身份、你合约里的规则,由你的私钥和公开的合约代码决定,而不是由某家公司的数据库和管理员决定。
于是有了那句圈子里最著名的话:
Not your keys, not your coins.(钥匙不在你手里,币就不是你的。)
在交易所里放着币,本质是「交易所欠你一笔币」的记账——账本在交易所手里,和银行存款同构(回到第 2 课)。只有私钥在你自己手里(自托管钱包),资产才是「第 3 课」意义上的链上直接持有。这句话同时是 Web3 最大的劝退点:钥匙丢了,没有人能帮你找回——它是自由的对价。怎么安全地管钥匙,0.4 篇整篇都讲它。
一句话收口:Web3 = 把所有权写进协议:钥匙(而不是平台账号)即身份与资产;自由的对价是自己负责,丢了没人救。
插问 3:区块链、公链、联盟链、智能合约、DApp、DeFi、L2……都是什么?
🧑🎓 学生: 这些词天天见,我一直假装懂了。能不能一次说清?
🧑🏫 老师:
按「从地基到楼」的顺序过一遍,每个词一句话,后面都有整篇等着:
| 术语 | 一句话 | 哪篇展开 |
|---|---|---|
| 区块链 | 用哈希串起来、由共识维护的分布式账本 | 0.2、0.5 |
| 公链 | 谁都能加入/读/写(比特币、以太坊)——本系列默认语境 | 全程 |
| 联盟链 | 只有许可的机构节点参与(如供应链金融),牺牲去中心化换性能与合规 | 9.1 提及 |
| 智能合约 | 部署在链上、自动执行、部署后谁都改不了的程序(以太坊的主创新) | 3.x 起 |
| DApp | 前端 + 智能合约的应用:逻辑在链上,界面在浏览器 | 5.x |
| DeFi | 用合约组合出的金融协议(兑换、借贷、稳定币),没有柜台 | 7.x |
| L2 | 把计算搬到链下、把安全锚定在以太坊上的扩容层(Rollup) | 8.x |
一个校准直觉的提醒:比特币是「原型机」,以太坊才是「世界计算机」。比特币证明了「不靠机构的账本」可行,但它刻意不提供通用计算(1.3、1.4 讲为什么);以太坊把账本升级成可编程的状态机,才有后面的一切。这也是学习路线先比特币后以太坊的原因——理解它的取舍,才能看懂后来者为什么那样设计。
一句话收口:地基(区块链/公链)→ 可编程(智能合约)→ 应用(DApp/DeFi)→ 扩容(L2);比特币是原型机,以太坊是主战场。
第 6 课:你的第一笔链上转账(读者作业)
🧑🏫 老师:
最后一步必须你亲手做——本课的验收不是「看懂」,是「完成」:
- 装 MetaMask(浏览器插件):它会让你写下 12 个单词的助记词——这就是你的钥匙。用测试网练习,助记词永远不发给任何人;
- 切到 Sepolia 测试网,从水龙头免费领测试 ETH(搜索 "Sepolia faucet",用 GitHub 账号等免费领);
- 给自己的另一个地址(或同学的要来的地址)转 0.01 testnet ETH;
- 在 Etherscan(切到 Sepolia 网络)粘贴你的地址,找到那笔交易,记下交易哈希和所在区块高度。
做完你会发现:第 4 课里那些 JSON 字段(块高、hash),在你自己的交易旁边出现了。整个系列的实验从这一刻开始都是同一条路:每一笔操作,都能在公开账本上指出它的位置。
(诚实说明:这步需要浏览器与领水操作,无法由本文代跑;所有「本机实跑」的输出都来自前几课的命令行实验。)
一句话收口:学习 Web3 的最小闭环 = 钱包 → 测试网 → 一笔转账 → 区块浏览器上找到它;从今天起,你的每个实验都留下链上坐标。
小结
把整场对话收成一张账:
- 双花:数字文件可复制 vs 钱必须唯一——区块链要杀死的第一个敌人(第 1 课实跑)。
- 拜占庭将军:同一个问题的抽象——有叛徒也要达成一致(插问 1)。
- 中心化账本:唯一账本交给机构,好用但信任被垄断(第 2 课)。
- 分布式账本:账本人手一份,信任锚从机构移到数学(第 3 课)。
- 共识:大家怎么记成同一本——埋给 0.2 哈希、1.2 PoW、8.1 PoS(插问 2)。
- 真实链:创世块里的泰晤士报头条、96 万块 17 年不间断、人人可查(第 4 课实查)。
- Web3:所有权写进协议,Not your keys, not your coins(第 5 课)。
- 术语版图:地基 → 可编程 → 应用 → 扩容(插问 3)。
验收清单(做完再进下一篇):
思考题:交易所里的币和自托管钱包里的币,在「谁保管账本」这个维度上分别对应第 2 课还是第 3 课的模型?(提示:交易所冷热钱包、提现审核。)
下一篇:《哈希函数与默克尔树:区块链的指纹术》——把「改一行、全网指纹全断」这件事,用 40 行 Python 亲手造出来。
本篇实验脚本(可照抄)
# doublespend.py —— 双花模拟
import shutil, os
print("===== 场景一:把『币』当文件(数字商品) =====")
open("coin.txt", "w").write("10 gold coins, owner: A") # A 有 10 金币
shutil.copy("coin.txt", "coin-to-B.txt") # 「转」给 B
shutil.copy("coin.txt", "coin-to-C.txt") # 同一笔再「转」给 C
print("A 手里:", sorted(f for f in os.listdir(".") if f.startswith("coin")))
print(">>> 同一笔钱花了两次(双花成立),没人拦得住\n")
print("===== 场景二:账本记账 =====")
ledger = {"A": 10, "B": 0, "C": 0}
def pay(frm, to, amount):
if ledger[frm] < amount:
print(f"拒绝: {frm} -> {to} {amount}(余额不足,{frm} 只有 {ledger[frm]})")
return False
ledger[frm] -= amount; ledger[to] += amount
print(f"记账: {frm} -> {to} {amount},账本: {ledger}")
return True
pay("A", "B", 10) # 第一笔成功
pay("A", "C", 10) # 第二笔被拒
print(">>> 第二笔花不出去——账本面前,钱只能花一次")参考资料
- ethereum.org — 什么是区块链
- 比特币白皮书(创世块头条见第 4 课)
- blockstream.info API(本篇第 4 课所用公共接口)
- 本机:WSL2 Ubuntu-22.04 + Python 3.10;链上数据 2026-08 实查