← COMP5565 全部讲次
L01 · 第 1 周

L01 Introduction:一本谁都能抄、谁都改不动的公共账本

从双花问题出发,讲清账本谁来记、怎么防改、记成什么格式。

一句话版

数字的东西能复制,所以别记「谁拿着币」,改成全网一起记一本谁都改不动的流水账。

一个类比:小区公告栏上的流水账

想象一个没有物业、没有会计的小区。大家要记清楚谁交了多少钱、谁领走了多少,于是在公告栏上贴一张流水账:每笔进出都写上去,写完就不许涂改,每个住户回家还各抄一份留底。

这张公告栏解释了本讲几乎所有设计。为什么要公告栏:钱如果是一张能复印的纸,谁都能花两次,只有把每一笔来龙去脉都记下来,别人才算得出你还剩多少(双花与公开账本)。为什么不许涂改:每贴一张新纸,都要在开头抄一遍上一张纸的「缩略图」,改了上一张,后面所有纸的开头就全对不上(Prev Hash)。谁来贴新纸:住户轮流当值,贴完别人各自核一遍,两个人同时贴就看哪一摞先变厚(共识与最长链规则)。账怎么记:可以维护一张随交易更新的账户余额表,也可以只写「这笔钱来自哪一笔、去了谁手上」——这就是账户模型和 UTXO 模型的分歧。

类比在哪里失效:公告栏的纸是一张张摞起来的,改中间一张后面不会自动报废;链上的「对不上」是哈希算出来的硬结果,不靠人眼比对。住户轮值靠约定,链上轮值得先赢一场算力或权益的竞争,而且写下去的不只是数字,还可以是一段会自己执行的程序。最要紧的一点:公告栏撕一张就没了,链上的「撕掉」需要让替代历史的累计工作量胜出;多数算力显著提高成功能力,但少数算力也不是零概率。

概念卡

1. 双花(Double-Spending)

人话定义:纸币靠物理防伪,给出去就没了;数字货币是一串比特,复制零成本,所以「我有多少钱」不能靠持有凭证证明。

例子:课件的解法有个思路转弯:放弃币的实体性,改成记账(p.13):维护一本公开账本记录所有交易,任何人都能查账确认余额够不够。比特币白皮书里那句话说得更狠:数字签名只解决了「这笔是谁授权的」,解决不了「有没有花过两次」(p.38)。

常见误解

以为去中心化是为了「没人管」→ 它要换掉的是信任对象。中心化模式下 Bob 同意付款由银行担保,去中心化模式下由 Bob 的私钥签名担保,谁都能验签,不需要相信任何人(p.14)。

2. Prev Hash 与篡改检测

人话定义:「链」不是数组也不是链表指针,是用哈希值当指针——块 N 的头里存的是块 N−1 的哈希。老师管它叫前一个块的 thumbnail(缩略图)。

例子:改一块,后面全部连坐(p.20):

四个区块横向串起来,每块存着上一块的哈希;把 Block#2 的记录改成 Record'2 后它的哈希随之改变,Block#3 里存的旧哈希立刻对不上,想蒙混过关就得把 Block#3、#4 以及后面所有块的哈希全部重算

常见误解

以为哈希链本身就让篡改不可能 → 它只提供可检测性。让重算变得昂贵、从而使篡改不可行的是 PoW 加累计工作量最大的链规则。两者是两层,答题别混在一起(p.20、p.36)。

3. append-only 的四条性质

人话定义:只增不改的数据结构有四条性质,前三条是所有区块链共有的,第四条课件特意打了问号。

例子:Persistence 写进去不能删;Consensus 诚实节点最终对同一份历史达成一致(注意是 eventually,短期允许分叉);Liveness 合法交易最终能被打包;Open(?) 任何人都能写(p.28)。那个问号是伏笔——许可链就是把 Open 拿掉换性能。

常见误解

把 Consensus 理解成「任何时刻全网状态一致」→ 定义里是 eventually,分叉是正常物理现象:两个矿工几乎同时出块,网络传播有延迟,一部分节点先看到 A、另一部分先看到 B(p.21、p.25)。

4. 账户模型(Account Model)

人话定义:账户模型维护随交易更新的状态;以太坊区块记录交易和状态根承诺,并非把全部账户余额复制进每个块。转账就是减发送方、加接收方。

例子:课件 p.47 的表里交易写成 Bob→Tom, 5, 1,意思是转 5、手续费 1。付款人一共掏 6,收款人只收 5,那 1 归矿工。矿工收益公式是 Miner's Reward = Block Subsidy + Transaction Fee

常见误解

以为手续费是从转账金额里扣的 → 账户模型下手续费是交易里的显式字段,由付款人额外承担。另外课件 p.48 专门说明表里省略了两样真实系统必需的东西:签名,以及防重放机制——「Alice→Bob 10」这条消息没有额外标记的话可以被任何人重新广播一次,所以每个账户要带一个递增的 nonce。

5. UTXO 模型(Unspent Transaction Output)

人话定义:链上存的是交易不是余额。四条规则:输入引用之前某笔交易的输出、输出规定谁能花、每个输出只能被引用一次、矿工维护未花费输出的集合(p.49)。

例子:p.50 里 A 要给 B 转 8,手上只有 Tx1:1 这张面额 10 的「钞票」:

A 手上唯一的 UTXO Tx1:1 面额 10 不能只花一部分,必须整张作为输入投进交易 TxID 2,产生两个输出:一张 8 归 B,一张 2 作为找零重新归 A;要留手续费时把找零调成 1,输入 10 减输出 9 的差额归矿工

加上手续费之后(p.52)输出变成 1 和 8,矿工的 coinbase 从 2 变 3。

常见误解

在 UTXO 链上找「余额」字段 → 没有这个字段,余额是钱包软件把所有属于你的 UTXO 加总算出来的。手续费同理,不是字段而是差额 fee = Σ inputs − Σ outputs;构造交易时忘了给自己加找零输出,整个差额都会被当手续费送给矿工(p.52)。

6. 智能合约与 DApp

人话定义:两个定义要分开背。Szabo 在 1990 年代给的是概念层定义——一组以数字形式规定的承诺以及各方履行承诺所依据的协议;以太坊语境给的是工程层定义——在 EVM 中确定性执行的不可变计算机程序(p.55)。

例子:p.63 里 Bob 部署了一个答题领奖合约 C1,存进 1 个币:谁提交的 w 满足 w*w + 10*w + 3 == 59,合约就自动付 1 个币。p.64 里 Alice 提交 w = 4,条件成立,Alice 从 0 变 1,C1 从 1 变 0。整个过程没有任何人「批准」这笔付款。

常见误解

把自动执行等同于法律效力 → 课件的 no legal value 应理解为技术机制本身不自动赋予法律效力;不能推广成所有智能合约都无法律效力。另外 DApp = 智能合约 + 大多为静态的前端内容,这是本课程名里 Decentralized Apps 的定义(p.55)。

把它们串起来

主线是一条因果链:数字的东西能复制,所以要记账(双花 → 公开账本);账本谁都能抄,所以要防改(Prev Hash → 篡改可检测);防改只是能发现,要让改不划算还得有人抢着出块(共识 → 最长链 → 51% 攻击的成本门槛);出块规则定下来了,才轮到讨论账怎么记(账户模型 vs UTXO 模型);账里能记的不只是数字,还能记一段代码(智能合约 → DApp → DeFi);最后反过来问一句,如果参与方本来就互相认识,那开放性还要不要(许可链 → 可选择 BFT 等共识;是否有费用、何种最终性取决于具体协议与故障假设)。

整门课的骨架就藏在这条链里:它从「不存在单一可信第三方时如何协调多方」这个定义出发(p.15),一路推到 Fabric 那种「知道你是谁,就不用让你证明你烧了电」的设计。

课件里的坑

  • 本讲课件未发现错误。

课后 10 分钟:考点复习

这 10 分钟怎么用:合上页面,先默写三条——双花难题与它的解法、Prev Hash 只提供「可检测」、账户模型与 UTXO 的记账差别;再把下面的「变式题」做一遍;最后回查两个最容易错的地方——以为手续费从转账金额里扣、在 UTXO 链上找「余额」字段。三步做完再往下看答案。

必背

  1. 双花是数字货币的根本难题;解法是放弃币的实体性改成记账——公开账本加数字签名,信任从机构转到技术。
  2. Prev Hash 只提供「可检测」:改一块后面全对不上;让篡改「不可行」的是 PoW 加累计工作量最大的链规则,两者别混。
  3. append-only 四性质 Persistence / Consensus / Liveness / Open(?),前三条通用,Open 打问号,许可链没有。
  4. 交易记录六步里第 3 步(出块者打包时)和第 5 步(验证者收块时)都要执行一遍交易,这是公链慢的根本原因。
  5. 账户模型:Miner’s Reward = Block Subsidy + Transaction Fee,手续费由付款人在转账金额之外额外承担,防重放靠 nonce。
  6. UTXO 模型:输入必须整额消耗、剩余显式找零,每个输出只能被引用一次,手续费 = Σ inputs − Σ outputs,天然免疫重放。
  7. 智能合约 = 在 EVM 中确定性执行的程序;自动执行不自动决定法律效力;DApp = 智能合约 + 大多为静态的前端内容。
  8. 许可链拿掉的正是那个打问号的 Open:节点需审批加入,传统 BFT 共识就够,因此不分叉、有最终性、无奖励无手续费。

完整例题

题面(课件 p.47):Block Subsidy = 2,Transaction Fee = 1。Block 18 的余额是 Alice 10、Bob 15、Tom 10。Block 19 由 Alice 出块,交易是 Bob→Tom, 5, 1;Block 20 由 Tom 出块,交易是 Alice→Bob, 10, 1。写出两个块之后三人的余额。

  1. 先记死规则:转 5 手续费 1,付款人掏 6,收款人收 5,矿工收 1;出块者另外白拿 subsidy 2。
  2. Block 19,矿工 Alice。Bob 是付款人:15 − 5 − 1 = 9。Tom 是收款人:10 + 5 = 15。Alice 拿 subsidy + fee:10 + 2 + 1 = 13
  3. 验一遍总量:19 − 18 之间系统多印了 2(subsidy),10 + 15 + 10 = 35,35 + 2 = 37 = 13 + 9 + 15 ✓。
  4. Block 20,矿工 Tom。Alice 是付款人:13 − 10 − 1 = 2。Bob 是收款人:9 + 10 = 19。Tom 拿 subsidy + fee:15 + 2 + 1 = 18
  5. 再验总量:37 + 2 = 39 = 2 + 19 + 18 ✓。
  6. 答案:Alice 2、Bob 19、Tom 18。对照 p.46(只有 subsidy 没有 fee)的结果是 Alice 2、Bob 20、Tom 17——差的正好是那两笔手续费的去向。

变式题(先自己做)

换一组数:Block Subsidy = 3,Transaction Fee = 2。Block 30 的余额是 Alice 20、Bob 8、Tom 12。Block 31 由 Bob 出块,交易 Alice→Tom, 7, 2;Block 32 由 Alice 出块,交易 Tom→Bob, 10, 2。写出两个块之后三人的余额。

提示

每块记两件事:付款人掏的是「转账额 + 手续费」,出块者白拿的是「subsidy + fee」。算完一块先用总量验一次再往下走。

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

自检要点:① 付款人扣的是 7 + 2 = 9,只扣 7 是最常见的错;② 出块者两笔都要收,subsidy 和 fee 不能只记一笔;③ 每块后用总量守恒验算——账本总量每块只增加一个 subsidy。

  1. Block 31(矿工 Bob):Alice 20 − 7 − 2 = 11;Tom 12 + 7 = 19;Bob 8 + 3 + 2 = 13
  2. 验总量:原来 20 + 8 + 12 = 40,加 subsidy 3 得 43 = 11 + 13 + 19 ✓。手续费只是在账内换了个主人,不影响总量。
  3. Block 32(矿工 Alice):Tom 19 − 10 − 2 = 7;Bob 13 + 10 = 23;Alice 11 + 3 + 2 = 16
  4. 验总量:43 + 3 = 46 = 16 + 23 + 7 ✓。
  5. 答案:Alice 16、Bob 23、Tom 7

闪卡自测

1. 为什么早期电子现金失败?公开账本具体解决了什么?

纸币靠物理防伪,数字货币能被电子复制,所以持有凭证不能证明所有权。公开账本记录所有交易,任何人都能查账确认余额是否充足,把「我有多少钱」变成一个可推算的结论(p.13)。

2. 中心化与去中心化账本的三点差异是什么?

一本 vs 每人一本:中心化是银行给每个用户各记一本流水,去中心化是所有人共用一本;同意的表达方式:银行验证 vs 数字签名;信任对象:信任机构 vs 信任技术(p.14)。

3. 有人改了 Block#2 里的一笔交易,系统怎么发现?他要付出什么代价?

Block#2 内容变了它的哈希就变,Block#3 里存的旧哈希对不上即被检测。要不被发现必须重算其后所有块的哈希,也就是造一条比当前更长的链,多数算力可持续占优,但不是成功改写的必要门槛;少数算力成功概率随确认加深而下降(p.20、p.36)。

4. 51% 攻击能做什么、不能做什么?

能双花自己的币、审查交易、回滚近期区块、让诚实矿工的块作废。不能凭空造币,也不能盗走别人私钥控制的币——签名验不过(p.36)。

5. 最长链规则解决什么问题?等长时怎么办?

解决分叉时听谁的。Bitcoin 实际比较累计工作量,等工作量时可先跟随先收到的候选,下一个块出来自然分出胜负。被抛弃那条链上的交易会被回滚,这就是交易所要等 N 个确认的原因(p.25、p.26)。

6. 交易记录六步是什么?哪两步都要执行交易?

一笔交易上链的六个步骤:客户端广播交易、交易进入各节点的交易池、出块者从池里挑交易组块并执行一遍确认合法、把新块广播出去、收到块的节点重新验证块里每笔交易、追加到链上并清理交易池;第三步和第五步都要完整执行一遍交易

第 3 步和第 5 步都要执行,出块者算一遍、每个验证者再各算一遍(p.30–35)。

7. 为什么账户模型需要 nonce 而 UTXO 不需要?

账户模型里「Alice→Bob 10」这条消息本身没有一次性标记,可以被重新广播,所以每个账户带一个递增计数器绑定交易。UTXO 里每个输出只能被引用一次,重放同一笔交易会因为输入已被花掉而直接失败(p.48、p.49)。

8. p.50 里 Block 3 那笔交易为什么有两个输入?

C 要收 23,而 B 手上是 Tx1:2 的 15 和 Tx2:2 的 8 两张,单张都不够,于是一笔交易同时引用这两个输入,合并成一个 23 的输出给 C。花完后 B 一张不剩,UTXO 集合里 B 消失(p.50)。

9. 图灵完备给以太坊带来什么好处和什么代价?gas 解决哪一个?

好处是表达力,能执行存储的程序、读写内存、有 EVM 这个状态机。代价是停机问题不可判定,没法提前知道一段合约会不会死循环。gas 的解法是每条指令收费,耗尽就回滚(p.41)。

10. 什么是原子可组合性?闪电贷为什么能无抵押?

多个协议的调用可以打包进一笔交易,要么全成功要么全回滚,也叫 money Lego。闪电贷借钱、套利、还钱都在同一笔交易内完成,还不上就整笔回滚,所以不需要抵押(p.68)。

11. 许可链相比公链的四点收益是什么?为什么不需要 PoW?

更好的性能与可扩展性、受控的信息共享、确定性行为(不分叉、线性链)、避免逐利行为(没有奖励和手续费)。公链节点匿名开放有女巫攻击风险,必须用 PoW/PoS 抬高作恶成本;许可链节点需审批加入、身份已知,传统 BFT 共识就够(p.80)。

下一讲

下一讲把这一讲埋的伏笔拆开:账户模型在以太坊里具体长什么样、gas 到底怎么算、出块者凭什么被选中。带着「这门课说以太坊是一台很慢很贵但谁都关不掉的计算机,那它贵在哪一步」这个问题去听。

下一讲 →
C01 C01 Crypto Foundation:一本给数据按指纹的册子

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