← 全部课程
COMP5521
Distributed Ledger Technology, Cryptocurrency and E-Payment
期末 70%(闭卷)· Project 15% · Lab 15%。3 小时闭卷,范围含 lectures + labs + project。
逐讲
L01 第 1 周 · 9-04
L01 电子支付导论:你的卡号要在多少人手里过一遍
从物物交换讲到加密货币,一条主线:付钱时你把信息交给了谁。
L02 第 2 周 · 9-11
L02 数论:一圈 n 格的表盘,和绕不回起点的那些步长
四块内容——GCD、模逆、欧拉定理、CRT,凑成 RSA 的四根支柱。
Lab1 习题课 第 2 周 · 9-11
Lab1 智能合约入门:14 行代码上链,然后把每一分钱对上账
从装钱包到在区块浏览器上核对手续费,一条完整的部署—调用流水线,外加课件里三处要改的说法。
L03 第 3 周 · 9-18
L03 密码学:一把谁都能扣上、只有你能打开的挂锁
对称加密、RSA、Diffie-Hellman、公钥体系的三种用法——四样零件各管一段,外加课件里两处该改的说法。
Lab2 习题课 第 3 周 · 9-18
Lab 2 Web3.js 与 Hardhat:把 Remix 那个按钮拆开
同一件事在命令行做两遍,学的是「源码 → 编译产物 → 交易 → 节点 → 链上状态」每一环归谁。
期末复习怎么用
期末 3 小时闭卷,范围写明含 lectures、labs 和 project,lab 里做过的东西也可能进卷子。前半段是数论与密码学,闭卷意味着推导要能凭空写出来。下面这几条按已经上完的讲次推,课程没有公布题型。
- 1 按讲把页尾「必背」过一遍,定理先记条件再记结论——这门课丢分多半丢在条件写漏。
- 2 每讲的「完整例题」跟着算一遍,然后合上页面做「变式题」,模运算类的题要算到不看提示也不卡。
- 3 最后扫「课件里的坑」:标了 [课件有误] 的按笔记里的更正记,标了 [口径差异] 的按课件写。
要能动笔算的题型
这几类没有思考余量,练到不看提示就能做。
- 模逆元
- 用扩展欧几里得求 a 在模 n 下的逆元,并验算
- 中国剩余定理
- 给一组同余方程,解出模乘积下的唯一解
- 快速幂化简
- 用费马小定理或欧拉定理把大指数降下来再算
- 签名与证书
- 给一条支付链路,写出每一步谁用谁的哪把密钥
- 支付协议角色
- 给一个支付场景,写出各段码的作用与生成方
复习的产物:自己填的表
填表本身就是复习,抄一份现成的没有用。
- 数论定理速查:定理、成立条件、能用在什么地方
- 公钥用途对照:加密与签名各用谁的哪把密钥、验证方是谁
- 支付方式对照:匿名性、可追踪性、是否需要在线第三方
累计考点表
各讲页尾「必背」的汇总,随讲次增长。复习时按讲回看,点讲次跳到那一页。
L01 · L01 电子支付导论:你的卡号要在多少人手里过一遍
- 传统支付四级阶梯:物物交换(瓶颈是 double coincidence of wants)→ 商品货币 → 商品本位 → 法币;法币靠「对发行方的信任」取代存款背书
- 三条链路分离:商流在买卖双方之间、物流走承运方、资金流走两家银行清算,买方从不直接把钱交给卖方
- SET 五方:Cardholder / Issuer(发卡行)/ Merchant / Acquirer(收单行)/ CA;八步分三段:1–4 认证与完整性,5–7 支付授权,8 支付捕获
- SET 的核心是双重签名:双重签名关联 OI 与 PI 的摘要,使两边验证同一交易;保密性由各自的加密封装负责;PAN 用支付网关的公钥加密
- 3-D 即 three domains:Issuer(持卡人 + 发卡行 + ACS)/ Acquirer(商户 + 收单行)/ Interoperability(目录与认证历史等基础设施);报文顺序 CR → VE → PA → PATrans → Capture
- Tokenization 双层:token 长期、绑设备,真实卡号永不给商户;cryptogram 一次性、绑交易,由 SE 硬件生成
- 支付宝三模式的区分维度是「谁扫谁 + 金额谁定」:User-Presented 商户扫用户、Order Code 用户扫动态码金额已含、Entry Code 用户扫固定码自己输金额
- 电子支付四条弱点:网络安全风险、交易不匿名、中心化的卡组织/银行系统、商业成本高;课件给的两条解法(加强监管、去中心化加密货币)方向相反
L02 · L02 数论:一圈 n 格的表盘,和绕不回起点的那些步长
- 除法算法 a = qn + r,0 ≤ r < n,q = ⌊a/n⌋ 是全讲地基;负数取模要折回 [0, n):−11 mod 7 = 3 而不是 −4
- gcd(a, 0) = |a| 是欧几里得递归的出口;算法的答案是最后一个非零余数;互素 ≠ 两个都是素数(8 与 15 都是合数但互素)
- 模运算三性质里只有加、减、乘能先取模,没有除法;模意义下的除法必须改写成乘以模逆
- 模逆存在 ⟺ gcd(a, b) = 1;Z₈ 里只有 1、3、5、7 可逆,且各自是自己的逆元
- Bézout 恒等式 ax + by = gcd(a, b);扩展欧几里得手算三步:正向跑除法 → 逐行回代 → 负系数折回正数
- φ(p) = p − 1,φ(p^k) = p^k − p^(k−1),φ(pq) = (p−1)(q−1)(p ≠ q 为素数);可乘性 φ(mn) = φ(m)φ(n) 要求 m、n 互素
- 费马小定理 a^(p−1) ≡ 1 (mod p)(p ∤ a)是欧拉定理 a^φ(n) ≡ 1 (mod n)(gcd(a, n) = 1)的特例;形式二 a^(φ(n)+1) ≡ a (mod n) 就是 RSA 解密正确性
- CRT 两个前提缺一不可:模数两两互素、解限定在 0 ≤ x < N;答案要写成 x ≡ x₀ (mod N) 而不是单个数
Lab1 · Lab1 智能合约入门:14 行代码上链,然后把每一分钱对上账
- 合约账户没有私钥,不能主动发起交易;任何一条链上交易的最初触发者一定是某个 EOA
- caret 版本号 ^0.8.0 的含义是大于等于 0.8.0 且小于 0.9.0;主版本号为 0 时 caret 把次版本号当作主版本号对待
- 自 Solidity 0.6.0 起 receive 与 fallback 是两个不同的函数:前者接 calldata 为空的纯转账,后者接匹配不上任何函数签名的调用
- 合约若既没有 receive 也没有 payable 的 fallback,别人直接往它地址转账会 revert,gas 白花
- 一笔交易能携带两样东西:value 是钱,data 是意图;只带 value 就是转账,带了 data 才是函数调用,两者可以同时带
- 手续费 = (base fee + priority fee) × gas used,其中 base fee 被协议销毁、priority fee 归出块者
- 创建合约的交易其 to 字段是空的;合约地址由发送方地址和 nonce 算出,交易上链之前就能确定
- 合约往外转的钱不出现在主交易列表的 Value 列,它属于 internal transaction,要单独看那个标签页
L03 · L03 密码学:一把谁都能扣上、只有你能打开的挂锁
- 对称加密安全的两个前提:算法够强、密钥事先在收发双方之间安全共享;第二条是它自己解不掉的死结,密钥要走 Secure Channel
- 凯撒密码密钥只有 25 种,暴力枚举可行的三条件是算法已知、密钥空间小、明文可识别;一次一密使用独立均匀随机、等长且不重用的密钥,可实现完美保密
- 在 XOR、AND、OR 三种逐位运算中选 XOR,已知密钥可逆;AND、OR 不能保证可逆;11011011 ⊕ 01101001 = 10110010
- RSA 密钥生成六步:选 p、q → n = pq → φ(n) = (p−1)(q−1) → 选 e 与 φ 互素 → d = e⁻¹ mod φ → 发布 {e, n};私钥是 {d, n},n 从来不是秘密
- 教材 RSA 用 C = Mᵉ mod n、M = Cᵈ mod n;互素时可用欧拉定理证明,一般情形用 CRT;手算用平方-乘法并逐步取模
- DH 做密钥协商:交换 gᵃ 与 gᵇ,得到共享秘密 g^(ab) mod p;解离散对数是一条攻击路径,裸 DH 不认证对方身份
- 加密用收件人公钥、解密用其私钥;签名用发件人私钥、验签用其公钥;签名不等于私钥加密,组合可先签后加密
- 公钥加密要求三易两难;分解 n → 算 φ → 算 d 是 RSA 的攻击路径,不是唯一风险;课件列出的 RSA-250 为 2020 年 829 bit 历史纪录
Lab2 · Lab 2 Web3.js 与 Hardhat:把 Remix 那个按钮拆开
- 本 Lab 使用 solc 的两类输出:bytecode 随创建交易上链交给 EVM 执行,ABI 不上链、留在本地供调用方编码参数和解码返回值
- Web3.js 只跟一个 RPC 节点说话,由节点替你广播到 P2P 网络;三种连法是 HTTP、IPC、WebSocket,实现的是通用 JSON-RPC 规范
- 本 Lab 用合约地址、ABI、方法参数构造调用;签名交易还需 nonce、gas、chain ID 等字段,部分由工具补齐
- 本 Lab 查询通过 eth_call 模拟执行,不产生链上交易费;view 只约束不修改状态,被链上交易调用仍消耗 gas
- 顶层执行失败回滚合约执行状态,但 nonce 与已用 gas 费用不回滚;REVERT 保留未用 gas,执行耗尽 gas 则消耗所供 gas
- 配置命令的两个参数是 Infura API key 和私钥,前者 32 位、后者 64 位十六进制且不带 0x 前缀;私钥的用途是给交易签名
- Incrementer 的 counter 初值 4142,increment 1222 之后是 5364;一次 increment 加一次 reset 在浏览器上是两笔交易,中间的查询不留痕迹
- CompCoin 只有 8 行是因为继承了 OpenZeppelin 的 ERC721Enumerable;构造函数里的 _safeMint(msg.sender, 4142) 给部署者铸一枚 token ID 为 4142 的 NFT