← 全部课程
COMP5567
Distributed Algorithms and Protocols for Blockchains
期末 70%(开卷)· Project 15% · Lab 15%。3 小时开卷,范围含 lectures + labs/tutorials + project。
逐讲
L01 第 1 周 · 9-02
L01 区块链导论:一本贴在公告栏上、谁都能抄的账
账本为什么要去中心化,区块怎么串成链,最长的那条为什么算数。
L02 第 2 周 · 9-09
L02 分布式系统:一个没有统一手表的跨时区群聊
没有全局时钟怎么排事件顺序,以及三种网络假设各能换来什么。
L03 第 2 周 · 9-09
L03 分布式广播:楼下那间可以扣住信件的传达室
收到和交付是两回事,顺序协议的全部本事都在这条缝里。
T01 习题课 第 3 周 · 9-16
T01 Tutorial 1:两张时钟图和四条性质,练习事件排序与可靠广播
逻辑时钟手算的三处失分点,加上可靠广播判定题的固定答法。
L04 第 3 周 · 9-16
L04 Bitcoin:全网一起刮彩票,中奖线每两周挪一次
交易打包成块,算力抽奖决定谁记账,累计工作量最大的有效链胜出。
期末复习怎么用
开卷的三小时里,翻书能查到的东西价值有限,值钱的是查得快和现场推得出来。复习的产物应该是几张能迅速定位的对照表,加上练到不用提示的几类计算题。
- 1 按讲把页尾「必背」过一遍,判据类的条目(判因果还是并发、容错上限)要背成反射。
- 2 每讲的「完整例题」跟着算一遍,然后合上页面做「变式题」,时钟题和难度换算题练到不看提示。
- 3 把各协议横着填进一张对照表带进考场,顺手扫「课件里的坑」,标了 [课件有误] 的照抄会答错。
要能动笔算的题型
这几类没有思考余量,练到不看提示就能做。
- Lamport 标号
- 给一张时空图,标出每个事件的逻辑时间戳
- 向量时钟比较
- 给两个向量,判断因果先后、并发还是同一事件
- 容错上限代入
- n 个节点、f 个故障,这个协议还能不能达成共识
- 难度换算
- 目标阈值要求前多少位为 0,阈值变化后难度变几倍
- 消息复杂度
- 某协议一轮正常操作发多少条消息,O(n) 还是 O(n²)
复习的产物:自己填的表
填表本身就是复习,抄一份现成的没有用。
- 协议对照表:故障模型、网络模型、容错上限、消息复杂度、故障时是否阻塞、最终性
- 时钟规则速查:内部事件、发送、接收各怎么更新,能不能判并发
- 模型与不可能性:同步/异步/部分同步的延迟假设,超时能不能判故障
累计考点表
各讲页尾「必背」的汇总,随讲次增长。复习时按讲回看,点讲次跳到那一页。
L01 · L01 区块链导论:一本贴在公告栏上、谁都能抄的账
- 区块链 = P2P 网络 + 不断增长的链式结构 + 生成这条链的算法,三者缺一不可;课件注明「实际上不一定是链」
- 区块头五要素的用途:Prev Hash 成链、Merkle Root 保证块内交易完整性、Target 与 Nonce 做 PoW,另有 Version 和 Time
- 区块头固定 80 字节 = 4 + 32 + 32 + 4 + 4 + 4;Magic no 与 Block size 各 4 字节,不算在区块头内
- 出块三步:收集有效交易算 Merkle Root → 改 nonce 反复做双 SHA-256 直到哈希小于 target → 广播全网
- PoW 是穷举碰运气,每次尝试概率固定且独立,算力直接等价于出块概率
- 不可篡改的机制是代价:改一块要重挖其后所有块,而诚实链还在前进
- Bitcoin 选择有效分支中累计工作量最大者;课件把同难度情形简写为最长链,收敛依赖网络与诚实算力假设
- 共识层(PoW – PoS – PBFT)是本课唯一战场;概率最终性与确定性最终性是贯穿全课的对比线索
L02 · L02 分布式系统:一个没有统一手表的跨时区群聊
- 六属性里的三个「没有」:无全局物理时钟、无全局共享内存、处理器自治且独立失败,分布式算法的困难全从这里来
- 所有去中心化系统都是分布式的,反之不成立;distributed 说位置的分布,decentralized 说控制权的分布
- 分布式算法的复杂度用消息条数衡量,不是指令条数
- 三种同步模型:同步有已知上界 Δ、异步无上界、部分同步在 GST 之后有界;可靠超时判定需消息、处理与心跳间隔的已知上界;GST 前超时可能误判
- FLP:纯异步系统中允许一个崩溃时,确定性共识不能在所有允许执行中同时保证安全与终止;不等于算法不存在或每次都失败
- Lamport 时钟收消息时取 Max(local, received) + 1;a → b ⟹ LC(a) < LC(b) 成立,反向不成立,因此判不出并发
- 向量时钟接收时先给自己那一位 +1 再逐位取 max;每位都 ≤ 且至少一位 < 为因果先后,有的位大有的位小为并发
- CAP:发生网络分区时,不能同时保证线性一致性 C 与所有非故障节点的可用性 A;CA 可在不发生分区的假设下讨论
L03 · L03 分布式广播:楼下那间可以扣住信件的传达室
- send / receive / deliver 是三件事,所有性质只约束 deliver;receive 由网络说了算,协议唯一的手段是收到后先扣住不交
- 三级可靠性:best-effort = Validity + No Duplication + No Creation;Reliable 再加 Agreement;Uniform 把 Agreement 前件的「正确进程」换成「任何进程」
- URB 协议一句话:先发给自己,收到后先转发再交付,用 MJ 集合去重;把转发和交付两步对调就退化成 RB
- 广播了不等于会被交付:URB 只承诺「有一个进程交付了,所有正确进程都交付」
- FIFO 只约束同一发送方的消息,且只对每个节点各自成立;合法交付顺序数 = (a+b+c+…)! / (a! b! c! …)
- m → m′ 三条规则:同一节点先后广播、交付后再广播、传递性;规则 2 正是 FIFO 做不到的那一条
- 交付条件 DC_i(m):∀k: delivered_i[k] ≥ m.past[k],用 ≥ 不用 =;delivered_i 是会增长的节点状态,m.past 是广播那一刻抄下的快照
- FIFO TOB 与共识等价,FLP 同样适用;TOB 不保证因果性,与因果序不可比,两者都要就是 CO-TOB
T01 · T01 Tutorial 1:两张时钟图和四条性质,练习事件排序与可靠广播
- TOB 四条标准性质:Validity、Agreement、Integrity(No Duplication + No Creation)、Total Order;FIFO Order 属于 FIFO Broadcast,不在其中
- Lamport 接收事件:C ← max(本地上一个事件, 消息戳) + 1,max 的另一边是本地上一个事件,不是本进程初值;本地事件与发送事件只做 +1
- 向量时钟接收事件先逐分量 max、再只给自己那一维 +1,两步都不能省;发送时先自增再把整个向量附在消息上
- 向量时钟判因果:逐维 ≤ 且至少一维严格 < 即 happens-before,互不包含即并发;不同事件的 Lamport 戳相等可判并发;戳较小却不能反推因果
- 判定题第一步永远是问「这个没交付的进程是正确进程还是故障进程」:正确进程不交付违反 Agreement,故障进程不交付不违反
- 正确进程永远收不到消息属于 perfect links 假设被打破,RB 协议本身没出错;「收到即转发」是为了广播者中途崩溃时其余正确进程仍能收到
- 本题固定执行中,三个正确进程都收到足够副本;不能把阈值 2 推广成任意故障模型下的 URB 充分条件,安全阈值还取决于故障上限和转发规则
- 重画题解法:先定崩溃集合 → 用 Validity 补出必须被交付的消息 → 用 Uniform Agreement 把正确进程的交付集合拉齐;崩溃进程广播的消息可以无人交付
L04 · L04 Bitcoin:全网一起刮彩票,中奖线每两周挪一次
- 减半:每 210,000 块(约 4 年)奖励减半,50 → 25 → 12.5 → 6.25 → 3.125;2100 万 = 210,000 × 50 × 2,约 2140 年到顶
- Tx[0] 是 coinbase:不花费已有 UTXO,输出总额至多为区块补贴 + 本块手续费;手续费 = 输入和 − 输出和;UTXO 只能整笔花,找零写成输出
- 区块头 6 字段共 80 字节:Version / Prev Hash / Merkle Root / Time / nBits / Nonce;Magic Num 与 Block Size 不进哈希
- 正目标 T 按 compact 指数与有效尾数解码,并检查符号位;p = (T+1)/2²⁵⁶,期望尝试次数 = 2²⁵⁶/(T+1)
- 600R = 2²⁵⁶/(T+1);T_new = T_old × 实测时长 / (2016 × 600),实测时长取两块 nTime 之差
- nTime 两条规则:大于前 11 块 nTime 的中位数;不超过网络调整时间 2 小时
- 分叉按累计工作量裁决;stale block 的普通交易仍有效且符合本地策略才可回 mempool,coinbase 作废;6 个确认 = 本块之后再接 5 块
- 51% 攻击能双花、能审查交易,不能偷别人的币、不能改规则