← COMP5567 全部讲次
L01 · 第 1 周

L01 区块链导论:一本贴在公告栏上、谁都能抄的账

账本为什么要去中心化,区块怎么串成链,最长的那条为什么算数。

一句话版

区块链是网络、链式账本和生成它的算法三件套,这一讲只解决一个问题:这本大家共用的账,谁来写。

一个类比:贴在公告栏上的公共账本

设想一栋楼不设物业,水电分摊全靠公告栏上的一叠活页账。每户手里都抄着一模一样的一整本,不是各管一页。新的一页贴上去之前得先在页眉抄下上一页的「指纹」——谁想撕掉中间某页换个数字,后面所有页的页眉就全对不上,只能整叠重写。谁有资格贴新的一页?楼里有个很费力气的猜数字游戏,谁先猜中谁贴,贴完全楼照抄。要是两个人同时猜中、同时贴,公告栏上就并排出现两叠,大家先随便跟一叠往下贴,最终厚的那叠算数,薄的那叠作废。

四件事都能挂回这个场景:人手一本完整副本(去中心化账本),页眉抄上一页指纹(Prev Hash),猜数字换贴纸权(PoW 与挖矿),最厚那叠算数(最长链规则)。

类比在哪里失效:公告栏的账页物理上撕得掉,链上的区块改一个字节就要把它之后所有块重挖一遍,而诚实节点还在往前推进——改得了,只是代价大到不划算(p.24)。楼里的住户靠笔迹认人,共享账本靠数字签名,任何人都能验、不需要第三方背书(p.14)。还有一点更要紧:公告栏本身是个中心,而这门课假设的网络里没有公告栏,每个节点自己就是自己的公告栏,消息还会延迟、乱序、丢失(p.30)。

概念卡

1. 共享账本与那个核心问题(Shared Ledger)

人话定义:中心化记账是一人一本、由银行核验同意;去中心化记账是全网共用一本,每行交易带一个数字签名表示同意。前者信任机构,后者信任技术。

例子:课件 p.14 把两种账并排画出来。左边是银行视角:Alice 的账本上 12/3 收 10、余额 200,Bob 的账本上同一天付 10、余额 300,两本要对得上靠银行担保。右边的共享账本只有一张表,每行是 Bob → Alice : 10 加上 Bob 的数字签名。

常见误解

以为签名解决了全部问题 → 签名只回答「这笔转账是谁授权的」,没回答「这些交易的先后顺序谁定、谁把它们写进账本」。课件在这一页直接抛出全课的核心问句 Who maintains this ledger?,后面十几讲的 PoW、PoS、2PC、PBFT、Raft、HotStuff 全是这一问的不同答案(p.14)。

2. 区块头的五类字段与 80 字节(Block Header)

人话定义:每个区块分头和体,交易存在体里,头里放五类元信息,各有明确分工。

例子:p.19 给的分工表——Prev Hash 用来成链,Merkle Root 用来保证数据完整性,Target 与 Nonce 供 PoW 使用,另外两项是 Version 和 Time。p.20 补上字节数:Previous Block Hash 32 字节、Merkle Root 32 字节(都是 256 位,因为用 SHA-256),Version、Timestamp、Target/nBits、Nonce 各 4 字节,加起来固定 80 字节,这就是挖矿时被反复哈希的那一段。

按真实字节宽度排开,两个 32 占了大头:

区块头六个字段按真实字节数排成一条:Version 4、Prev Hash 32、Merkle Root 32、Time 4、nBits 4、Nonce 4,合计 80 字节;Magic no、Block size、Transaction counter 和 Transactions 都不算在这 80 字节里

常见误解

把 Magic no(固定值 0xD9B4BEF9)和 Block size 也算进区块头 → 这两项各 4 字节,但不在那 80 字节里(p.20)。问 Merkle Root 干什么用,答「保证区块内交易的完整性,改任何一笔交易都会让它变化」;问 Prev Hash 干什么用,答「把区块串成链,并使得篡改历史必须重算其后所有区块」(p.19)。

3. 出块三步与 PoW 的穷举本质(Proof-of-Work)

人话定义:出一个块分三步——收集一批有效交易并算出 Merkle Root;反复计算区块头的哈希,每次把 nonce 加 1,直到结果小于目标值;挖成功后把区块广播到全网。

例子:p.23 的流程图输入是区块头六个字段,过两次 SHA-256,得到 0000008bb8… 这种带前导零的结果就算有效,无效就 nonce 加 1 重算。图上给的具体值是 Merkle Root 06c056519733、Timestamp 1507292970、Nonce 1559164。前导零的个数就是难度,target 越小要求的前导零越多。

课件那张流程图:

出块流程图:区块头六个字段作为输入,连过两次 SHA-256,结果带足够多前导零就算有效并广播,否则把 nonce 加 1 回到上一步重算
图片来源:COMP5567 Lecture_1-Blockchain-introduction.pdf, p.23
常见误解

把 PoW 想成「解一道数学难题」→ 它是碰运气式的穷举,每次尝试成功的概率固定且独立,除了一个个试没有别的办法(p.23)。正因如此算力可以直接换算成出块概率。第 2 步里唯一在变的只有 nonce,前块哈希、Merkle Root、时间戳、target 在这一轮里全都固定(p.22)。

4. 只追加账本与最长链(Append-Only Ledger & Longest Chain Rule)

人话定义:每个区块含有前一区块头的哈希,改一处会让其后所有区块连锁失效;出现分叉时,长的那条才是真链。

例子:p.24 问「有人想改一条已有记录会怎样」,p.25 画了两条分叉,一条长度 4、一条长度 2。两张图合看:

上半是篡改的连锁失效:把 Block#2 里的 Record2 改成 Record2',Block#3 存的 Prev Hash 对不上而失效,Block#4 跟着失效;下半是分叉,只到 Block#2' 的一支长度为 2,Block#2 到 Block#4 的一支长度为 4,节点按最长链规则认长的那条

常见误解

以为分叉是故障 → 两个矿工几乎同时挖到就会分叉,这是正常现象(p.27)。节点遵循最长链规则,长度相同时任选一条,最终会有一条变得更长(p.28)。这里出现了全课第一个「最终一致性」:比特币不保证任何时刻全网状态完全一致,只保证分歧最终收敛。

5. 五层结构与本课的位置(Layered Architecture)

人话定义:课件把区块链技术栈画成五层,这门课只打其中一层。

例子:p.31 自上而下是应用与表示层(Smart Contracts、Chaincode、DApps、UI)、共识层(PoW – PoS – PBFT)、网络层(Peer-to-peer、分布式通信)、数据层(Merkle Tree、Transaction、Signature)、硬件与基础设施层(虚拟机、容器、消息)。共识层那一行旁边标着 Focus of this subject。讲师在 p.36 又把同一张图放了一遍。

区块链技术栈五层结构表,自上而下是应用与表示层、共识层、网络层、数据层、硬件与基础设施层,每层列出对应技术,红色 Focus of this subject 的引线指向中间的共识层一带
图片来源:COMP5567 Lecture_1-Blockchain-introduction.pdf, p.31
常见误解

以为密码学细节要深挖 → 数据层的哈希、签名、Merkle 树在本课只当工具用,不深究;上面的智能合约和 DApp 不考。做题时先问一句它在问哪一层,问的不是共识层就不是本课重点(p.31)。

把它们串起来

这一讲的主线是一条问句链。先有账本形态的选择:中心化那本由银行担保,去中心化那本靠签名表达同意,于是冒出「谁来维护这本共享账本」。答这一问需要三样东西同时到位——p.17 把区块链拆成 P2P 网络、不断增长的区块链、以及让网络生成这条链的算法,并在「链」后面加了个括号 actually, not necessary a chain,提醒分布式账本也可采用 DAG 等非链式结构。多数人只记得第二项,真正难的是第三项。

剩下的内容就是这三样各自的落点。数据结构落在区块头:Prev Hash 把块串起来,Merkle Root 把块内交易锁住,两者合起来让「改一处等于重挖后面全部」成立。算法落在 PoW:谁先穷举出合法 nonce 谁获得出块权(p.26 把挖矿直接定义为「生产新区块的权利」),算力等价于概率。网络落在广播与分叉:消息传得慢就会有人同时中奖,于是需要最长链规则做裁决,而裁决只保证最终收敛。p.30 顺带给出了后面所有协议的分类坐标:崩溃故障是节点停机、之后什么都不发,由 2PC、3PC、Paxos、VR、Raft 处理;拜占庭故障允许任意偏离协议,包括停发、选择性发消息或发送矛盾内容,由 PBFT、HotStuff 处理。

这条「概率最终性」的线索会一路对照到后面。PBFT 那类协议一旦提交就不回滚,属于确定性最终性,两者的分野从 p.28 开始记。p.35 的组织结构图还给出了全课的递进关系:事件排序(向量时钟,L2)→ 消息正确顺序(CO-URB、TOB,L3)→ 提交或中止一笔交易(3PC,L6)→ 共识(L7 到 L10),每一层建立在前一层之上。

课件里的坑

  • 本讲课件未发现错误。

课后 10 分钟:考点复习

这 10 分钟怎么用:合上页面,先默写三条——区块头 80 字节的那道加法、出块三步、最长链规则;再把下面的「变式题」做一遍;最后回查两个最容易错的地方——把 Magic no 和 Block size 算进区块头、把 PoW 想成解一道数学难题。三步做完再往下看答案。

必背

  1. 区块链 = P2P 网络 + 不断增长的链式结构 + 生成这条链的算法,三者缺一不可;课件注明「实际上不一定是链」。
  2. 区块头五要素的用途:Prev Hash 成链、Merkle Root 保证块内交易完整性、Target 与 Nonce 做 PoW,另有 Version 和 Time。
  3. 区块头固定 80 字节 = 4 + 32 + 32 + 4 + 4 + 4;Magic no 与 Block size 各 4 字节,不算在区块头内。
  4. 出块三步:收集有效交易算 Merkle Root → 改 nonce 反复做双 SHA-256 直到哈希小于 target → 广播全网。
  5. PoW 是穷举碰运气,每次尝试概率固定且独立,算力直接等价于出块概率。
  6. 不可篡改的机制是代价:改一块要重挖其后所有块,而诚实链还在前进。
  7. Bitcoin 选择有效分支中累计工作量最大者;课件把同难度情形简写为最长链,收敛依赖网络与诚实算力假设。
  8. 共识层(PoW – PoS – PBFT)是本课唯一战场;概率最终性与确定性最终性是贯穿全课的对比线索。

完整例题

期末 3 小时开卷。翻书能查到的定义在开卷场景下考查价值低,现场要推的才是我押的方向(我的判断,课程没公布题型)。这一讲能动笔的地方集中在字节数和阈值上,两问都是同一种做法:把课件给的表和不等式直接代进去。

(1) 把区块头的字节数加一遍,为什么是 80?

  1. 按 p.20 的表逐项取值:Version 4、Previous Block Hash 32、Merkle Root 32、Timestamp 4、Target/nBits 4、Nonce 4。
  2. 相加:4 + 32 + 32 + 4 + 4 + 4 = 80 字节
  3. 两个 32 的来历:SHA-256 输出 256 位,256 ÷ 8 = 32 字节,所以 Prev Hash 和 Merkle Root 各占 32。
  4. 容易多加的两项:Magic no 4 字节和 Block size 4 字节。它们在 p.20 的同一张表里,但不属于区块头,加上就变成 88,答错。
  5. 另外两项 Transaction counter(1–9 字节)和 Transactions(不定长)属于区块体,长度不固定,更不可能进那 80 字节。

(2) H( ) < 2¹⁸⁶ 要求哈希的前多少位是 0?改成 < 2¹⁷⁰ 难度变多少倍?

  1. SHA-256 的输出是 256 位。一个 256 位整数小于 2¹⁸⁶,等价于它的最高 256 − 186 = 70 位全为 0(p.26)。
  2. 同一算法代到 2¹⁷⁰:256 − 170 = 86 位全为 0,要求前导零多了 16 位。
  3. 合法哈希的个数从 2¹⁸⁶ 个缩到 2¹⁷⁰ 个,命中概率降为原来的 2¹⁷⁰ / 2¹⁸⁶ = 2⁻¹⁶,期望尝试次数放大 2¹⁶ = 65,536 倍(补充)。
  4. 答题时把「指数越小、阈值越小、前导零越多、难度越高」这条单调关系写出来,比只写数字稳。

变式题(先自己做)

(1) 阈值改成 H( ) < 2¹⁶⁰,要求哈希的前多少位是 0?比 < 2¹⁸⁶ 难多少倍? (2) 假设有人把区块头里的 Timestamp 和 Nonce 各扩到 8 字节,其余字段不动,区块头变成多少字节?

提示

第一问两步:先算前导零位数,再比两个阈值的个数之比。第二问回到那张字段表,先确认哪六项才算区块头。

参考答案与自检(非官方评分标准)

自检要点:① 前导零位数 = 256 − 指数,不是别的减法;② 难度倍数写成 2 的指数差,能给出数量级更好;③ 第二问不能把 Magic no 和 Block size 算进去。

(1) 256 − 160 = 96 位全为 0。合法哈希个数从 2¹⁸⁶ 缩到 2¹⁶⁰,命中概率降为 2⁻²⁶,期望尝试次数放大 2²⁶ ≈ 6.7 × 10⁷ 倍。单调关系照旧:指数越小 → 阈值越小 → 前导零越多 → 越难。

(2) 区块头六项:Version 4 + Prev Hash 32 + Merkle Root 32 + Timestamp 8 + nBits 4 + Nonce 8 = 88 字节。两个 32 不受影响,因为它们由 SHA-256 的 256 位输出定死。Magic no 和 Block size 各 4 字节仍然在头外,加进去得到 96 就错了——这两项和 Transaction counter、Transactions 一样,不属于那个被反复哈希的 80(现在是 88)字节。

闪卡自测

1. 中心化账本和去中心化账本,各自靠什么让一笔交易算数?

中心化账本一人一本,靠信任银行去核验同意;去中心化账本全网共用一本,靠数字签名表达同意。前者信任机构,后者信任技术(p.14)。

2. 课件在讲完账本对比之后抛出的核心问句是什么?为什么它是整门课的题目?

Who maintains this ledger? 签名只解决「是谁授权的」,没解决「谁来决定交易顺序、谁把它们写进账本」,后面 PoW、PoS、2PC、PBFT、Raft、HotStuff 都是这一问的不同答案(p.14)。

3. 区块链的三要素是什么?课件为什么在第二项后面加了个括号?

P2P 网络、不断增长的区块链、让网络生成这条链的算法。括号里写的是 actually, not necessary a chain,提醒分布式账本还可以采用 DAG 等结构(p.17)。

4. Prev Hash 和 Merkle Root 各保护什么?只改一笔交易但不改 Merkle Root,会被发现吗?

Prev Hash 把区块串成链并让篡改历史必须重算其后所有区块;Merkle Root 保证块内交易的完整性(p.19)。会被发现:Merkle Root 是基于块内全部交易算出的 256 位哈希,交易一改,重算出的根就和头里存的对不上(p.20)。

5. 把区块头的八个候选字段筛一遍,哪些进那 80 字节、哪些不进?

进:Version 4、Prev Hash 32、Merkle Root 32、Timestamp 4、Target/nBits 4、Nonce 4,合计 80。不进:Magic no 4、Block size 4,以及区块体里的 Transaction counter(1–9 字节)和 Transactions(不定长)(p.20)。

6. 出块的三步分别是什么?第 2 步里哪些字段在变、哪些不变?

收集有效交易并算出 Merkle Root → 反复计算区块头哈希、每次 nonce 加 1 直到小于目标值 → 广播全网(p.22)。第 2 步里只有 nonce 在变,前块哈希、Merkle Root、时间戳、target 这一轮都固定。

7. 为什么说算力可以直接换算成出块概率?

PoW 是穷举,每次尝试成功的概率固定且独立,所以单位时间能做多少次尝试,就按比例决定抢到出块权的概率(p.23)。

8. 改掉 Block#2 里的一条记录会连锁发生什么?为什么这叫不可篡改?

Block#2 的哈希变了 → Block#3 存的 Prev Hash 对不上 → Block#3 失效 → Block#4 也失效。要让改过的链被承认,必须把其后所有区块重挖一遍,而诚实链同时还在往前推进(p.24)。

9. 两个矿工同时挖到块,节点该怎么办?这个过程有确定的时间上界吗?

遵循最长链规则;长度相同时任选一条;最终会有一条链变得更长(p.28)。没有确定上界,这是概率意义上的最终收敛,和 PBFT 那类的确定性最终性相对(p.28)。

10. 挖矿在课件里的定义是什么?谜题被写成什么形式?

Mining: the right to produce a new block,挖矿等于获得生产新区块的权利,第一个解出谜题的矿工得到发布该区块的权利。谜题形式写成 H( ) < 2¹⁸⁶,即要求哈希的前 70 位为 0(p.26)。

11. p.31 五层里,智能合约在哪一层?Merkle 树在哪一层?本课考哪一层?

智能合约在应用与表示层,Merkle 树在数据层,本课只考共识层(PoW – PoS – PBFT),课件在那一行标了 Focus of this subject(p.31)。

12. 崩溃故障和拜占庭故障的行为差别是什么?各由哪些协议处理?

崩溃故障是节点停机、之后什么都不发;拜占庭故障是节点照常在线但发送任意内容,包括对不同节点说相反的话。前者由 2PC、3PC、Paxos、VR、Raft 处理,后者由 PBFT、HotStuff 处理(p.30)。

下一讲

下一讲把讨论对象从区块链这个具体系统抽象成「一组要维持一致状态的节点」,先补上分布式系统的基本属性和三种网络时序假设,再进入逻辑时钟——本讲 p.35 那张图里的第一环「事件排序」就从那里开始。

下一讲 →
L02 L02 分布式系统:一个没有统一手表的跨时区群聊

个人整理的学习笔记,不是官方材料;数字与结论以课件和讲师为准。