第 1 讲:双花问题——数字现金难在哪里
为什么数字现金比纸币难:可复制性、双花、以及「谁说了算」这个问题的本质。从一个朴素方案的失败出发,看清中本聪真正解决的不是密码学问题而是排序问题;以及区块链从原理上解决不了什么。
为什么数字现金比纸币难:可复制性、双花、以及「谁说了算」这个问题的本质。从一个朴素方案的失败出发,看清中本聪真正解决的不是密码学问题而是排序问题;以及区块链从原理上解决不了什么。
共识问题的精确定义、三种网络模型的区别、拜占庭将军问题为什么需要 n > 3f(含三将军反例的完整论证)、FLP 不可能性说了什么和没说什么,以及比特币是用什么代价绕过这些结论的。
可扩展性三难困境被广泛引用,但它没有形式化定义也没有证明。这一讲给三个维度各自下精确定义,算出真正的物理约束在哪,说明哪些「打破三角」的宣称是真突破、哪些只是偷换了定义,并给出四个可以直接用的检验问题。
抗原像、抗第二原像、抗碰撞三种性质的精确定义与蕴含关系;生日攻击为什么让 n 位输出只有 n/2 位安全性;长度扩展攻击与比特币双 SHA-256 的由来;以太坊用的 Keccak-256 为什么不等于 SHA3-256;以及哈希在区块链里的四种用途。
如何在不下载整个区块的前提下证明「我这笔交易在里面」:Merkle 树的构造、O(log n) 包含证明、完整的 Go 实现;以及两个真实的坑——比特币的 CVE-2012-2459 重复叶子攻击,和缺少域分隔导致的第二原像攻击。
从「只有我能花我的钱」这个需求出发,讲清楚离散对数难题、secp256k1 曲线上的点加法与标量乘法、私钥到公钥再到地址的完整派生链条,以及压缩公钥、Base58Check 校验和、EIP-55 大小写校验和背后的原因。含 Go 实现与两个真实的随机数事故。
ECDSA 的完整推导与验证原理;随机数 k 重用为什么会直接泄露私钥(含 Sony PS3 事故的代数推演)与 RFC 6979 的修复;签名可延展性如何造成交易 ID 可变,SegWit 与 EIP-2 各自怎么处理;以及 Schnorr 签名的线性性为什么能带来签名聚合。
权益证明需要的三样工具:BLS 签名如何把上万个签名聚合成一个(含双线性配对的直觉与推导)、阈值签名与多签的本质区别、承诺方案为什么必须加盐以及 Pedersen 承诺的同态性、可验证随机函数如何解决「链上随机数不能用区块哈希」的问题。
为什么要打包成块而不是逐笔上链;比特币 80 字节区块头的六个字段逐一解释,以及它为什么必须这么小;以太坊区块头的三个根分别承诺了什么;链上时间戳为什么只有小时级精度;以及「不可篡改」真正的来源不是密码学而是重做工作的成本。
把钱当成硬币而不是余额:UTXO 的定义、找零机制、手续费为什么是隐式的;比特币脚本作为一台栈式虚拟机的完整执行推演(P2PKH 逐步跟踪)、P2SH 的成本转移、多签的著名 off-by-one bug、时间锁与闪电网络的关系;以及 UTXO 模型的三个优点和它为什么写不了合约。