开卷可带一张 A4。课件:杨小虎《区块链与数字货币》2025;教材参考毛德操、杨小虎《区块链教程》(浙大出版社,2021)、毛德操《区块链技术》(2019)。另对照中本聪白皮书《Bitcoin: A Peer-to-Peer Electronic Cash System》(2008)及中译本。
脉络
全课一条主线:货币要可信 → 密码学给工具 → 链式账本防篡改 → 共识解决「谁记账」→ 比特币落地 → 以太坊/合约可编程 → Fabric 许可链 → 趋势。
1 | 货币 / 信用 / SWIFT / 加密货币 / 稳定币 / CBDC |
| 课件 / 文献 | 内容重心 | 笔记章节 |
|---|---|---|
| 课程1 | 货币与密码学 + 区块链原理 + 比特币 | # 一、基础 # 二、原理 |
| 课程2 | 比特币之后:竞争币、公链、企业链、生态 | # 三、生态 |
| 课程3 | 以太坊:账户 / EVM / Gas / PoS / Oracle | # 四、以太坊 |
| 课程4 | Hyperledger Fabric:MSP / 通道 / 背书 / 三阶段 | # 五、Fabric |
| 中本聪白皮书 | 双花、时间戳、PoW、激励、SPV、概率抗攻击 | # 六、白皮书 |
考核:作业 40%(原理 10% + 以太坊开发 20% + Fabric 10%)+ 期末开卷 60%。
▸数字货币两个老问题怎么解
① 假币 → 非对称加密 + 数字签名,他人无法伪造「持有者授权转出」。② 双重支付(Double Spending) → 不能靠一家银行记账,而靠全网分布式账本 + 共识,同一笔 UTXO 只能被花一次。
术语
| 缩写 / 词 | English | 一句话 |
|---|---|---|
| Hash | Cryptographic Hash Function | 任意长输入 → 固定长「指纹」;难反推、抗碰撞 |
| SHA-256 | Secure Hash Algorithm 256-bit | 比特币主用哈希,输出 256 bit |
| PoW | Proof of Work | 工作量证明:拼算力找满足难度的 Nonce |
| PoS | Proof of Stake | 权益证明(本课后文) |
| UTXO | Unspent Transaction Output | 未花费交易输出:比特币里的「钞票」 |
| Merkle Tree | 默克尔树 | 哈希二叉树,根概括整批交易 |
| SPV | Simplified Payment Verification | 轻节点只存块头,用 Merkle 路径验交易 |
| Nonce | Number used once | 挖矿里不断试凑的计数器 |
| Coinbase | 创币交易 | 每块第一笔,挖出新币 + 手续费给矿工 |
| BFT / PBFT | (Practical) Byzantine Fault Tolerance | (实用)拜占庭容错 |
| CBDC | Central Bank Digital Currency | 央行数字货币 |
| Stablecoin | 稳定币 | 锚定法币等资产以稳住价格 |
| DeFi | Decentralized Finance | 去中心化金融 |
| P2PKH | Pay to Public Key Hash | 付给公钥哈希(常见地址支付) |
| SegWit | Segregated Witness | 隔离见证(亦写 SegWitness);扩容与修交易延展性 |
| EVM | Ethereum Virtual Machine | 以太坊虚拟机:全网共享状态机 |
| EOA | Externally Owned Account | 外部账户,公私钥控制 |
| MPT | Merkle Patricia Trie | 默克尔帕特里夏树,账户状态树 |
| Gas | — | 计量计算/存储的费用单位 |
| Gasper | Casper-FFG + LMD-GHOST | 以太坊 PoS 最终性 + 分叉选择 |
| MSP | Membership Service Provider | Fabric 成员身份服务 |
| Fabric CA | Fabric Certificate Authority | 签发 / 撤销 X.509 证书的 CA 服务 |
| Chaincode | — | Fabric 链码(合约部署单元) |
| RW-set | Read-Write Set | 背书阶段产生的读写集 |
| ABI | Application Binary Interface | 合约调用「说明书」 |
| Anchor Peer | 锚节点 | Fabric 跨组织通信入口 Peer |
| Raft | — | CFT 共识:Leader 复制日志,过半提交;Fabric 排序默认 |
一、基础
教学大纲六块:数字货币与区块链原理;比特币技术分析;以太坊原理与架构;智能合约与 DApp;HyperLedger Fabric;发展趋势。
参考:比特币 / 以太坊 / HyperLedger 网上资料;毛德操、杨小虎教材。
货币
价值
货币有两类价值:
| 类型 | 含义 |
|---|---|
| 使用价值(Use Value) | 物本身能干什么 |
| 交换价值(Exchange Value) | 能换多少别的东西 |
形式演进:贵金属(金、银、铜)→ 纸币(交子,宋代,世界最早纸币之一)→ 数字货币。
信用
纸币本质是信用:
| 阶段 | 要点 |
|---|---|
| 金本位(Gold Standard) | 纸币承诺可兑黄金 |
| 国家信用 | 法币靠主权背书 |
| 布雷顿森林(Bretton Woods,1944–1971) | 美元锚定黄金(每美元含金量 0.888671 g);他国货币盯住美元;汇率可在法定汇率 ±1% 波动;1971 结束 |
课件另列「纸币的全球化」:美元、欧元、英镑、日元等。SDR 见下。
SDR
(Special Drawing Rights,特别提款权)
IMF(International Monetary Fund,国际货币基金组织)创设的国际储备资产与记账单位,按成员国基金份额分配。可划转换可兑换货币、偿贷;不能兑黄金、不能直接付贸易,只是账户账面资产。初值等价 0.888671 g 纯金(当时约 1 美元);布雷顿森林解体后改为一篮子货币;执董会约每五年审查篮子;美元价值按伦敦中午附近即期汇率每日公布。
学派
| 学派 | 要点 |
|---|---|
| 马克思政治经济学 | 商品使用价值 vs 交换价值 |
| 凯恩斯 | 「看不见的手」会失灵,需政府干预 |
| 哈耶克 | 自由市场与竞争;货币非国有化 |
| MMT(Modern Monetary Theory,现代货币理论) | 货币本质是欠条 IOU(I Owe You) |
货币之花
BIS(国际清算银行)式分类,四属性交叠:
| 属性 | English |
|---|---|
| 可广泛获取 | Widely accessible |
| 数字形式 | Digital form |
| 中央银行发行 | Central bank issued |
| 基于代币 | Token-based |
交叉落点(课件图):银行存款、CB 储备/结算账户、现金、CB 结算账户(通用)、CB 数字代币(批发/通用)、私人数字代币(批发/通用)。阴影区标 CBDC(Central Bank Digital Currency,央行数字货币)。
▸货币之花怎么读
四瓣属性交叉,用来回答「这是不是央行数字货币」:要同时满足(或落在)央行发行 + 数字形式,再看是批发(仅机构)还是通用(公众)。现金是央行发行但非数字;银行存款是数字但非央行直接负债;比特币是数字代币但非央行。数字人民币(e-CNY) 落在 CBDC 一侧(课件阴影区)。
SWIFT
(Society for Worldwide Interbank Financial Telecommunications,环球银行间金融电讯协会)
总部布鲁塞尔;金融机构跨境报文网络,不是清算本身,而是「电报局」。2022-02 美欧等将部分俄银行排除出 SWIFT。金砖探索 BRICS Pay 类替代(概念验证阶段)。
▸SWIFT ≠ 转账系统本身
SWIFT 传的是「谁付给谁多少」的指令;真正扣账在各国银行账户体系里。制裁切断 SWIFT,等于切断跨境指令通道。
加密货币
(Cryptocurrency)
基于区块链的去中心化数字资产;密码学保证交易与发行;不依赖央行。价格由供需决定,波动大;跨境、成本低,但监管与投机风险高。例:比特币(Bitcoin)、以太币(Ether)、狗狗币(Dogecoin)等。课件趋势句:加密货币正逐步影响传统金融体系。
稳定币
(Stablecoin)
链上资产,用锚定机制相对法币稳住价格。早期作交易媒介直接兑换加密货币,后在 DeFi(Decentralized Finance)中作借贷/质押基础资产。因实时结算、成本低、7×24 无国界流转,亦用于跨境支付与贸易结算。例:USDT、USDC。
Hash
(Cryptographic Hash,密码学哈希)
任意长度输入 → 固定长度输出(哈希值)。
| 性质 | 含义 |
|---|---|
| 压缩 | 输入空间通常 ≫ 输出空间 |
| 碰撞 | 不同输入可能同输出(Collision) |
| 单向性 | 从输出难推输入 |
最简例子:整数取模 (x \bmod y = z)((y) 质数)可作哈希表长度。思想用途:快速定位(散列表)、错误校验、唯一性验证。常见:MD4、MD5、SHA-1、SHA-2。
▸Hash 在区块链里干什么
把任意长内容压成固定「指纹」。改交易哪怕 1 bit,指纹就全变 → 块头 Merkle 根变 → 本块哈希变 → 后面所有块的「父哈希」对不上。所以链式哈希 = 篡改警报器;挖矿则是「找一个指纹足够小的 Nonce」。
安全性:
- 逆向困难:MD、SHA 族设计为不可逆。
- 抗碰撞:难找 (M_1\neq M_2) 使 (H(M_1)=H(M_2))。MD4/MD5 已被王小云团队攻破(给定 (M_1) 可构造碰撞 (M_2))。
SHA-256
(Secure Hash Algorithm 2 族中的一种;NSA 研发)
任意输入 → 256 bit 摘要,常写成 64 位十六进制。课件例:A7FCFC6B5269BDCCE571798D618EA219A68B96CB87A0E21080C2E758D23E4CE9。输出空间 (2^{256}),目前无实用破解。比特币挖矿、区块头哈希、Merkle 节点等多用 双重 SHA-256。
▸作业1(课件)
自实现 SHA-256。输入 "Blockchain@ZhejiangUniversity+nonce",nonce 从 0 递增,记录哈希前 30 / 31 / 32 个二进制位为 0 时的 nonce 与耗时。本质是迷你 PoW:找前导零。
处理流程(考试记步骤即可):明文按 512 bit 分块;每块进入 64 轮压缩,内部状态 8 个 32-bit 字;全部块吃完后输出 256 bit。比特币再套一次(双 SHA-256),避免长度扩展一类攻击路径,并与挖矿、Merkle 统一。改输入任意 1 bit,64 轮会把差异打散到整个摘要,故「指纹」看起来完全不同。
加密
凯撒
字母表平移。例:明文 THE QUICK... → 密文 WKH TXLFN...(右移 3)。
一般记号:明文 (M),密文 (C),密钥 (k):
[
E_k(M)=C,\quad D_k(C)=M,\quad D_k(E_k(M))=M
]
| 类型 | 条件 |
|---|---|
| 对称(Symmetric) | 加解密同一密钥 (k_1=k_2) |
| 非对称(Asymmetric / Public-key) | (k_1\neq k_2)(公钥加密 / 私钥解密,或私钥签名 / 公钥验签) |
非对称思想:Ellis(1970)设想;Diffie–Hellman(1976)有限域指数可实现密钥交换。难题族:
| 难题 | 代表 |
|---|---|
| 大整数分解 | RSA |
| 离散对数 | 椭圆曲线(ECC)、Diffie–Hellman |
数字签名(Digital Signature):私钥对消息摘要签名,公钥验证——解决「假币 / 伪造授权」。
转账时签的不是整本账,而是这笔交易的哈希:① 算 (H(\text{交易}));② 用私钥生成签名 (\sigma);③ 广播「交易 + (\sigma) + 公钥」。验证方用公钥重算摘要,能对上才承认「持钥人授权」。公钥可公开,私钥不能给任何人;丢私钥 ≈ 丢币,泄露私钥 ≈ 币可被转走。
▸签名防伪造,防不了「原样重放」
付款方要把 1 BTC 给收款方:本地用私钥对「输入哪些 UTXO、输出给谁」的哈希签名后广播。拦截者改不了收款地址——一改哈希对不上,验签失败。拦截者可以把同一份已签名交易再广播一次,但对应 UTXO 已被花掉,节点会拒。以太坊没有 UTXO,改用账户 nonce 防同一笔被执行两遍(见后文)。
▸对称 vs 非对称在链上各管什么
链上身份几乎全是非对称:地址来自公钥,授权靠私钥签名。对称加密(同一把 (k))适合两人事先共享密钥的信道,不适合「全世界都要能验证、却不能伪造」的公开账本。
二、原理
起源
中本聪(Satoshi Nakamoto),2008 白皮书《比特币:一种点对点的电子现金系统》(Bitcoin: A Peer-to-Peer Electronic Cash System)。2009 上线;总量上限约 2100 万;课件称已生成约 1800 万、单价超十万美元、总市值超 2 万亿美元(随行情变)。特点:上线以来无整体停服;交易可追溯。课件称为迄今最成功的区块链应用。
两问题
| 问题 | 解法 |
|---|---|
| 虚假货币 | 数字签名(非对称) |
| 多重支付 / 双花 | 分布式账本 + 共识 |
▸对照理解:两问题各管什么
- 假币:别人能不能伪造「张三同意把币转出去」?→ 私钥签名,无私钥签不出合法交易。
- 双花:张三能不能把同一枚币同时付给李四和王五?→ 全网共享一本账,同一 UTXO 只能被一笔有效交易引用一次;冲突时靠共识选一条历史。
账本
流程:
- 交易向全网广播。
- 记账节点对记账权达成共识,胜出者发布区块。
- 完整账本存于(理想上)每个全节点。
- 各节点独立验证合法性与完整性。
两大核心:
- 链式区块组织数据 → 篡改代价极高。
- 分布式可信记账(共识)。
▸链为什么难改
每个块头含父块哈希。改历史某一块,其后所有块的「父哈希」全对不上,等于要重挖整条后缀,算力不够就追不上主链。
宏观:块与块用哈希链接;链越长、其上累计工作量越大,可信度越高。
区块
每个区块 = 区块头(Header)+ 交易列表(Body)。
整体字段
(课件「区块的微观结构」)
| 大小 | 字段 | 描述 |
|---|---|---|
| 4 B | 区块大小 | 用字节表示的该字段之后的区块大小 |
| 80 B | 区块头 | 组成区块头的若干字段(见下表) |
| 1–9 B(VarInt) | 交易计数器 | 本块交易数量 |
| 可变 | 交易 | 记录在区块里的交易信息 |
区块头(80 B)
| 大小 | 字段 | 描述 |
|---|---|---|
| 4 B | 版本(nVersion) | 版本号,用于跟踪软件/协议更新 |
| 32 B | 父区块哈希(hashPrevBlock) | 引用链中父区块(块头)的哈希 |
| 32 B | Merkle 根(hashMerkleRoot) | 本块交易 Merkle 树根的哈希 |
| 4 B | 时间戳(nTime) | 本块产生的近似时间(精确到秒的 Unix 时间戳) |
| 4 B | 难度目标(nBits) | 本块 PoW 的难度目标 |
| 4 B | Nonce(nNonce) | PoW 用的计数器 / 试凑值 |
课件伪代码字段与上表一致。挖矿:对区块头做哈希,使结果满足 nBits 前导零(难度)要求;不成则 Nonce++。
▸挖矿在改什么
交易列表大致定好后,矿工主要在改块头里的 Nonce(有时也调 coinbase / 时间戳),反复算 SHA256(SHA256(header)),直到哈希「够小」(满足 nBits)。验证方只需算一次哈希并比对难度,所以「难挖、易验」。
标识
(课件「区块标识符:区块头哈希值和区块高度」)
两种标识:
- 区块头哈希值(主标识):对区块头做双重 SHA-256 得到的密码学哈希,即该块的「数字指纹」。创世块例:
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f。该哈希并不包含在区块的内部数据结构中(不是块头六字段之一)。 - 区块高度(Block Height):区块在链上的位置序号。高度 0 = 创世块。与哈希不同,高度不是唯一标识:分叉时可能同时存在两个或多个不同块具有相同高度。
| 标识 | 含义 | 唯一? |
|---|---|---|
| 区块头哈希 | SHA256(SHA256(header)),数字指纹;不写入块内 |
是 |
| 区块高度 | 从创世块起的序号;高度 0 = 创世块 | 否(分叉可同高) |
解剖
80 字节块头按偏移铺开(合计 (4+32+32+4+4+4=80)):
| 偏移 | 大小 | 字段 | 代码名 |
|---|---|---|---|
| 0–3 | 4 B | 版本 | nVersion |
| 4–35 | 32 B | 父区块哈希 | hashPrevBlock |
| 36–67 | 32 B | Merkle 根 | hashMerkleRoot |
| 68–71 | 4 B | 时间戳 | nTime |
| 72–75 | 4 B | 难度目标 | nBits |
| 76–79 | 4 B | Nonce | nNonce |
块头哈希 = SHA256(SHA256(这 80 字节)),不写入块内;链上「指向上一块」的是这枚指纹。
课件对应 Bitcoin Core 风格结构(CBlock 继承块头,再挂交易列表):
1 | class CBlockHeader { |
▸哪些字段上链
会发送、会落盘:块头六字段 + vtx(交易序列)。只在内存:CBlock::fChecked(是否已校验)、CTransaction::hash(TxID,用时再算)。nBits 课件按「前导零位数」讲;协议里它是难度目标的紧凑编码,挖矿时反复改 nNonce(有时也调时间戳 / coinbase)直到块头双 SHA-256 够小。
Merkle
(Merkle Tree,默克尔树;Ralph Merkle)
哈希二叉树:叶 = 数据块哈希;父 = 子节点拼接后再哈希。比特币:归纳块内全部交易,得根指纹;并支持 Merkle 路径证明「某交易在块内」,课件亦称对交易列表快速寻址。节点哈希常用双 SHA-256:(H_A=\mathrm{SHA256}(\mathrm{SHA256}(\text{交易}A)))(课件:两次哈希提高安全强度)。(N) 笔交易验证约 (O(\log_2 N)) 次哈希。
(Ralph Merkle:公钥密码先驱之一,另有「默克尔谜题」密钥交换;树结构以其命名。)
构造
「叶」不是交易原文,而是该交易的哈希(比特币里即 TxID:对交易做双 SHA-256)。相邻两片叶子的哈希按左右顺序拼接成更长的一串字节,再对该串做双 SHA-256,得到上一层的父节点。如此两两往上,直到只剩一个哈希:这就是 Merkle 根,写入区块头的 hashMerkleRoot。
改任意一笔交易 → 其叶哈希变 → 沿途所有祖先哈希都变 → 根对不上。因此根是整批交易的「总指纹」;块头只有 80 字节,却能概括块内全部交易。
交易数为奇数时,比特币把最后一片叶子复制一份再配对(凑成偶数),规则固定,验证方可独立复算。
例子
四笔交易 (Tx_A, Tx_B, Tx_C, Tx_D) 建树((H(\cdot)) 表示双 SHA-256,(\Vert) 表示字节拼接):
1 | Merkle 根 H_ABCD |
自底向上:
- 叶:(H_A=H(Tx_A)),同理得 (H_B,H_C,H_D)。
- 中间:(H_{AB}=H(H_A\Vert H_B)),(H_{CD}=H(H_C\Vert H_D))。
- 根:(H_{ABCD}=H(H_{AB}\Vert H_{CD})),写入块头。
要证明「(Tx_B) 在本块」(不必下载 (Tx_A,Tx_C,Tx_D) 原文)。验证方已有块头里的根,另需一条 Merkle 路径:沿 (H_B) 上到根时,每一层缺的那个兄弟哈希。对本例即 ({H_A,\ H_{CD}}),并标明左右位置。
验证步骤:
- 本地算 (H_B=H(Tx_B))。
- (H_A) 在左、(H_B) 在右 → (H_{AB}’=H(H_A\Vert H_B))。
- (H_{AB}’) 在左、(H_{CD}) 在右 → (H_{ABCD}’=H(H_{AB}’\Vert H_{CD}))。
- (H_{ABCD}’) 与块头 Merkle 根相同 ⇒ (Tx_B) 确在本块;不同则交易被改过,或根本不在该块。
四笔交易只需 2 个兄弟哈希((\log_2 4=2));(N) 笔大约 (\log_2 N) 个,不必下载另外 (N-1) 笔原文。这就是轻节点(SPV)能「只存块头 + 一条路径」的原因。
▸改 \(Tx_C\) 会发生什么
(H_C) 变 → (H_{CD}) 变 → 根 (H_{ABCD}) 变,块头对不上。若有人只改 (Tx_C)、却把旧根留在块头,全节点一验即失败。验证 (Tx_B) 时路径里的 (H_{CD}) 也会对不上新根,伪造「(Tx_B) 在被改过的块里」同样过不了。
价值:
| 用途 | 说明 |
|---|---|
| 快比较 | 两树根相同 ⇒ 数据集合相同 |
| 快定位 | 根不同则向下二分找被改叶 |
| 快验证 | 给叶到根路径即可证明存在性 |
SPV 路径长度例(课件):
| 交易数 | 块约大小 | 路径哈希数 | 路径字节 |
|---|---|---|---|
| 16 | 4 KB | 4 | 128 B |
| 512 | 128 KB | 9 | 288 B |
| 2048 | 512 KB | 11 | 352 B |
| 65535 | 16 MB | 16 | 512 B |
只需下块头(80 B/块)+ 一条路径,不必存整链交易。
▸Merkle 像班级点名册的「总指纹」
50 笔交易两两哈希往上叠,最后只留一个根写进块头。要证明「第 17 笔在本块」:只需带齐从该叶到根的兄弟哈希(约 (\log_2 50) 个),重算能对上根即可;不必下载另外 49 笔原文。这就是 SPV 轻钱包能「瘦身」的原因。
节点
| 类型 | 职责 |
|---|---|
| 全节点(Full Client) | 存整链;验证并执行交易;可挖矿;应其他节点请求发送区块/交易;转发交易与区块 |
| └ 矿工 / 非矿工 | 是否参与 PoW |
| 轻节点(Light Client) | |
| └ SPV | 只存块头;用 Merkle 路径验交易 |
| └ 钱包(Wallet) | App:地址、私钥、余额/UTXO 视图;一般不存全账本 |
全节点自己重放整条链,不信别人的「余额数字」。轻节点不存交易原文,只问全节点「这笔在不在某块」,再用 Merkle 路径和块头核对;因此必须信任「多数算力连着的那条头链」,金额大时应多等确认或改用全节点。
SPV
- 对目标地址建布隆过滤器(Bloom Filter),少收无关交易。
- 全节点匹配后发 MerkleBlock:块头 + 到目标交易的 Merkle 路径。
- 存在性:沿路径重算至根,与块头 Merkle 根比对。
- 防双花置信:看该块之后又接了多少块;惯例约 6 个确认 较可信(概率意义,非绝对)。
▸6 个确认
不是协议硬编码的「魔法数字」,而是攻链成本随确认数指数上升的工程惯例。金额越大,等的确认往往越多。
钱包
职责:生成私钥/公钥/地址并公布地址;对交易签名;经 P2P 广播已签名交易。
链上没有「账户余额」字段可改;钱包本地扫描属于自己地址的 UTXO,加总后显示「余额」。付款 = 选若干 UTXO 作输入 + 构造输出 + 私钥签名。地址由公钥哈希编码而来,可公开;私钥只留在钱包内。
共识
目的:在开放、动态、海量节点下解决谁有权出块。比特币方案:PoW(Proof of Work,工作量证明)——高强度 SHA-256 算力竞争。
拜占庭
(Byzantine Generals Problem,1982,Lamport & Shostak)
将军(节点)需统一进攻计划;可能有叛徒(恶意节点);信使可靠但可被截获(信道可断)。目标:一致性(忠诚将军同计划)+ 正确性(少数叛徒不能迫使忠诚方做错计划)。
| 维度 | 分类 |
|---|---|
| 时序 | 同步(执行有上限)/ 异步(无上限) |
| 故障 | 崩溃 / 拜占庭(可任意恶意) |
| 容错 | CFT(Crash Fault Tolerance)/ BFT(Byzantine Fault Tolerance) |
发展线:Lamport Paxos(1989 提出;1998《The Part-Time Parliament》证明;2001《Paxos Made Simple》)→ PBFT(1999,Castro & Liskov)→ Raft(2014,Ongaro & Ousterhout,《In Search of an Understandable Consensus Algorithm》)。PBFT/Raft 常用于联盟链,有 Leader(或 Prime);节点集相对稳定、规模有限,不是彻底去中心化公链上的主方案。公链海量动态恶意场景下,比特币用 PoW + 最长(最重)链。
| PoW(比特币) | PBFT | Raft(Fabric 排序) | |
|---|---|---|---|
| 节点集 | 谁都能进 | 事先已知的一小撮 | 事先已知的 Orderer |
| 怕什么 | 算力不够诚实多数 | 任意作恶(拜占庭) | 宕机、断网(崩溃),不怕故意作恶 |
| 容错规模 | 诚实算力 (>50%) | (n=3f+1),扛 (f) 个叛徒 | (n=2f+1),扛 (f) 个崩溃 |
| 出块权 | 先算出合格哈希者 | 主节点打包,2/3 投票提交 | Leader 写日志,过半复制后提交 |
| 最终性 | 概率(等确认) | 提交后即确定 | 提交后即确定 |
| 能耗 | 高 | 低 | 低 |
拜占庭叛徒可以投反对票、发假消息、对 A 说进攻对 B 说撤退。崩溃节点只是沉默或重启,不会精心伪造。PBFT 为防叛徒,票数门槛更高(约 2/3);Raft 假定 Orderer 属于可追责的许可组织,只防挂机。
▸叛徒两面说 vs 只是宕机
四名将军约定「多数赞成则进攻」。叛徒对甲说「进攻」、对乙说「撤退」:忠诚方看到的票不一致,可能一部分攻、一部分撤。若换成一台机器只是断电(崩溃),其余三台收不到它的票,但不会收到互相矛盾的假命令。所以 Raft 的过半复制防得了挂机,防不了「对 A、B 各说各话」;那种情况要 BFT / PBFT。
▸三台机器分别会怎样
3 台。PoW:谁算得快谁出块,另外两台验证后跟随。Raft:1 个 Leader + 2 个 Follower,Leader 挂了剩下 2 台还能选新主(过半)。PBFT:最多扛 1 个叛徒((3f+1=4) 才是经典最小配置;3 台不够扛 1 个拜占庭),因此联盟链若担心排序节点作恶,不能只靠 3 台 Raft。
▸为何公链少用经典 PBFT
PBFT 要已知、相对固定的一小撮节点,消息复杂度高(大约 (O(n^2)) 量级直觉),适合联盟链。比特币面对「谁都能进、不知道谁是叛徒」:用算力投票代替身份投票,诚实算力过半则最长链胜出——代价是耗电与概率最终性(等确认)。
PoW
模型:约 10 分钟出块;矿工组装候选块;算力竞争;他人验证后接受;短期竞争经最长链延伸为长期共识。
挖矿直觉(课件字符串例):对 "I am Satoshi Nakamoto" + nonce 求哈希,直到出现足够多前导零——与作业1同构。
难度调整(每 2016 块,约两周):
[
\mathrm{NewDifficulty}=\mathrm{OldDifficulty}\times\frac{\text{最近 2016 块实际耗时}}{20160,\mathrm{min}}
]
期望:2016 × 10 min = 20160 min。出块偏快则加难,偏慢则降难。各全节点独立自动调整。
▸CheckProofOfWork
输入:本块头哈希(256 bit)+ nBits 难度。不满足则 Nonce+1 再试。成功则广播新区快。
试凑
挖矿改的是块头里的 nNonce,难度由 nBits 给定。完整六字段见上文「解剖」;课件在此标红的两个字段:
1 | class CBlockHeader { |
内层循环:不断改 Nonce → 对改过的块头做哈希(实现里 GetHash() 为双 SHA-256)→ CheckProofOfWork 与目标比较;hash 小于目标则 PoW 成功。
1 | // 课件挖矿内层循环: |
CheckProofOfWork 两个输入:① 本区块头算出的 256 位 hash;② 难度值 nBits。本次 SHA-256 不满足则 nNonce 加 1,继续尝试。
校验
1 | bool CheckProofOfWork(uint256 hash, unsigned int nBits, |
▸hash 与目标谁大谁小
目标越小(前导零越多),越难挖。hash > bnTarget 表示指纹还不够「小」,继续 Nonce++。验证方只跑一次该函数,所以难挖、易验。
调整
(课件「工作量证明的难度设定和调整」;公式见上。)
每 2016 块调整一次。期望耗时 (2016\times 10,\mathrm{min}=20160,\mathrm{min})(整两周)。用最近 2016 块的实际耗时与 20160 min 相比:
| 实际耗时 | 出块节奏 | 新难度 |
|---|---|---|
| (< 20160) min | 偏快(不到两周) | 升高 |
| (> 20160) min | 偏慢(超过两周) | 降低 |
各全节点独立、自动计算,无需投票。课件目标形态例:0x0000000000000003A30C00000000000000000000000000000000000000000000(前导零越多越难)。
▸两周出完 2016 块会怎样
期望 20160 分钟出满 2016 块(约 10 分钟一块)。若实际只用了约 10080 分钟,说明全网算力涨了、出块太快 → 下一周期加难(合格哈希要更小、前导零更多)。若实际拖到约 40320 分钟,则降难。各全节点用同一公式自己算,不必投票。口语「难度升高」对应目标值(target / nBits)变小。
组装
胜出者广播 → 他节点校验 → 按父哈希挂接:
| 结果 | 含义 |
|---|---|
| 接主链 | 正常延伸 |
| 分叉 | 同父多子,暂记兄弟分支 |
| 孤立块 | 暂时找不到父(网络延迟等) |
分叉解决:保留竞争分支;后续哪边先变得**更长(累计 PoW 更大)**谁为主链。
1 | 时刻 t:A、B 几乎同时挖出块 |
节点先收下先到的 101;一旦看见更长链,就重组到长链。这不是改协议(硬/软分叉),只是 PoW 的正常竞争。
挖矿奖励
矿工须有钱包功能:160 位地址与私钥。出块时加 Coinbase 交易:输出招领地址为自己;金额 = 区块补贴 + 手续费。上链成功才生效。
| 高度区间(约) | 补贴 |
|---|---|
| 创世起 | 50 BTC |
| 每 210000 块减半 | 25 → 12.5 → 6.25 → 3.125(2024-04,高度 840000) |
课件写「现在 6.25」:对应第三减半后、第四减半前的表述;2024-04 后补贴为 3.125 BTC(另加手续费)。Coinbase 输出约 100 块内不可花。
算力史(课件,量级从 MH 到 EH):
| 年 | 大约算力 | 相对增长(课件) |
|---|---|---|
| 2009 | 0.5–8 MH/s | 16× |
| 2010 | 8 MH/s–116 GH/s | 14500× |
| 2011 | 16 GH/s–9 TH/s | 562× |
| 2012 | 9–23 TH/s | 2.5× |
| 2013 | 23 TH/s–10 PH/s | 450× |
| 2014 | 10–300 PH/s | 3000× |
| 2015 | 300–800 PH/s | 266× |
| 2016 | 800 PH/s–2.5 EH/s | 312× |
其后继续升至 EH 量级以上(随行情变)。课件另有「中国告别比特币挖矿」:境内挖矿逐步清退(政策背景,了解即可)。
小结
- 全节点独立验证交易。
- 矿工 PoW 打包新块。
- 全节点独立校验并组装链。
- 选择累计工作量最大的链。
UTXO
(Unspent Transaction Output,未花费交易输出)
比特币不维护「账户余额」字段,而维护一堆尚未花掉的输出。地址余额 = 该地址能解锁的 UTXO 之和;支付时选若干 UTXO 作输入,多退少补(找零输出)。
地址生成(课件简述「公钥 SHA160」;协议精确为):
[
\mathrm{Address} \leftarrow \mathrm{RIPEMD160}(\mathrm{SHA256}(\mathrm{pubkey}))
]
再 Base58Check 等编码成常见地址串。私钥自持,用于签名。
两类交易:
| 类型 | 结构 |
|---|---|
| 常规 | 有 vin(来源)+ vout(去向) |
| Coinbase | 无有效 vin;产出新币 + 费 |
结构
CTransaction:vin / vout / nVersion / nLockTime(未到点不入块)/ hash(TxID,常内存计算)。
CTxOut:nValue(该 UTXO 承载的聪/比特币数量)+ scriptPubKey(招领脚本,名含 PubKey,却不必只是「付给公钥」)。类型:P2PK、P2PKH、P2SH、P2WPKH、P2WSH。
CTxIn:prevout(hash = 前笔 Tx 哈希 + n = 第几项输出)+ scriptSig(认领脚本)+ nSequence(课件:具有特殊作用,如相对锁定、替换未确认交易)+ scriptWitness(隔离见证数据;0x00 表示无)。
定位一个 UTXO(课件):<区块ID :: 交易ID :: 输出项序号>,然后才是金额与招领脚本。仅用 <txid : vout> 在链上也可唯一定位输出;区块号便于全节点检索。
▸UTXO 不像银行卡余额
比特币节点不维护「地址余额」字段;「余额」是钱包把所有属于该地址、尚未被花掉的 UTXO 加总得到的视图。转账 = 选若干 UTXO 作输入 → 写出新 UTXO(给收款方 + 找零给自己)→ 旧 UTXO 作废。找零地址常换新址,是隐私习惯,不是协议强制。
▸花 8 个、付 6 个,其余必须写成找零
钱包视图「有 8 BTC」,实际是两张未花输出:5 BTC 与 3 BTC。要付给对方 6 BTC,必须把这两张都当输入花掉(不能撕开一张 5),再写两个输出:6 给对方、约 1.999 找零给自己(差额进矿工费)。两张旧输出从此从 UTXO 集消失;以后「余额」= 找零那一张 + 其它未动的输出。
Coinbase
每块第一笔;输入特殊;产出 = 补贴 +(Σ输入 − Σ输出)手续费;约 100 确认后可花。
脚本
比特币虚拟机:基于栈;跑 scriptSig + scriptPubKey;指令集刻意有限(非图灵完备),主做验签。操作码例:OP_CHECKSIG、OP_DUP、OP_HASH160、OP_EQUALVERIFY。
| 类型 | 全称 | 含义 |
|---|---|---|
| P2PK | Pay to Public Key | 付给给定公钥 |
| P2PKH | Pay to Public Key Hash | 付给地址(公钥哈希) |
| P2SH | Pay to Script Hash | 付给脚本哈希(赎回脚本链下约定) |
| P2WPKH | Pay to Witness Public Key Hash | 隔离见证版「付给公钥哈希」(课件:付给 SegWitness 形式的公钥哈希) |
| P2WSH | Pay to Witness Script Hash | 隔离见证版「付给脚本哈希」(课件:付给 SegWitness 形式的脚本哈希) |
▸P2PK 执行
程序缓冲区:<sig> \| <pubkey> \| OP_CHECKSIG。指针遇数据则压栈:先 <sig>,再 <pubkey>;遇 OP_CHECKSIG(双操作数)弹出二者,结合交易请求的哈希验签,算出的公钥须与脚本中公钥相符。栈顶真/假决定该输入是否有效。
▸P2SH 与 SegWit(隔离见证)在干什么
- P2SH:链上只写「脚本的哈希」;真正复杂规则(如 2-of-2 多签)在花钱时才出示完整赎回脚本。支付通道注资常用 P2SH。
- SegWit(Segregated Witness):把签名等见证数据从传统交易体积里拆出去,缓解块容量压力、修交易延展性;地址形态常以
bc1…(Bech32)出现。P2WPKH / P2WSH 即见证区承载认领数据的两种常见形式。课件写「SegWitness」即同一概念。
栈
执行顺序:先跑输入里的认领脚本 scriptSig,再跑输出里的招领脚本 scriptPubKey;全程一个栈,只压入/弹出,没有循环(刻意非图灵完备)。栈顶为真则该输入合法。
以最常见的 P2PKH(付给公钥哈希 / 地址)为例。
认领 scriptSig:<sig> <pubkey>(证明「持有对应私钥」)。
招领 scriptPubKey:OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG。
1 | 步骤 栈(右侧为顶) |
含义拆开:OP_EQUALVERIFY 确认「出示的公钥确实对应这个地址」;OP_CHECKSIG 确认「签名是该公钥对应私钥做的」。P2PK 更短(招领里直接放公钥,无 DUP/HASH160),课件 EXAMPLE 即该简化路径。
见证
(SegWit / Segregated Witness,隔离见证;课件亦写 SegWitness)
传统交易把 <sig> 写在 scriptSig 里,签名计入交易体积,直接挤占约 1 MB 的块上限;改签名还会改 TxID(交易延展性),后续依赖该 TxID 的子交易会对不上。
SegWit 把签名等认领数据挪到交易末尾的 witness(见证区),旧字段里的 scriptSig 变空。P2WPKH 招领只剩 OP_0 <20 字节公钥哈希>,认领改由见证区承载 <sig> <pubkey>;地址常为 bc1…(Bech32)。
1 | 传统: [版本][输入含 scriptSig 签名][输出][nLockTime] |
体积按重量计,不再按原始字节一视同仁:
[
\mathrm{weight}=4\times(\text{非见证字节})+1\times(\text{见证字节}),\quad
\mathrm{vsize}=\lceil\mathrm{weight}/4\rceil
]
块上限 4,000,000 weight(约合 1 百万虚拟字节)。签名在见证区只按 1 倍计,同样一笔支付占用的块配额下降,有效容量常大于旧的 1 MB。TxID 的计算不含见证区,改签名只改 wtxid、不改 txid,延展性被修掉。
▸验证时仍要看见证
签名不是「不算数」,只是计价折扣、且不进入旧 TxID。全节点验证 P2WPKH 时,仍用见证区的 sig/pubkey 按上表同类栈规则检查;轻节点/旧节点若不理解见证,至少不会把「空 scriptSig」误判成可随便花的输出(有 version/marker 约定)。
通道
面向性能要求高、交易数量大的场景。课件例:有线电视按秒计费,若每秒一笔都上链,比特币吞吐不够。
链上相关交易类型:
| 交易 | 作用 |
|---|---|
| Funding | 注资:付方把一笔钱打到 A、B 的 2-of-2 多签联合地址(P2SH,须双方签名才能花);1 个付款方=单向通道,2 个=双向 |
| Commitment | 应承:链下多次、不上链;资金都来自同一注资 UTXO;输出拆成「给收方的累计承诺 + 给付方找零」 |
| Settlement | 决算:收款方把最后一版应承签上己方名广播上链(付款方也可发起,因收方每次都会签完发还) |
| Refund | 退款:超时等路径拿回资金 |
闪电网络(Lightning Network):支付通道网络。课件在通道四类之外另列:
| 交易 | 课件名 | 作用 |
|---|---|---|
| Delivery | 转存 | 任一方把联合地址里属于自己的资金转到更方便花的地址 |
| Revocable Delivery | 可撤转存 | 可撤销的转存 |
| Breach Remedy | 补救 | 对方违约时惩罚并补救 |
▸通道三步记忆口诀
- 注资:双方把钱锁进 2-of-2 多签「保险箱」(上链一次)。
- 应承:链下反复改「保险箱里怎么分」的收据,只交换签名,不上链。
- 决算:把最后一版收据广播上链,真正分配 UTXO。
闪电网 = 很多条通道连成图,A→B→C 可多跳;有人作弊广播旧收据,对方可用 Breach Remedy 惩罚拿走保证金。
时序
以双向通道、总额 5 BTC 为例(注资常用 P2SH 2-of-2 多签)。链上只出现首尾两笔;中间改余额全部链下。
1 | 时间 → |
- Funding(注资):A、B 各出一部分(或一方单边注资),输出锁到双方多签地址。此笔上链并获确认后,通道余额才可在链下改。
- Commitment(应承):每次付款生成一版新的「如何瓜分该注资 UTXO」交易,双方签名后各自收存。旧版作废:协议用 Revocable Delivery(可撤销交付)让对方拿到撤销密钥;以后谁再广播旧收据,对方可用 Breach Remedy(违约惩罚)把通道内资金全部取走。
- Settlement(决算):合作关闭时,按最后一版应承构造结算交易并广播,多签 UTXO 拆成各自输出,通道结束。
- Refund(退款):对方失联或超时,走预先签好的退款/超时路径,资金在锁定期后回到注资方(单向通道尤其依赖这一条)。
Delivery 是「到期可取」的交付输出;Revocable Delivery 在其上加「被撤销则对方可立即罚没」。因此应承可以放心反复更新:诚实方只广播最新版;作弊广播旧版会亏光保证金。
多跳
闪电网络把许多条通道连成图。A 要付给 C,不必先开 A–C 直连通道:只要存在 A–B、B–C,即可 A→B→C 多跳。中间人 B 不托管资金、也不必信任 A/C——靠 HTLC(Hash Time-Locked Contract,哈希时间锁合约)做成原子互换。
1 | A ──通道── B ──通道── C |
超时未出示原像则沿 Refund 退回,不会出现「A 已扣、C 未收到」的半支付。B 若想截留,没有 R 拿不到 C 那一跳,也就无法向 A 兑现——原子性来自同一哈希锁。
▸HTLC 像「同一口令取两处款」
收款方先想一个秘密 (R),只把 (H=\mathrm{Hash}(R)) 印在发票上。付款方对中间人锁一笔:「谁拿出原像 (R) 就把钱给你,过时退回」;中间人对收款方再锁一笔同样条件(金额略少,差额即路由费)。收款方出示 (R) 取款,中间人立刻用同一个 (R) 向上家取款。中间人截留不成:没有 (R) 取不到下家那一跳,上家那一跳也兑不了。超时则两边都退回,不会半付。
▸旧收据作弊
通道已更新到 C3(A=1, B=4)。A 若把更早的 C1(A=4, B=1)广播上链想多拿,B 用撤销密钥走 Breach Remedy,通道内全部资金归 B。闪电网能多跳,正是因为每条边上的应承都靠这套罚则约束,而不是靠中间人信誉。
网络
P2P:种子节点、伙伴列表、伙伴发现;转发交易与区块。
新节点先连若干 DNS 种子或硬编码节点,换取更多对等方地址,再与若干伙伴维持长连接。收到尚未见过的交易/区块就校验并再转发出去(洪水式扩散)。没有中心服务器;某几条链路断了,只要图仍连通,消息仍能绕到。延迟会导致「赛跑分叉」,靠最长链收敛,见上文组装。
定义
课件定义:区块链技术是一种以非对称加密对交易数字签名,通过 PoW 等共识协调记账节点,数据以链式区块组织存储的分布式账本技术。
支撑技术:非对称与签名;SHA-256;链式结构;Merkle;共识(拜占庭、PoW/PoS/DPoS、PBFT、Raft)。
优点:去中心化、数据公开、可信(信任与价值传递)。
问题
| 问题 | 表现 |
|---|---|
| 隐私 | 地址半匿名,监管难 |
| 性能 | 确认慢、块容量有限 |
| 系统风险 | 分叉、51% 攻击 |
协议分叉
不同于「赛跑分叉」:
| 类型 | 含义 |
|---|---|
| 硬分叉(Hard Fork) | 新规则不接受旧块/旧规则,链永久分裂可能(课件:新协议不兼容老区块) |
| 软分叉(Soft Fork) | 新规则更严,旧节点仍见新区快为「合法」子集(课件:新协议兼容老区块) |
BCH(Bitcoin Cash,2017-08-01):扩容路线分歧;香港共识 / 纽约共识背景;ABC 团队 8 MB 等方案上线。
区分
协议分叉改的是「什么叫合法区块」,与矿工几乎同时出块、随后最长链胜出的「赛跑分叉」不是一类事。
判断口诀:新规则挖出的块,旧节点认不认;旧规则挖出的块,新节点认不认。
| 软分叉 | 硬分叉 | |
|---|---|---|
| 规则怎么变 | 变严(合法集合变小,是旧规则的子集) | 变宽或不兼容(旧节点会判新块非法) |
| 旧节点看「新区快」 | 仍当成合法 | 可能直接拒绝(例如 8 MB 的块) |
| 新节点看「旧式块」 | 可能拒绝(不够严) | 往往仍接受 |
| 网络会怎样 | 多数算力执行新规则即可仍是一条链;旧节点可后补升级 | 不升级者跟不上新块;两边都继续挖 → 永久两链、两种币 |
| 本课例子 | SegWit(2017,BTC 主链) | BCH 从 BTC 分出;另见后文 ETH / ETC |
▸用「块大小」把两种分叉走一遍
旧规则:区块 (\le 1,\mathrm{MB})。
软分叉(变严,假想成 (\le 0.5,\mathrm{MB})):0.4 MB 的新块,新旧节点都认。0.8 MB 的旧式块,旧节点认、新节点拒。多数矿工跑新软件后,没人在 0.8 MB 块后面续挖,链仍一条。SegWit 同理:对旧节点,见证交易仍像「合法交易的子集」;多数矿工执行更严检查,全网收敛,旧节点暂时看不懂见证区也能跟主链。
硬分叉(变宽,(\le 8,\mathrm{MB})):矿工挖出 8 MB 块。新节点收下并延伸;旧节点判非法、停在分叉点。两边各自累加 PoW → 两条账本。分叉前持有 BTC 的地址,在两边各有一份对应 UTXO,所以 BCH 加了重放保护(不同的签名标记),避免同一笔转账在两条链上同时生效。
BCH
(Bitcoin Cash,比特币现金)
直接原因是旧比特币约 1 MB 块上限:拥堵、手续费上升。两条扩容路线谈不拢:
| 路线 | 做法 | 代表 |
|---|---|---|
| 链下 + 软分叉 | 块上限先不动;SegWit 给签名「打折」腾容量,小额走闪电网络 | Bitcoin Core → 后来的 BTC 主链 |
| 链上 + 硬分叉 | 把块上限直接做大,交易仍全部写进区块 | Bitcoin ABC 等 → BCH |
课件提到的两次「共识」与分叉上线(考试以课件口径为准):
- 香港共识(课件:2016-02-20,香港数码港):中方矿工与海外开发者开会。课件表述为:开发者同意区块从 1 MB 扩到 8 MB,中方矿工同意只运行 Core、不再支持 Gavin 的版本。
- 纽约共识(课件:全球 50 多家企业):拥堵使商业机构感到扩容紧迫,达成扩容至 2 MB。
- BCH 上线:课件称吴忌寒提出做一个扩容分叉,作为纽约共识失败的备胎。2017-06 ABC 团队完成扩到 8 MB 的版本;2017-08-01 比特币现金正式上线。
(公开史料里香港共识还常被写成「SegWit + 日后 2 MB」,纽约共识即 SegWit2x;与上表课件用词不完全相同。答题先写课件的 8 MB / 2 MB / ABC / 8 月 1 日。)
另有一条常见时间线(便于对照,不必与课件逐字相同):SegWit 于 2017-08 在 BTC 主链激活;SegWit2x 的 2 MB 硬分叉于 2017-11 取消。原链继续叫 BTC;BCH 为硬分叉新链,高度 478558。之后 BCH 块上限还曾再扩大(如 32 MB)。
▸硬分叉 vs 软分叉(对照)
- 硬分叉:新软件认为「旧规则下的某些块非法」→ 不升级的节点与升级节点各走各的,可能永久两链(如 BCH 从 BTC 分出)。
- 软分叉:新规则是旧规则的子集(更严);不升级节点仍把新区快当合法,网络可渐进升级(SegWit 一类以软分叉部署的经典案例语境)。
另有「赛跑分叉」:同一高度两矿工几乎同时出块,随后最长/最重链胜出,短叉上的块变孤块/孤立块(orphan)——这是正常 PoW 现象,不是协议升级。
复习
| 主题 | 必记 |
|---|---|
| 两问题 | 假币→签名;双花→分布式账本+共识 |
| Hash | 单向、抗碰撞;SHA-256;双 SHA |
| 块头 80 B | 版本|父哈希|Merkle|时间|nBits|Nonce |
| Merkle | 双 SHA;(O(\log N)) 路径;SPV |
| PoW | ~10 min;2016 块调难度;最长/最重链 |
| 减半 | 210000 块;现补贴 3.125(课件或写 6.25) |
| UTXO | 无账户余额字段;输入引用 prevout |
| Coinbase | 补贴+费;~100 块成熟 |
| 脚本 | P2PKH 最常见;栈机非图灵完备 |
| 通道 | Funding / Commitment / Settlement |
| 分叉 | 赛跑分叉 vs 硬/软协议分叉 |
深入阅读(课件):比特币白皮书、比特币源码。
三、生态
比特币之后:竞争币、公链平台、企业链、ICO、监管、钱包/交易所/矿机矿池。
发展
| 方向 | 例子 |
|---|---|
| 竞争币 / 山寨币(Altcoin) | Litecoin、Dogecoin |
| 开发策略 | 复制/修改开源(课件以莱特币为例)vs 全新开发(课件以狗狗币为例) |
| 新一代公链 | Ethereum、EOS… |
| 技术创新 | 可编程、可开发;新共识算法 |
| 企业 / 联盟链 | R3 Corda、HyperLedger Fabric、Hyperchain、蚂蚁链、FISCO BCOS |
| 融资 | ICO(Initial Coin Offering,首次代币发行) |
形态
| 形态 | 特点 |
|---|---|
| 公链(Public Chain / 公有链) | 任何人可参与;易部署应用;全球可访问;不依赖单公司 |
| 联盟链(Consortium Chain) | 产业/国家清算结算等;权限可控;扩展性往往更好 |
| 私链(Private / Internal) | 个人或单组织拥有;内部审计测试 |
另维:
| 含义 | |
|---|---|
| 无许可(Permissionless) | 无需批准即可加入 |
| 许可(Permissioned) | 须经许可加入 |
▸公链 ≠ 无许可(课件强调)
「用户」与「共识节点」可分离。无许可区块链不一定是公链(定义边界以是否开放加入与谁出块为准,考试按课件表述)。
| 维度 | 公链 | 联盟链 | 私链 |
|---|---|---|---|
| 英文 | Public / Permissionless 为主 | Consortium / Permissioned | Private / Internal |
| 谁可加入 | 任何人可作节点 / 用户 | 预先选定的多家组织 | 单一组织(或个人)内部 |
| 读账本 | 默认全网公开 | 联盟内可见;可用通道再切分 | 仅内部 |
| 谁出块 | 开放竞争(矿工 / 验证者) | 许可节点按策略出块 | 本组织指定节点 |
| 典型共识 | PoW / PoS 等,抗未知恶意 | PBFT / Raft 等,节点集相对固定 | 中心化或轻量共识即可 |
| 信任假设 | 不信任任何人;靠经济激励 + 多数诚实算力/权益 | 半信任:组织间互不把钥匙全交给一家 | 信任本组织运维 |
| 性能 | 确认慢、吞吐低(全球复制) | 往往更高、延迟更低 | 最高、最易改规则 |
| 治理 | 社区 / 矿工 / 持币者博弈 | 联盟章程、成员投票 | 本组织行政决定 |
| 代币 | 常有原生币激励出块 | 可无币;权限靠证书(如 MSP) | 通常无币 |
| 场景 | 数字货币、开放 DeFi | 清算结算、供应链、跨境协作 | 内部审计、测试、演示 |
| 例子 | Bitcoin、Ethereum | Fabric、Corda、FISCO BCOS、蚂蚁链 | 某公司实验链 |
ICO
本质是产品众筹:项目完成前公开售卖部分平台 Token(通证)募资开发。Token = 生态内权益证明,常作流通单位;发行后多由代码约束,不受个人随意改规则(理想情况)。
各国态度(课件表,时点偏 2017 前后):
| 国家 | 态度 |
|---|---|
| 美国 | 各州不一,监管机构态度不一致 |
| 英国 | 观望,风险自负 |
| 俄罗斯 | 反对加密货币,建监管框架 |
| 中国 | 全面禁止 ICO(2017-09 七部委:非法公开融资等) |
| 日本 | 允许,相对活跃 |
监管摘录要点:中国将区块链列入十三五信息化规划,但数字货币须央行发行、ICO 非法;美 BitLicense、智能合约立法;新加坡 Sandbox;日本《支付服务法案》承认比特币支付方式等。课件举例:2017 年 Circle(波士顿)、Ripple(旧金山)、Coinbase(纽约州)分别获数字货币相关许可(BitLicense 语境)。
竞争币
Litecoin
(莱特币,Charlie Lee / 李启威,前谷歌工程师,2011)
出块约 2.5 min(课件:2 分半);总量目标约 8400 万(至约 2140);PoW 用 scrypt(非 SHA-256)。课件:2011 年发布,首次上线 2011-11-09。开发策略属「复制、修改比特币开源」。
Dogecoin
(狗狗币)
出块约 60 s;总量课件写至 2015 达 1000 亿((10^{11}));共识亦 scrypt。课件将其归为「全新开发」路径。
Scrypt
Colin Percival(课件:FreeBSD 黑客)原为抗彩虹表(rainbow table);耗时且占内存,难大规模并行摘要 → 抗 ASIC(Application-Specific Integrated Circuit,专用集成电路)挖矿相对 SHA-256 更难(后期仍有 scrypt ASIC)。亦属 PoW 族:过程中仍算哈希,但必须占用较多内存。
SHA-256 挖矿几乎只吃运算:块头 80 字节进 ALU,状态才几十字节,ASIC 可并行堆无数条流水线。Scrypt 在哈希之外强制「先铺一张大表、再随机乱序回读」——内存困难(memory-hard):少给 RAM 就得反复重算,多开并行就得按份配内存。
核心子过程是 ROMix(外层还有 PBKDF2-HMAC-SHA256,考试记「占内存的混合」即可)。(N) 控制表长,莱特币常用 (N=1024,,r=1,,p=1),单次约 128 KB 工作区。
1 | # 示意:一次 scrypt 的内存困难部分(ROMix),不是完整 RFC 实现 |
1 | V[0] V[1] V[2] ... V[j] ... V[N-1] ← 整表留在 RAM |
▸为什么 ASIC 对 SHA-256 更「划算」
同一块硅:SHA-256 几乎全是哈希电路,每毫米都能多跑几路。Scrypt 每多开一路就要再备一份 (V);芯片面积被 SRAM 吃掉,同等成本下并行度上不去。把 (V) 扔掉改现算也可以,但每次随机访问都变成 (O(N)) 重放,总时间接近 (O(N^2)),挖矿更亏。莱特币把 (N) 设得不大(约 128 KB),后来仍出现 scrypt ASIC——「相对 SHA-256 更吃内存」,不是「永远没有专用芯片」。
▸验证仍然便宜
全节点验证一枚 scrypt 块:按同样参数算一次 ROMix 即可(内存同样约 128 KB,时间可接受)。困难在「试 Nonce」要重复成千上万次。这与比特币「难挖、易验」同构,只是每次试凑的成本从「一次 SHA-256」换成「一次占内存的 scrypt」。
平台
Ethereum
(以太坊,Vitalik Buterin)
课件:既是平台也是一种编程语言生态,使开发者能建立并发布下一代分布式应用。可用来编程、分散、担保和交易:投票、域名、金融交易所、众筹、公司治理、合同/协议、知识产权,以及得益于硬件集成的智能资产。→ 后续课程深入。
智能合约(Smart Contract):内嵌于区块/链上的自定义程序逻辑;条件满足则自动执行约定指令(清算、赔偿、交割等)。
HyperLedger
(超级账本,2016,Linux 基金会)
课件:约 30 家创始公司会员 + 技术与组织治理机构;跨行业开源协作(金融、银行、物联网、供应链、制造、科技)。Fabric:许可链,带 chaincode(链码,类智能合约),由 Digital Asset 与 IBM 提出。
R3 Corda
(课件写 R3 CEV / R3)
纽约区块链创业公司 R3 发起的联盟,成员多为全球金融巨头。产品:开源 Corda + 商业版 Corda Enterprise。
EOS
(原宣传 Enterprise Operating System)
仿 OS 架构扩展 DApp;提供账户、身份验证、数据库、异步通信、跨大量 CPU/集群的调度。课件宣传:可扩展至每秒百万级交易、消除用户手续费、便于快速部署。共识 DPoS(Delegated Proof of Stake,委托权益证明)。热点:宣称「区块链 3.0」、ICO 融资约 40 亿美元、竞争超级节点、曝出若干安全漏洞。
产业
| 环节 | 要点 |
|---|---|
| 钱包 | 存管密钥的容器,里面没有「钱」;管权限、密钥与地址、余额跟踪、创建并签署交易。类型:全节点(Bitcoin Core)、SPV 轻钱包(课件:只维护与自己相关的链上数据)、中心化在线钱包(依赖中心服务器,课件例 blockchain.info)、硬件/冷钱包 |
| 交易所 | 课件:全球超过 1.2 万 家,头部 20 家约占 90% 市场收入。史:Mt.Gox(2010 日本成立,早期最有名,2011 被黑);币安 Binance、OKCoin/OKEx、火币 Huobi、Upbit(韩国) |
| 矿机 | 比特大陆 Bitmain、嘉楠耘智 Canaan、比特微 MicroBT、亿邦国际 |
| 矿池 | 算力聚合(课件多为图) |
| Coinbase | 2012 成立,钱包/交易/资管。课件:2015-01-27 交易所开张;2017-01-17 纽约 NYDFS 通过牌照申请;2021-04-14 Nasdaq 上市 |
▸钱包里装的是钥匙
链上资产在账本里;钱包保存能动用这些 UTXO/账户的私钥。丢私钥 ≈ 丢币;把币放中心化交易所则多了一层托管对手风险。
| 类型 | 私钥 | 账本 | 验证 | 便利 | 风险要点 | 例子 |
|---|---|---|---|---|---|---|
| 全节点钱包 | 自持 | 存整链 | 独立验全部交易/块 | 同步慢、磁盘大 | 本机被盗/硬盘损坏;无托管方 | Bitcoin Core |
| SPV 轻钱包 | 自持 | 只存块头 / 与自己相关的数据 | Merkle 路径 + 多确认 | App 即可 | 依赖全节点喂路径;不自己重放全部历史 | Electrum、手机钱包 |
| 中心化在线钱包 | 托管在服务商 | 服务商记账视图 | 用户不验证链 | 注册即用 | 跑路、被黑、冻结;丢的是对服务商的债权 | 交易所账户、网页钱包(课件例 blockchain.info) |
| 硬件 / 冷钱包 | 自持,离线 | 不存链;联机时只出签名 | 不验全链 | 转账多一步确认 | 供应链造假、种子词备份泄露;联机瞬间变「热」 | Ledger 等;纸钱包亦属冷 |
热 / 冷:私钥是否长期暴露在联网设备上。全节点与 SPV 都可以是热钱包(软件在线);硬件钱包默认冷。中心化钱包对用户而言无私钥可冷藏。
| 独自挖矿(Solo) | 矿池(Pool) | |
|---|---|---|
| 做法 | 自己找 Nonce,中块独享补贴+费 | 算力交给矿池,按 份额(share)分成 |
| 出块 | 算力占比极低时可能数年不中 | 池子经常出块,收益摊成小额稳定流 |
| 收入 | 期望相同(同算力),方差极大 | 期望略低(池抽成),方差小 |
| 结构 | 矿机 ↔ 全网 | 矿工 → 矿池服务器 → 全网广播 |
| 风险 | 运气 | 矿池作恶/跑路、算力过度集中(51% 隐忧) |
1 | 矿工A ─┐ 下发任务(块头模板 + 难度更低的「份额目标」) |
复习
| 主题 | 必记 |
|---|---|
| 三形态 | 公 / 联盟 / 私;无许可 vs 许可 |
| ICO | 售 Token 众筹;中国 2017 禁 |
| LTC/DOGE | scrypt;出块更快 |
| 以太坊 | 可编程平台 + 智能合约 |
| Fabric | 许可 + chaincode |
| 钱包 | 密钥容器,非余额容器 |
四、以太坊
相对比特币:从「电子现金」升级为「内嵌计算机的区块链」。
定义
官方表述(课件引 ethereum.org):
- 2025:去中心化网络与开发平台,以加密货币 ETH(ether)驱动;承载 DeFi、NFT、游戏、去中心化社交、稳定币等。
- 2024:以太坊是内嵌计算机的区块链,用于以无许可、抗审查的方式构建应用与组织。
核心抽象:全网就一台规范计算机——EVM(Ethereum Virtual Machine,以太坊虚拟机)的状态达成一致;任意参与者可广播「请执行某计算」的请求,他节点验证并执行,状态变更提交并传播。每个节点保存这份状态副本。
白皮书:Vitalik Buterin(2013 末初版、项目启动);黄皮书(形式化规范):Gavin Wood(并推动 Solidity、Parity、Polkadot、Web3.0 等)。课件时间线:2014-03 起陆续 3 款测试网;2014-04 黄皮书;2014-07-24 起 42 天以太币预售。
发展阶段(课件):初始 → Homestead(2016)→ Metropolis(Byzantium / Constantinople)→ Serenity / Eth2:共识 PoW → PoS。
▸以太坊一句话
比特币主要回答「钱怎么在无银行情况下转」;以太坊额外回答「条件满足时,一段程序能不能全网一起跑并改状态」。ETH 是跑这段程序时付的「电费」;合约代码一旦部署,谁都能按规则调用(只要付得起 gas)。
| 维度 | 比特币 | 以太坊 |
|---|---|---|
| 定位 | 点对点电子现金 | 去中心化计算机 / 开发平台 |
| 回答的问题 | 无银行如何转账、防双花 | 条件满足时,一段程序能否全网一起跑并改状态 |
| 状态 | UTXO(未花输出集合) | 账户 + 世界状态(余额、nonce、代码、存储) |
| 执行 | 脚本栈机,刻意非图灵完备 | EVM,图灵完备,用 gas 限死循环 |
| 原生资产 | BTC | ETH(付 gas 的「电费」) |
| 共识(现状) | PoW,最长/最重链 | 合并后 PoS / Gasper(曾为 PoW + Keccak256) |
| 出块 | 约 10 min | PoW 约 15 s;PoS 固定 12 s / slot |
| 应用 | 转账、脚本、支付通道 | DeFi、NFT、稳定币、DApp、智能合约 |
| 身份 | 地址 / 公钥哈希 | EOA 与合约账户 |
| 阶段 | 时间(约) | 要点 |
|---|---|---|
| 白皮书 / 预售 | 2013 末–2014 | 初版白皮书;测试网;黄皮书;42 天 ETH 预售 |
| 初始 / Frontier | 2015-07-30 | 主网上线;课件:尚非完全可靠安全的网络 |
| Homestead | 2016-03-14 | 网络已平稳;提供图形界面钱包 |
| Metropolis · Byzantium | 2017-10 | 与 Constantinople 同属 Metropolis;更轻量、快速、安全 |
| Metropolis · Constantinople | 2019 | 继续降 gas、调整挖矿 |
| Serenity / Eth2 | 2020 起 | 共识 PoW → PoS(Vitalik 2013 即提出 PoS 设想) |
| └ 信标链(阶段 0) | 2020-12-01(课件亦写 12-02) | PoS「空链」:无交易、无 Token/DeFi,只跑共识 |
| └ 合并(The Merge) | 2022-09-15 | 执行层 + 信标合一;停 PoW |
课件四段记法:初始 → Homestead → Metropolis(Byzantium / Constantinople)→ Serenity。中间另有 DAO 硬分叉(2016,ETH / ETC)与 EIP-1559(London,基础费销毁),细节见后文。
概念
节点跑 EVM(课件:类似 JVM,高级语言编译成字节码);账户之间用消息/交易交互;合约代码在 EVM 沙盒执行;之上的应用称 DApp(Decentralized Application,去中心化应用)。架构关键词:存储 / 数据与区块与交易 / P2P 与协议 / 共识 / 智能合约 / 虚拟机 / DApp。
▸听歌:传统平台 vs 合约+DApp(课件)
选项一:歌手与互联网音乐平台签约,听众向平台付费。选项二:歌手把歌曲与合约部署上链;听众用 DApp 付费播放。课件续例:合约 PlaySong(网名) 再调用 Song1Here() 播链上歌曲;每次 0.000001 ETH;DApp 先查余额是否够付听歌费 + gas。
| 概念 | 含义 |
|---|---|
| 外部账户 EOA(Externally Owned Account) | 公私钥控制;可主动发交易;创建无存储成本 |
| 合约账户(Contract Account) | 代码控制;无私钥;只能在被调用时发内部交易;创建需付存储费 |
| 世界状态(World State) | 全部账户状态的集合 |
| gas | 计量计算与存储的「汽油」;限工作量并付费给验证者 |
| 验证节点 | 参与共识、出块/验证 |
账户四字段(课件):
| 字段 | 含义 |
|---|---|
| nonce | EOA:已发交易数;合约:已创建合约数 |
| balance | 余额,单位 Wei;(10^{18},\mathrm{Wei}=1,\mathrm{Ether}) |
| storageRoot | 账户存储 MPT 根(缺省 0) |
| codeHash | EVM 代码哈希;EOA 为空串哈希。课件:合约账户地址是代码的哈希(实现上地址由创建者+nonce 算出,codeHash 另存字节码指纹) |
▸账户模型 vs UTXO
比特币像一堆「未花钞票」;以太坊像银行账户:有余额、有 nonce 防重放、合约还能挂代码和存储。因此状态要频繁更新,用 MPT(Merkle Patricia Trie)而不是纯交易 Merkle。
| 维度 | EOA(外部账户) | 合约账户 |
|---|---|---|
| 控制者 | 私钥(ECDSA) | 部署上去的 EVM 代码 |
| 能否主动发交易 | 能;交易必须由 EOA 签名发起 | 不能凭空新开;只能在被调用时发内部消息 |
| 创建成本 | 地址可由密钥算出,链上尚无余额时几乎无存储费 | 部署交易 to=0,按代码/存储付 gas |
| nonce | 已成功发出的交易数(防重放) | 该合约已创建的子合约数 |
| balance | Wei 余额,可直接转 ETH | 亦可持有 ETH,由代码决定何时转出 |
| codeHash | 空串的哈希(无代码) | 合约字节码的哈希;代码本身存另一处 |
| storageRoot | 空树根 | 合约存储槽组成的 MPT 根 |
| 谁改状态 | 用户签一笔交易 | 执行字节码;失败则整笔回滚 |
| 例子 | 普通钱包地址 | ERC-20、DEX、多签钱包合约 |
世界状态 = 以地址为键的账户字典,整棵树的根写入块头 stateRoot。一笔交易只改若干叶子,其余节点可复用。
1 | 块头 stateRoot |
| 树 | 键 | 叶子 | 块头里的根 |
|---|---|---|---|
| 世界状态 | 账户地址 | 上述四字段 | stateRoot |
| 账户存储 | 存储槽(合约) | 槽上的值 | 记在该账户的 storageRoot,不直接进块头 |
▸nonce 拦住「同一张支票兑两次」
某 EOA 当前 nonce=5,发出「转 1 ETH 给对方」且签名合法。入块后该账户 nonce 变成 6。把同一笔已签名交易再广播一次:节点看到 nonce 仍是 5,与「下一个必须是 6」不符,直接丢弃。比特币靠 UTXO 只能花一次达到同样效果;以太坊账户模型必须靠 nonce。跳号(先发 nonce=7)会卡在内存池里等到 6 先成交。
交易
EOA → EOA:转账。EOA → 合约:触发代码。合约不能凭空新开交易,只能响应。
类型(课件):
| 类型 | 要点 |
|---|---|
| 简单支付 | 转 ETH,几乎不动 EVM,gas 最少(约 21000);两 EOA 之间只能转 ETH |
| 存证 | value=0,内容放 data;对方地址不能为 0(可无关,但不能空)。也可专门部署存证合约,之后调用以附加校验 |
| 合约部署 | to=0;data=字节码;回执返回新合约地址 |
| 合约调用 | Token 转移;查询(课件:系统提供、无需自部署的系统合约之一);其它业务 |
字段(EIP-1559 后常见):from(必须是 EOA)/ to / signature / nonce / value(Wei,(1,\mathrm{Wei}=10^{-18}) Ether)/ data / gasLimit / maxPriorityFeePerGas / maxFeePerGas。约束:(\mathrm{maxFee}\ge\mathrm{baseFee}+\mathrm{priorityFee})。
data 课件四种用法:支付说明;value=0 时存证;部署时放合约代码;调用时放函数名与参数。
▸课件转账数字
gasLimit=21000,maxFeePerGas=300,maxPriorityFeePerGas=10,value=10000000000(Wei)。一种结算结果:发送者扣 1.0042 ETH,接收者得 1 ETH,Gas 0.0042 ETH(其中基础费约 0.00399、小费 0.00021)。
▸Gas 直觉
每步操作标价 gas;用户设上限 gasLimit 与愿意付的单价。算力/存储都要付;清存储可返还激励少占状态。EIP-1559:基础费(baseFee)销毁,小费给验证者,减轻操纵费市场;块 gas 目标约 15M、上限约 30M(随网络需求在前块 ±1/1024 内调)。
1 | 简单支付 EOA ──value──► EOA gas ≈ 21000,几乎不跑合约 |
付费拆成两块(EIP-1559):
| 部分 | 谁拿 | 怎么变 |
|---|---|---|
| baseFee(基础费) | 销毁,不给验证者 | 上块太满则下一块升高,太空则降低(约 ±1/1024) |
| 小费 priority fee | 验证者 | 用户设上限,用来插队 |
用户设 maxFeePerGas(愿付单价上限)和 maxPriorityFeePerGas。实际单价 ≈ baseFee + 小费,且不超过 maxFee。块有 gas 目标(约 15M)和硬顶(约 30M),防止单块把弱节点拖垮。
▸为什么要销毁基础费
若全部 gas 都给验证者,验证者可以合谋把基础费抬很高再独吞。销毁后,抬费等于烧掉 ETH,对验证者没有直接好处;小费仍补偿打包。用户只须设一个「最多愿付」,不用猜下一个块的精确拍卖价。
存储也要付费,按 32 字节的最小倍数计。状态在每个节点都有一份,故清除某一存储项可免执行费并给奖励,鼓励少占状态。
任何引起状态转移的操作都收费(算术、写存储等)。Gas 是计量系统资源的最小单位;每条指令有复杂度标价。课件例:
| 指令 | Gas | 含义 |
|---|---|---|
STOP |
0 | 停机 |
ADD / SUB |
3 | 加减 |
MUL / DIV |
5 | 乘除 |
SSTORE |
20000 | 写存储(贵:全网复制状态) |
发送者预付 Start gas(即 gasLimit)。逐步扣费:成功则剩余 gas 退回发送者,已耗部分给出块者;累计超过预付 → OUT OF GAS,已做状态整笔回滚(预付已耗不退)。旧式计价 Fee = Gas × GasPrice;发送者余额须够付费。EIP-1559 后单价拆成销毁的 baseFee + 给验证者的小费,手续费仍是出块者(Block Producer)的激励。
发行
用户不能自己造 ETH。协议在出块与共识活动中铸造:每个被提议的块有奖励,epoch 检查点还有与达成共识相关的验证者奖励。总发行量取决于验证者人数及其质押量;理想情况下均分,实际按表现。课件:大约总发行的 1/8 归区块提议者,其余给其他验证者。提议者另拿交易小费和 MEV 相关收入——这两部分来自已有 ETH(回收),不是新铸。
销毁(燃烧):每笔交易的 baseFee 永久退出流通。需求高时,一块烧掉的 ETH 可以多于新铸,从而抵消发行。销毁基础费还防止出块者「自己的交易免 baseFee、同时抬高别人费用」或把基础费链下返还。
EVM
图灵完备(Turing Completeness):一套规则(语言或指令集)能实现图灵机的全部功能;高级语言的 if/循环即可。EVM 图灵完备,但用 gas 防止死循环。沙盒:无网络、无文件 I/O、不能起其它进程,合约间只能有限调用。
三大模块(课件):① 编译:封装 Solc,RPC 对外;Solidity → 字节码 + ABI。② Ledger:改普通账户/合约账户并持久化。③ 执行(核心):部署或调用;除解释字节码外可走 JIT(如把连续 push 打包)。流程:判部署还是调用 → 逐步执行 → 停机则判是否正常,正常则提交状态否则回滚 → 结果写入 Receipt,调用方可按交易哈希查询。方法异常或 gas 尽则回滚;交易一旦上链完毕无法再改。语言以 Solidity 为主(另有 Vyper);课件要求自学:soliditylang.org、中文文档。
▸ABI 是什么
ABI(Application Binary Interface,应用二进制接口)可当作合约的「说明书」:有哪些函数名、参数类型、返回值。钱包/前端按 ABI 把「调用 transfer(地址,数量)」编成交易的 data 字节;节点按同样规则解码并执行。没有 ABI,字节码仍在链上,但人类工具很难正确调用。
沙盒 = 合约不能做的事:访问磁盘、随便访问互联网、无限循环(gas 耗尽即停)。只能改本链世界状态、按规则调用其他合约。这样恶意合约无法直接黑掉运行节点的操作系统。
1 | 钱包按 ABI 编 data |
区块
PoW 时代块头(课件:最长约 800 字节)含:parentHash、unclesHash(叔块头列表的哈希)、coinbase(本块奖励与手续费打给谁,160 位地址)、stateRoot、txTrieRoot、receiptTrieRoot、difficulty、timestamp、number(高度,本块之前的块数)、gasLimit、gasUsed、extraData(任意附加,不超过 32 字节)、nonce 等;块身还有交易列表与 uncle 列表。PoW 出块约 15 s,哈希碰撞/网络延迟导致分叉多,用 GHOST(Greedy Heaviest Observed Subtree)选计算量最大的子树。
PoS 后出块固定 12 s / slot(某 slot 也可能空块)。块不能任意大:总 gas ≤ 块 gas 限制。目标约 15M gas,上限约 30M(目标的 2 倍);相对前块 gasLimit 每次最多变 1/1024。验证者可通过共识改 gas 限制。防止弱节点掉队,抗中心化。
PoW 块头图中还常见:ommersHash(即 unclesHash)、beneficiary(即 coinbase)、logsBloom、mixHash(与 nonce 一起证明算力)。黄皮书式字段名与实现类名可对照记。
PoS 信标块(课件):
| 字段 | 含义 |
|---|---|
slot |
本块所属时段 |
proposer_index |
提议者验证者编号 |
parent_root |
前一块哈希 |
state_root |
信标状态根 |
body |
见下表 |
body:randao_reveal(选下一提议者的随机素材)/ eth1_data(存款合约信息)/ graffiti(任意标记)/ proposer_slashings、attester_slashings(罚没名单)/ attestations(对本块的证明)/ deposits(新质押)/ voluntary_exits(自愿退出)/ sync_aggregate(服务轻客户端的子集)/ execution_payload(执行客户端交来的交易)。
execution_payload 近似执行层块头,但带交易列表与提款列表(头里对应的是 transactions_root / withdrawal_root)。字段含:parent_hash、fee_recipient(手续费收款地址,对应旧 coinbase)、state_root、receipts_root、logs_bloom、prev_randao、block_number、gas_limit、gas_used、timestamp、extra_data、base_fee_per_gas、block_hash、transactions、withdrawals。提款对象:address / amount / index / validatorIndex。
网络:主网 chainId=1(MAIN_NET);测试网课件代码写 TEST_NET=3;另有以太坊经典主网/测试网(ETC)。NONE=-1。
回执含:块号、块哈希、交易哈希、本笔 gas、本笔执行后块内累计 gas、日志(Log)。
日志是合约把链上结果送回链下的通道(EOA 交易则是链下对链上的输入)。编码者在合约里定义 Event;运行到该语句即产生虚拟机日志,写入回执。链下应用按回执/Bloom 订阅事件。
块头里三棵树的根,对应三种「现在账本长什么样」:
| 根 | 树里是什么 | 用来证明 |
|---|---|---|
| stateRoot | 全体账户(余额、nonce、代码、存储) | 「某地址当前余额是多少」 |
| txRoot(txTrieRoot) | 本块交易列表 | 「某笔交易在本块第几号」 |
| receiptRoot | 每笔交易的执行回执 | 「这笔是否成功、打出哪些日志」 |
PoW 约 15 秒一块,网络来不及同步,常出现叔叔块(uncle):合法挖出但没进主链的旁支。GHOST 选「最重子树」而不只是最长一条直链,并把 uncle 纳入奖励,减轻算力浪费、降低大矿池优势。PoS 之后出块按固定 slot,叔块机制退出主舞台。
MPT
(Merkle Patricia Trie,默克尔帕特里夏树)
因账户多属性常改,需:① 插入/改/删后快速算新根;② 深度有界防 DoS;③ 根只依赖数据、与更新顺序无关。MPT = Merkle 完整性 + 前缀树压缩路径。
▸为何比特币式「整块交易 Merkle」不够
以太坊每笔交易可能改多个账户的余额/存储;若只对交易列表做 Merkle,难以高效回答「某地址当前余额根是否一致」。MPT 把账户状态本身做成可证明的树,块头里的 stateRoot 就是这棵树的根。
| 来源 | 贡献 |
|---|---|
| Merkle | 子哈希决定父哈希;改叶子则根变;可给一条路径做存在性证明 |
| Patricia / 前缀树 | 按键的十六进制前缀压缩路径,避免「每个账户一层」、深度爆炸 |
| MPT | 二者合一:键是地址(或存储槽),叶子是账户 RLP 编码;块头只存根 |
更新某账户时,只需重算从该叶到根的一条路径上的节点,其他分支的哈希复用。所以「一笔转账改两个余额」不必重哈希全世界账户。空账户可从树中删除(净状态),根仍只取决于当前数据集合,与写入先后无关。课件图:相邻块(如 175223 → 175224)共享未改子树;仅被改账户(例:Account 175 余额 27 → 45)沿途新建节点。
MPT 节点三类(课件):扩展(压缩公共前缀)/ 分支(16 个十六进制槽 + 自身 value)/ 叶子。路径按 nibble(4 bit)走。前缀编码:0 扩展且偶长度、1 扩展且奇长度、2 叶子且偶、3 叶子且奇。世界状态根经 Keccak256 写入块头 stateRoot。
存储全景(课件):块头 stateRoot → 世界状态 trie(叶 = 账户四字段)→ 合约另挂存储 trie;transactionsRoot → 交易 trie;receiptsRoot → 回执 trie;sha3Uncles(即 unclesHash)对应叔块头列表的哈希。
共识
| 阶段 | 机制 |
|---|---|
| Eth1 | PoW;课件称 ehash,算法 Keccak256。后被 NIST 改造为 SHA-3(2015-08 批准)。SHA-3 不是 SHA-2 的替换,而是另一套全新哈希;≠ 比特币 SHA-256 |
| Eth2 / 合并后 | PoS;Gasper = Casper-FFG(类 PBFT 最终性)+ LMD-GHOST(分叉选择) |
合并(The Merge,2022-09-15):2020-12 信标链上线(空链跑 PoS);合并后执行层(交易/状态)+ 共识层(信标)合一;节点需执行客户端 + 共识客户端。合并后仍有 PoW 分叉链 ETHW。
验证者:把 32 ETH 存入存款合约,跑三件软件——执行客户端、共识客户端、验证器;入队等待激活。一人可开多个验证者。课件:全球超 80 万量级(随时间变)。激活后接收新块、重放交易、验签名,再发 attestation。作恶或懒惰可罚没(slashing)。
信标时间:
| 单位 | 时长 |
|---|---|
| slot | 12 s |
| epoch | 32 slot ≈ 6.4 min |
每 slot:随机委员会(每委员会 至少 128 validator);一人 proposer 出块,余人 attestation 投票;约 2/3 支持则该块前进。某 slot 可以没有块。创世在 slot 0。同一人可同时被抽成 proposer 和委员会成员;每个 validator 每个 epoch 只属于一个委员会。
规模(课件):通常超过 8192 个验证者 ⇒ 每个 slot 不止一个委员会;洗牌增减委员会个数,使每委员会 ≥128。验证者少于 4096 时委员会会小于 128,安全性下降。
Checkpoint:epoch 第一个 slot 的块;若该 slot 空块则取前面最近的块。一个块可以充当多个 epoch 的检查点。Casper 投票含 source(上一检查点)与 target(本 epoch 检查点)。
Attestation 接纳过程(课件):生成 → 传播 → 聚合 → 再传播 → 纳入区块(inclusion)。
LMD-GHOST(Latest Message-Driven GHOST):分叉选择只看各验证者最新一条投票(Latest Message),沿「见证权重最重」的子树走,而不是只比链长。权重 (w(G,B,M)):在视图 (G) 上,把「最新一票投给 (B) 或其后代」的验证者质押加总。算法:从创世出发,反复选子块中权重最大者;并列则比块头哈希。课件图强调:旁支可以更长但更轻,仍不入主链。Casper-FFG 在其上加最终性。
▸更长的那条不一定赢
创世之下分成两叉。左叉两块、Subtree 权重 5(多位验证者最新一票落在这侧);右叉三块、更长,但权重只有 3。LMD-GHOST 从创世每次只走「子树权重最大」的孩子,于是头在左侧。某验证者后又改投右侧:只计最新一条,旧票作废,权重立刻搬家。这与比特币「看谁链更长 / 累计难度更大」不同:这里比的是当前票仓,不是历史块数。
课件检查点例子:Epoch 1 的 source 为创世、target 在 slot 64;Epoch 3 的 source 为 slot 64、target 为 slot 180 附近的块。
▸slot / epoch / 最终性(对照记忆)
- slot(12 s):出一个块的时间格子;有人提议,委员会投票(attestation)。
- epoch(32 slot):约 6.4 分钟,检查点(checkpoint)通常取 epoch 边界。
- justified → finalized:像「二读通过」:连续两个检查点都获约 2/3 质押权重认可后,前一个检查点锁定,回滚代价极高(slash)。
- 信标链(Beacon Chain):2020-12 上线的 PoS「空链」;2022-09 合并后接管出块资格,执行层继续跑交易/EVM。
PBFT 复习(课件):Quorum (3f+1);Client + Replica;每个 view 一个 primary、其余 backup;Request → Pre-prepare → Prepare → Commit(primary 收 2f+1 后提交)。时序(同步/异步)、故障(崩溃/拜占庭)、容错(CFT/BFT)见前文「拜占庭」。
▸四台里一台叛徒,PBFT 如何收场
(n=4=3\times 1+1),最多 1 个叛徒。客户把请求交给 primary → primary 做 pre-prepare 广播「这是第 k 笔」→ 其余节点互相 prepare 投票 → primary 凑齐 2f+1=3 张赞成后 commit,全员写入同一顺序。叛徒若乱发两套编号:忠诚节点在 prepare 阶段对不上同一摘要,凑不齐 3 票,该 view 提交失败,换 primary(换 view)再来。与 Raft 的差别:这里假定有人会说谎,所以门槛是约 2/3 而不是过半。
1 | 合并前:一台程序既跑交易又挖矿(Eth1 PoW) |
时间格子:
1 | epoch(32 个 slot,约 6.4 min) |
最终性两步(Casper-FFG):检查点 A 获约 2/3 质押投票 → justified(一读);下一个检查点 B 也被 justified → A 变成 finalized(二读锁定)。想回滚 finalized 块,等于与 1/3 以上质押对赌,会被罚没。课件:一般情况下约 2 个 epoch(12.8 分钟) 变为 finalized。
▸两读:justified 还可能改,finalized 几乎不能
Epoch 1 结束,检查点 (C_1) 拿到约 2/3 票 → (C_1) justified(一读通过,头还可能在分叉上摇摆)。Epoch 2 结束,(C_2) 也 justified → 规则把 (C_1) 升为 finalized。此时再想让 (C_1) 从主链消失,必须让另一组 2/3 去投互相矛盾的检查点,触发 slash(罚没)。交易所「等两个 epoch 再给额度」即在等这一跳。
交易提交后(课件):① 密码学生成交易哈希;② 广播进待打包池;③ 验证者选入某块才算成功执行;④ 所在块再升为 justified、最终 finalized——确定性交由最终性保证;课件称改动已 finalized 块相当于代价极高的网络级攻击。
合并过程(课件):信标链先作空链跑 PoS;合并时信标接收执行客户端的交易数据、打包成块;原 Eth1 客户端关闭挖矿、块传播与共识逻辑,全部交给信标。此后不再是「两条链并行」,而是一条 PoS 以太坊。每个节点仍要两个客户端:
| 角色 | 课件要点 |
|---|---|
| 执行客户端(如 Geth) | 交易 gossip;执行/重放;验状态变更;管 state/receipt trie;组 execution payload;对外 JSON-RPC |
| 共识客户端 | 块与 attestation 的 gossip;跑分叉选择;跟踪链头;管信标状态;RANDAO 累积随机;跟踪 justified / finalized |
| 验证器 | 提议块、做 attestation;32 ETH;可 slash;计奖惩 |
二者本地用 Engine API 互连;对外各走一套 P2P(执行网传交易,共识网传块与票)。
DAO
2016-04-30 起 The DAO 在以太坊上 ICO,28 天筹约 1.5 亿美元(课件:史上最大众筹之一),持有近 15% 全网 ETH。6-12 创始人之一 Stephan Tual 宣布发现递归调用漏洞;修复期间黑客动手,6-18 转走超过 360 万 ETH 到结构相同的 child DAO。
两种提议:① 软分叉(约高度 1760000 起把与 The DAO/child DAO 相关交易判无效,不回滚历史,阻止约 27 天后提走);② 硬分叉彻底解盗并退回代币持有人。2016-07-20 高度 1920000 实施硬分叉 → Ethereum 与 Ethereum Classic(ETC)。
合并后(2022-09-15)另有一条继续挖矿的 ETHW(PoW),与走 PoS 的 ETH 不是同一回事,也不同于 2016 的 ETC。
▸代码即法律 vs 社区干预
DAO 事件说明:链上合约一旦有漏洞会被利用;是否硬分叉回滚,是技术规则与社区治理的交叉点,也是 ETC 存在的原因。
预言机
(Oracle)
合约读不到链外 API。预言机是 data feed:获取、验证、传输链下信息给合约;也可把链上结果推到链外(如付费后开智能锁)。
| 要求 | 含义 |
|---|---|
| 正确性 | 不因无效链下数据触发改状态;来源真实、传输中未被改(完整性) |
| 可用性 | 不拖延、不阻断合约执行;按请求提供数据 |
| 激励兼容 | 提供者愿提交正确信息。归因:能对应到谁提供;问责:按质量奖罚 |
结构:① 链上预言机合约——听其它合约的请求、转给节点、把返回值(可先聚合)写给调用方。② 链下预言机节点——调第三方 API,听链上事件并完成日志里的任务。
1 | 链下世界(价格、天气、比赛结果) |
| 模式 | 谁先动 | 例子 |
|---|---|---|
| 发布–订阅(publish-subscribe) | 预言机公开「数据馈送」,其它合约定期读;数据预计常变,客户端须听存储更新 | 最新 ETH-USD |
| 请求–响应(request-response) | 合约请求订阅源之外的数据。数据集太大不宜整份放进合约存储、或任一时刻只需一小片时,用此模式 | 航班、保险赔付 |
合约本身没有网卡;不经预言机就无法「if 美元汇率 then 清算」。多家独立节点聚合可降低单源作假,但不能从数学上消灭「数据源本身错了」。
▸借贷合约为什么必须问预言机
抵押贷要求「ETH 折合美元低于阈值则清算」。EVM 沙盒没有网卡,读不到交易所行情。发布–订阅预言机定时把 ETH-USD 写进链上存储,借贷合约只读该槽;价格被操纵会错杀仓位,所以常用多家节点取中位数。航班险则走请求–响应:不必把全球航班表塞进合约存储,出险时再问「这一班是否取消」。
趋势
课件末页(图):Vitalik Buterin,2023-10-23 ETH Hong Kong 主题演讲 The Future of Ethereum and its Development Roadmap(速记链到深潮)。
PoS 成就(课件图):The Merge;质押超过 2500 万 ETH;合并后稳定运行超一年;首次合并后硬分叉成功。
现场还谈(与路线图配套,技术向):① 账户抽象——可用任意 ERC-20 付 gas、一笔交易做多步;助记词方案仍不完美。② 社交恢复——朋友、另一台设备或机构作「守护者」。③ L2 扩容:有效性证明的安全与去中心化;多数排序器仍中心化;跨 L2 钱包/地址体验;数据可用性。并非一提扩容就必须上 Rollup:高安全场景(密钥、高价值资产)偏 Rollup;游戏等可先 Validium(有效性在链上、数据在链下),Blob 空间变大后再迁 Rollup。④ 三类隐私:转账、守护者、身份/声誉类应用。
结论三句(课件图):保持基础层稳健,谨慎扩展少数能力;在「对普通用户友好」与「仍保去中心化好处」之间找平衡;技术与生态同等重要。
合并后开发路线常见六段(与该演讲同名路线图;课件为图,名称与目标如下。各段并行推进,不是严格串行):
| 段 | 目标(技术) |
|---|---|
| Merge | 已完成 PoW→PoS;后续含单槽最终性(SSF)等共识加固 |
| Surge | 靠 Rollup 扩容;Proto-Danksharding / EIP-4844 引入 blob 廉价数据空间;目标跨 L2 达约 10 万+ TPS;完整 Danksharding |
| Scourge | 交易纳入的抗审查与可信中立;PBS(提议者–构建者分离);缓解 MEV 与流动性质押中心化 |
| Verge | Verkle 树(或后续证明)缩小见证、走向无状态验证,降低跑节点门槛 |
| Purge | 清理历史/状态、减协议复杂度,减轻全节点存储 |
| Splurge | 其余:账户抽象等体验与长期项 |
复习
| 主题 | 必记 |
|---|---|
| EVM | 全网共享状态机;gas 限图灵完备;Solc/ABI/JIT;气尽回滚 |
| 账户 | EOA vs 合约;Wei;nonce;四字段 |
| 交易 | 部署 to=0;调用;EIP-1559 基础费销毁;Fee≈gas×单价 |
| Gas | ADD=3;SSTORE=2e4;剩余退回;OUT OF GAS 回滚 |
| 状态 | MPT(扩展/分支/叶子);state/tx/receipt 三根 |
| 块 | PoW 头约 800B;PoS body + execution_payload;gas 15M/30M ±1/1024 |
| PoS | 32 ETH 存款合约;slot 12s;Gasper;finality ~12.8 min |
| 合并 | 2022-09;Engine API;双客户端双 P2P;ETH vs ETHW |
| DAO | 2016-07-20 高度 1920000 → ETH / ETC |
| Oracle | data feed;正确/可用/激励;订阅 vs 请求–响应(大数据集) |
| 趋势 | Merge/Surge/Scourge/Verge/Purge/Splurge;账户抽象与 L2 |
深入阅读:以太坊白皮书、技术文档。
五、Fabric
许可链、无原生币;面向企业。
定位
Hyperledger(课件:创立于 2015,约 30 家创始公司会员 + 技术与组织治理机构)由 Linux 基金会主导;跨行业开源协作(金融、银行、物联网、供应链、制造、科技)。网站:hyperledger.org。现属 LF Decentralized Trust(lfdecentralizedtrust.org)。
Fabric:许可区块链平台,带 chaincode,由 Digital Asset 与 IBM 提出。英文定义(课件):模块化架构,共识与成员服务可插拔(plug-and-play);在保隐私的同时追求可扩展性能。面向企业应用软件,不是公链,不发行加密货币。
版本:2016 V0.6 → 2017 V1.0 → 2019 V1.4 → 2020 V2.0 → 2022 V2.4 → 2023 V2.5 → 开发中 V3.0。
社区结构(课件):TSC(Technical Steering Committee)管技术与工作组;Governing Board 由会员推代表做整体决策;Linux 基金会管基金、协助社区。
设计特性:资产抽象;链码与排序分离;通道级不可变账本+查询;通道/私有数据隐私;PKI 会员;可插拔共识。
逐条对应「和比特币/以太坊差在哪」:
| 特性 | 含义 |
|---|---|
| 许可 + 无原生币 | 成员先拿证书再进网;不靠发币激励矿工,运营成本由企业承担 |
| 资产抽象 | 链码里的键值可以表示票据、积分、仓单,不限于一种币 |
| 链码与排序分离 | Peer 执行业务,Orderer 只定序,敏感逻辑不必给排序节点 |
| 通道 | 多套账本并行,竞争对手不必共享全部流水 |
| 账本查询 | 通道级不可变历史 + 类似 SQL 的查询,便于审计与争议 |
| 私有数据 | 通道内再切一刀:部分组织看明文,其余只看见哈希 |
| PKI / MSP | 用 X.509 当身份证,策略按「哪家组织」写,而不是按匿名地址 |
| 可插拔共识 | 排序算法可换(Solo → Kafka → Raft);业务层三阶段不变 |
架构
三服务之上还有 API / SDK / CLI;管理面常拆成:成员管理、账本管理、交易管理、合约管理;另有事件流把提交结果推给应用。
三服务:
| 服务 | 内容 |
|---|---|
| 成员服务 | 注册、身份、认证、审计;MSP(Membership Service Provider)+ Fabric CA / 第三方 CA |
| 区块链服务 | 共识、分布式账本、P2P(gRPC + Gossip) |
| 链码服务 | 安全容器中跑合约 |
身份:Principal 封装在 X.509 证书中。MSP 配置:信任根、中间 CA、管理员证、OU、CRL、TLS 根等。
公链用地址/算力认人;Fabric 是许可链:先有证书才有身份,先有 MSP 才谈得上「哪家组织的 Peer」。成员服务整条链是 PKI → Fabric CA 发证 → MSP 认证 → 通道策略用证。课件:MSP 把发证、验证书、用户授权背后的密码学机制抽象出来,并可定义身份概念以及管理(身份验证)与认证(签名生成/验证)规则。
组织拥有应用与 Peer;通道受 Channel Policy 约束,策略里列出各组织 MSP;MSP 选定该组织的 CA。身份(Principal)绑定到证书。
CA
(Fabric CA,证书颁发机构)
负责给联盟里的人、Peer、Orderer 签发、续期、撤销 X.509 证书。可用 Fabric 自带的 fabric-ca-server,也可用企业已有 CA;考试默认指前者。提供 客户端与 SDK 两种交互方式。每个 Fabric CA 有根 CA 或中间 CA;为保证安全,中间 CA 可集群。常见拆成两套:组织身份 CA + TLS CA(通信证书与身份证书分开,一台失陷不连带另一套)。
| 动作 | 谁做 | 结果 |
|---|---|---|
| init / 启动 | 运维 | 引导管理员(bootstrap admin)写入 CA 库;服务默认 REST(如 7054) |
| register(注册) | 已有登记权限的管理员 | 在 CA 库登记 enrollment ID、类型(client/peer/orderer/admin)、隶属(affiliation)、属性;得到 secret |
| enroll(登记/领取) | 该身份持有者 | 用 ID+secret 向 CA 证明,取回 ECert(登记证书)+ 私钥;此后交易、gRPC 都用这对密钥 |
| reenroll | 持证者 | 证书将过期时换新证,身份 ID 不变 |
| revoke + 出 CRL | 管理员 | 吊销后生成 CRL(Certificate Revocation List);MSP / 通道配置更新后,他节点拒收该证 |
1 | Org1 管理员(已有 CA 证书) |
证书类型直觉:
| 证 | 用途 |
|---|---|
| ECert | 长期身份;提案、背书、管理操作的签名 |
| TLS 证 | 节点之间、Client↔Peer/Orderer 的加密通道 |
| 中间 CA 证 | 根 CA 只给各组织签发中间 CA;日常用户/Peer 由组织中间 CA 签发,便于撤销范围可控 |
CA 库可 SQLite / PostgreSQL 等;生产常配 HSM 护根私钥。属性例:hf.Registrar.Roles(能否再注册他人)、hf.Revoker、hf.IntermediateCA、hf.GenCRL。身份还有 affiliation(如 org1.department1),映射到证书 OU,供策略按部门细分。
▸注册 ≠ 上链
register 只写 CA 自己的数据库,链上还没有这个人。enroll 之后,证书必须被放进某节点的 MSP(以及通道配置里的组织 MSP),Peer/Orderer 验签时才会认。吊销同理:只 revoke、不更新 CRL/通道配置,其他节点仍可能接受旧证。
▸新员工进联盟
- Org1 管理员向 Org1 的 Fabric CA register 类型
client。 - 员工 enroll 拿到 ECert。
- 应用用该证经 Gateway 向 Peer 提交交易;Peer 用通道 MSP 验「这是 Org1 的 client」。
- 离职:revoke → 发 CRL → 通道配置更新,旧证签名的提案被拒。
MSP
(Membership Service Provider,成员服务提供者)
不发证,只回答:「这张 X.509 是不是本组织的人、他是 admin 还是 peer」。发证是 CA 的事;MSP 是验票规则包。每个组织一个 MSP ID(如 Org1MSP)。
| 种类 | 放哪 | 干什么 |
|---|---|---|
| Local MSP | 每个 Peer / Orderer / 客户端本地目录 | 本节点「我是谁」、本组织信任根 |
| Channel MSP | 通道创世块 / 配置交易 | 本通道承认哪些组织、用哪套根 CA 验背书和管理签名 |
本地目录(课件常列这些项):
| 路径/项 | 含义 |
|---|---|
cacerts/ |
信任根 CA |
intermediatecerts/ |
中间 CA |
signcerts/ + keystore/ |
本身份的 ECert 与私钥 |
admincerts/ |
旧版管理员证;现多用 NodeOU |
tlscacerts/ |
TLS 信任根 |
crls/ |
吊销列表 |
config.yaml |
NodeOU:Client / Peer / Admin / Orderer 四种角色由证书 OU 区分 |
策略里写的 Org1.peer、Org1.admin 即 MSP ID + NodeOU。背书策略、生命周期策略、通道改配置,验的都是 MSP 认定的组织角色,而不是「某个 IP」。
课件列 MSP 配置清单(与上表对应):① 自签 CA 证书组成信任根;② 中间 CA 证书(可选,须由某信任根颁发);③ 从信任根可验证路径的管理员证书(持有者有权申请改 MSP 配置,如换根/中间 CA);④ 有效成员 X.509 中应出现的 OU 列表(可选;多家组织共用同一套 CA 时用 OU 区分);⑤ 各(根/中间)CA 对应的 CRL(可选);⑥ TLS 信任根;⑦ TLS 中间证书(可选)。
| Fabric CA | MSP | |
|---|---|---|
| 角色 | 发证、续期、吊销 | 认证、映射组织与角色 |
| 数据 | CA 数据库 + 签发的证书 | 一组 PEM 证书与 CRL、OU 规则 |
| 类比 | 派出所办身份证 | 门卫核对身份证真伪和部门 |
排序共识曾支持 Solo / Kafka / Raft(及演进中的 BFT 选项);Solo 单点;Kafka/Raft 属 CFT 向。
| Solo | Kafka | Raft(现默认) | |
|---|---|---|---|
| 节点 | 一台 Orderer;只支持单链单通道 | Kafka 集群 + ZooKeeper;多通道分区 | 一组 Orderer(etcd/raft);每通道独立 Raft |
| 容错 | 无;挂了就停 | CFT(崩溃) | CFT(崩溃 / 分区) |
| 用途 | 开发演示 | 1.x 生产,已弃用 | 1.4.1 起生产路径;2.x 主推 |
| 拜占庭 | 否 | 否 | 否;恶意排序需另上 BFT(课件:SmartBFT,受 BFT-SMART 启发,可视为 PBFT 的非流水线版本) |
容错对照(课件):
| BFT | CFT | |
|---|---|---|
| 出错类型 | 崩溃 + 恶意 | 仅崩溃 |
| 规模 | 总数 (3n+1),出错不超过 (n) | 总数 (2n+1),出错不超过 (n) |
| 算法例 | PBFT、Hotstuff;排序侧 SmartBFT | Raft、Kafka |
账本 = 世界状态(最新键值,LevelDB/CouchDB)+ 交易日志(区块链历史)。二者都表示与业务对象有关的事实:世界状态可创建/更新/删除、频繁变;区块链一旦写入不可改,用来理解「当前值是怎么来的」。
课件账本例(汽车):世界状态里 CAR0…CAR3 为 JSON(颜色、品牌、车型、车主)+ version(图中均为 0);区块链侧 Block 0 为创世,Block 1 含交易 T1–T4。
▸LevelDB vs CouchDB
二者都存世界状态:LevelDB 默认、键值简单(Google 嵌入式 KV);CouchDB 面向文档(Apache),便于富查询(JSON 属性、类似 SQL)。区块链日志本身仍是追加写的块链;世界状态是「当前快照」,可改。块数据用文件系统存。
区块三部分(课件):
| 部分 | 内容 |
|---|---|
| 块头 | ① 编号(创世为 0,每新块 +1);② 当前块数据(交易)的哈希;③ 前一块头的哈希 |
| 块数据 | 有序交易列表;由排序服务创建块时写入 |
| 块元数据 | 写入时间;写入者的证书、公钥、签名。随后提交者给每笔交易打 有效/无效 标记;该标记与块同时产生,不计入块哈希 |
相对比特币 80 字节头:Fabric 头更短、职责不同——不挖矿、无 Merkle 根字段在课件这三栏里;有效性标记故意不进哈希,避免提交阶段改标记导致块哈希变化。
节点
| 角色 | 职责 |
|---|---|
| Client | 最终用户/应用;至少连一个 Peer 或一个 Orderer;一般只保存与自己有关的账户数据 |
| Orderer | 排序打包出块,不执行链码业务逻辑 |
| Peer | 都是 Committer;维护账本副本 |
| Endorser | 动态角色:按背书策略执行链码并签名;策略在实例化时指定 |
通道(Channel):多条子链隔离,隐私与权限边界。同一物理网络上可有多条通道;账本、链码、成员集合按通道分开——A、B 的通道 1 里的交易,组织 C 若未加入则既无账本也看不见明文。一个 Peer 至少加入一条通道,也可加入多条,各通道状态隔离。
课件组网顺序(符号:N 网络 / C 通道 / P Peer / S 链码 / L 账本 / A 应用 / O Orderer / R 组织身份根):先写通道配置 CC1(纳入各组织 CA 对应的身份根 R0、R1、R2)→ 通道中加入 P1、P2、O → 安装部署链码 S5 → 客户端 A1、A2 接入 → 再增加配置 CC2 形成两通道网络 → 某 Peer(如 P3)可同时加入两条通道。多个组织聚在一条通道上调链码,权限由建通道时商定的策略决定。
| 说明 | |
|---|---|
| 创世 | 通道配置块写明:Orderer 组织、Application 组织及其 Channel MSP、策略 |
| 加入 | Peer join 某通道后才拉该通道的账本;一个 Peer 可加入多通道,各通道状态隔离 |
| 隐私加强 | 私有数据集合(Private Data):授权组织用 Gossip 传明文,链上只留哈希,供对账 |
| 与 CA 关系 | 通道不办证;只把各组织 MSP(根 CA 等)写进配置,用这些根验该通道上的签名 |
Peer 还可兼:
| 角色 | 含义 |
|---|---|
| 主节点(Leader / 组织内) | 组织内多 Peer 时,负责从 Orderer 把块分发给同组织其他 Committer |
| 锚节点(Anchor Peer) | 跨组织通信的「门口」:本组织 Peer 可通过对方通道配置里的锚节点找到对方组织 Peer;一组织可有 0 或多个锚节点 |
▸Orderer 为什么不跑业务链码
Fabric 把「算业务结果」和「定全局顺序」拆开:Endorser 先按策略模拟执行出读写集并签名;Orderer 只负责把已背书交易排成全序出块;Committer 再校验背书与读写集冲突。这样排序服务更简单,也避免把敏感业务逻辑暴露给所有排序节点。
链码
一个链码可含多个智能合约;背书策略适用于其中全部合约:指定哪些组织签名后交易才有效——与公链「任一矿工/验证者打包即有效」不同,更贴近现实多方签字。
Fabric 没有 EVM,用 Docker 容器在宿主机上跑链码,因此可用宿主机能编译执行的多种语言。链码图灵完备;为防死循环设计时器,超时杀进程(对比以太坊用 gas)。
合约主要对世界状态做 get / put / delete,也可查不可篡改的交易历史。get 多为查询当前对象;put 新建或改业务对象;delete 只从当前世界状态移除,不从历史里抹掉。
课件汽车合约例:query 只 get;transfer 先 get 再改 owner 再 put;update 改属性再 put。卖方 ORG1、买方 ORG2 调同一份 car contract;背书策略可为 ORG1 AND ORG2。验证举例:交易 t3 两边都签、过账打勾;t4 打叉仍留在历史,世界状态只反映有效交易(如 CAR1.owner=ORG2)。
执行时不立刻改世界状态,只产生读写集;验证通过后才提交。验证两阶段:① 背书策略;② 读集版本未变(防并发写冲突)。有效/无效交易都可进历史,仅有效更新世界状态。
链码生命周期(Fabric 2.x):
| 步 | 谁做 | 要点 |
|---|---|---|
| 打包 | 一组织或每组织 | 打成 tar(Node Fabric SDK 或 GNU tar 等)。建议只打一次,本组织各 Peer 装同一包 |
| 安装 | 将背书或查询的组织;Peer 管理员 | 每个要执行该链码的 Peer 上都装;失败返回错误 |
| 批准定义 | 每个要用链码的组织;Peer 管理员发起 | 提交给排序服务再分发给各 Peer。一组织多 Peer 也只需批准一次。批准结果存组织集合,供该组织所有 Peer 用 |
| 提交定义到通道 | 满足生命周期策略后由一组织提交 | 先向已批准组织中足够多的 Peer 收集背书,再提交。默认策略为多数组织批准 |
链码定义是结构,含名称、版本、背书策略等运行参数。足够组织批准同一份定义后才能提交到通道;之后通道成员按该定义里的背书策略执行合约。
▸读写集像「先试算再过账」
背书阶段:链码读 keyA=10、写 keyA=7 → 产出读集(版本号)与写集,此时世界状态仍是 10。提交阶段:若读集里的版本仍等于当前账本,才应用写集变成 7;若别人已先改过 keyA,版本对不上 → 交易标无效(仍可留在历史里备查)。这类似数据库乐观并发控制(课件常称读集版本检查 / MVCC 思想)。
| 项 | 含义 |
|---|---|
| 背书策略 | 哪些组织的 Peer 签名后,这笔调用才算「业务上有效」。例:AND('Org1MSP.peer','Org2MSP.peer') 表示两家都要签;OR(...) / OutOf(2, ...) 为或、满 k 家 |
| 读写集 | 模拟执行时读过的键+版本、要写的键+新值;此时不改世界状态 |
| 生命周期 | Fabric 2.x:打包 → 各 Peer install → 各组织 approve 定义 → commit 到通道(默认多数组织批准)。与「谁能调合约」的背书策略分开:先就「用哪份链码」达成组织同意,再谈每笔交易的背书 |
策略验的是 MSP 角色(哪家组织的 peer),因此 CA 发错类型、MSP 未包含该组织,背书再多也不生效。
▸少一家签名就过不了账
汽车过户链码背书策略 AND('Org1MSP.peer','Org2MSP.peer')。卖方 Org1 的 Peer 模拟执行并签名,买方 Org2 没签。信封仍可被 Orderer 打进块(排序不看业务),但各 Committer 验策略失败 → 交易打「无效」:历史里看得到,世界状态里车主不变。这与公链「任一验证者打包即有效」相反:缺的是指定组织的签字,不是算力。
共识与流程
共识 = 对「一块交易的正确性」闭环:提案背书 → 排序 → 验证提交。确定性共识,设计上不分叉。课件强调:共识不只是「顺序一致」,而是组成区块的一组交易在策略检查下顺序与结果都正确。相对公链常见的 Order-Execute,Fabric 是 Execute–Order–Validate(先背书执行,再排序,再验证提交)。
运行时(课件图):应用客户端(SDK,图中 Node.js)持密钥 → 向成员服务 CA 认证 → 向 Peer 的 Endorser 发提案 → 把已背书交易交给排序服务(Solo / Kafka / Raft / BFT)→ Orderer 把块 deliver 给 Committer → 写入 Ledger,Event 通知应用。
拆开读:比特币用算力抢「谁有权写下一页」;Fabric 把这件事拆成三步,且每步由不同角色做——
- 业务上「这笔该不该发生」→ 指定组织的 Endorser 跑链码并签名(背书策略)。
- 全通道「先发生哪笔」→ Orderer + Raft 给出唯一顺序。
- 账本「能不能过账」→ 全体 Committer 再验签名和读集版本。
三步都通过才改世界状态;排序时不跑业务,所以不会因为执行不确定而分叉。
交易三阶段(课件,经 Gateway):
- 提案与背书:客户端 A1 经所连 Peer 上的 gateway 提交已签名提案。背书组织选择可委托给网关,也可由应用显式指定。网关选 P1 或同组织其他 Peer 执行指定链码,生成含读写集的提案响应并签名返回;再按背书策略对每个所需组织重复执行。网关凑齐签名后组事务信封,交客户端 SDK 再签。
- 发送与排序:SDK 把已签信封交给网关,网关转发 Orderer 并回成功。Orderer 验签名后排序,与其它交易打成块,分发给通道节点。到达排序节点的已授权交易被机械打包,Orderer 不判断交易内容、不跑链码。
- 验证与提交:每个 Peer 核对信封上的客户签名是否与原始提案一致;核对各背书的读写集与状态响应是否等价(背书匹配)以及是否满足背书策略;逐笔标有效/无效。再把有序块提交到通道账本(不可变写入)。世界状态实质是全部有效交易的总和,只用有效结果更新。每个提交 Peer 向客户端发 commit 事件(含账本更新证明)。
并非每个 Peer 都直连 Orderer;可用 Gossip 把块关联到其他节点。
交易结构字段(课件 H4 / S4 / P4 / R4 / E4):
| 字段 | 含义 |
|---|---|
| 头 H | 元数据,如链码名与版本 |
| 签名 S | 客户端用私钥签,防篡改 |
| 提案 P | 编码应用交给合约的输入;与当前世界状态一起决定新状态 |
| 响应 R | 读写集:世界状态之前与之后的值;验证成功才应用到账本 |
| 背书 E | 策略规定组织对响应的签名集合,数量须满足策略 |
1 | Client(持 ECert,MSP=Org1) |
Orderer 无业务链码私钥、也不在成员服务里充当「业务审批人」;身份仍由 Orderer 组织的 CA/MSP 管(排序节点自己的 ECert/TLS),与 Application 组织的 CA 分开部署是常见做法。
Raft
(2014,Ongaro & Ousterhout;Fabric 用 etcd 的实现)
排序阶段的默认算法。任务只有一件:让多家 Orderer 对「交易先后顺序」达成一致并出块。不管业务对不对——那是背书策略和 Committer 的事。课件:Raft 管理复制日志(Replicated Log),日志是复制状态机(RSM)的组成部分。(2n+1) 个节点最多 (n) 个崩溃(与前文 (2f+1) 同义)。
每个通道跑独立的 Raft 实例:N 条通道 ⇒ N 个 Raft 集群,各有自己的主导 Orderer。
先把图和文字对上:若干 Orderer 组成排序服务;同一时刻只有一个 Leader 接收并编号交易,其余为 Follower 复制同一条日志。复制成功(过半写入)后,Leader 把这批交易切成区块,交给各组织 Peer 去校验、过账。图中的箭头即「Leader → 复制日志 → 出块 → Peer」。
角色三种,任一时刻至多一个 Leader:
| 角色 | 做什么 |
|---|---|
| Leader | 收交易、写日志、切块;心跳维持任期。不可重写自身日志 |
| Follower | 复制 Leader 的日志;超时没心跳则发起选举。日志可被 Leader 重写 |
| Candidate | 拉票;得多数(quorum)则当选新 Leader。若发现已选出主导则退回 Follower |
任期(Term)单调递增整数,标识主导的管理周期;每个任期从选举开始直到下一任期。Candidate 发现已有 Leader、或 Leader 发现另一 Leader 的 Term 更高,都退回 Follower。
复制状态机流程(课件):① 客户端把含命令的请求发给 Leader;② Leader 追加本地日志并发给 Follower,Follower 追加后确认;③ Leader 收到大部分确认后把日志提交给自己的状态机,Follower 随后同样提交;④ Leader 向客户端返回结果。
Fabric 排序节点工作流(课件):① 交易自动路由到通道当前主导 Orderer;② 主导验交易后送入区块切割模块,建候选块;③ 新块应用到本地 Raft FSM;④ FSM 复制到足够多 Orderer 以便提交;⑤ 区块写入接收节点本地账本。
任期(term)单调增加。日志项必须复制到过半数节点并提交后,才能作为区块交付给 Peer——所以 (2f+1) 台 Orderer 可扛 (f) 台崩溃(例如 3 台允许挂 1 台)。分区时少数派不能提交,避免两套顺序。
完整一拍(与图对应):
- Client 把已背书信封交给任一 Orderer;非 Leader 会转给当前 Leader。
- Leader 把交易追加进本地 Raft 日志(还不是区块)。
- Leader 把新日志项发给 Follower;Follower 写入自己的磁盘后应答。
- 应答达到多数 → 该日志项 committed。Leader 按批切成区块,通过 gRPC/Gossip 交给 Peer。
- 心跳:Leader 定期空发「我还在」;Follower 超时未收到,才把任期加一、自己变成 Candidate 拉票。
与 Peer 组织内的「主节点」不是同一人:后者只是从 Orderer 拉块再分给本组织其他 Committer;Raft Leader 才是排序集群里真正追加日志的那一台。
▸Raft 是 CFT,不是 BFT
假设节点会宕机、会丢包,但不会故意签假日志、乱序审查。许可链把 Orderer 交给已知组织,用 MSP 证书约束身份。若排序节点可能作恶,Raft 不够,需 PBFT 类协议。公链不用 Raft:节点集开放、身份未知,与「固定一小撮 Orderer」前提不合。
▸Leader 挂了
3 台 Orderer。Leader 超时无心跳 → Follower 变 Candidate 拉票 → 另 1 票加上自己共 2/3 → 新 Leader 继续在已提交日志之后出块。未复制到多数的那几笔未提交交易作废,Client 重发即可。通道配置里的 consenter set 列出哪些 Orderer 有投票权;未列入的节点不能参选。课件选举图:Candidate 先投自己,向其余节点发 RequestVote;多数 Voted 后当选。已有 Leader 用 AppendEntries(currentTerm, log) 解决任期冲突:若己方 Term 更高则保持主导并丢弃对方请求,否则退回 Follower。
趋势
课件用多页图给出 Hyperledger 项目版图(技术向;人物与口号从略)。时间线:
| 年 | 进入生态的项目(课件图) |
|---|---|
| 2015 | Hyperledger 启动 |
| 2016 | Fabric、Sawtooth、Iroha、Explorer |
| 2017 | Cello、Indy |
| 2018 | Ursa、Caliper |
| 2019 | Aries、Besu、Labs |
| 2020 | Cacti(课件亦写 Cactus;互操作,Quilt 相关合流) |
| 2021 | Bevel、Firefly |
| 2022 | Solang、AnonCreds |
| 2023 | 版图继续(课件环绕:Besu、Cacti、Aries、Fabric、Indy、Sawtooth、Firefly、Iroha) |
2024 Graduated(课件):
| 项目 | 定位 |
|---|---|
| Aries | 可验证凭证与点对点交互工具包;密码学可依托 Ursa |
| Besu | 企业以太坊客户端;可抽 EVM;共识含 PoS / PoW / PoA(IBFT 2.0、QBFT、Clique);许可方案面向联盟 |
| Cacti | 跨链集成与互操作 |
| Fabric | 模块化许可链;共识与成员服务可插拔 |
| Firefly | 企业多方数据流中间件:夹在底层链与业务/UI 之间 |
| Indy | 去中心化数字身份,跨域互操作 |
| Iroha | 偏基础设施/物联网的简洁 DLT;C++;共识 YAC(CFT) |
2024 Incubation(课件):
| 项目 | 定位 |
|---|---|
| AnonCreds | 匿名可验证凭证格式;账本无关;ZKP 增强隐私 |
| Bevel | 快速部署生产级 DLT 网络的加速器 |
| Caliper | 性能基准;支持 Besu、Fabric、以太坊、Iroha、Sawtooth 等 |
| Cello | 运维控制台,便于 BaaS |
| Identus | SSI:DID + 可验证凭证 |
| Solang | Rust 写的 Solidity 编译器,LLVM 后端;目标 Solana / Substrate |
| Web3j | Java/Android 库,连以太坊合约与节点 |
趋势要点:企业许可链(Fabric)之外,身份(Indy/Aries/AnonCreds)、以太坊兼容(Besu/Solang/Web3j)、跨链(Cacti)、部署与基准(Bevel/Cello/Caliper)、多方中间件(Firefly)并行。课件 2021 图曾用框突出 Besu、Indy、Cactus、Firefly。
复习
| 主题 | 必记 |
|---|---|
| 定位 | 许可企业链;无原生币;共识/MSP 可插拔 |
| MSP/CA | X.509;信任根/中间 CA/OU/CRL/TLS;Principal |
| 通道 | 隔离账本与隐私;配置含各组织身份根;Peer 可加多通道 |
| 角色 | Client / Orderer / Peer(Endorser 动态 + Committer) |
| 链码 | Docker + 计时器;get/put/delete;生命周期 tar→install→approve→commit |
| 背书 | 组织签名策略;先模拟出 RW-set 再提交 |
| 交易 | Execute–Order–Validate;Gateway;H/S/P/R/E;有效标记不进块哈希 |
| 共识 | Solo/Kafka/Raft;每通道独立 Raft;SmartBFT |
| 账本 | 世界状态 + 区块链;头=编号/数据哈希/前头哈希 |
| 趋势 | Fabric 外还有 Besu/Indy/Aries/Cacti/Firefly 等 |
深入阅读:Hyperledger Fabric key concepts。
六、白皮书
参考:Satoshi Nakamoto《Bitcoin: A Peer-to-Peer Electronic Cash System》(2008)及中译本。与课件「# 二、原理」交叉阅读:课件偏实现细节(块头字段、难度窗口、脚本),白皮书偏问题定义与证明直觉。
问题
完全点对点的电子货币:一方直接付给另一方,无需金融机构。数字签名解决「谁授权转出」,但若仍靠可信第三方防双重支付,则失去去中心化优点。
目标:用 P2P 网络给交易打时间戳,形成除非重做 PoW 否则不可改的哈希链;最长链既是事件顺序证据,也是「最大 CPU 算力池」证据。诚实多数算力 → 诚实链最长。
▸与课件的对应
课件「假币 → 签名;双花 → 分布式账本 + 共识」即论文摘要的压缩版。论文把「共识」具体写成:公开广播全部交易 + 对「谁先到」达成单一历史。
| 维度 | 铸币厂模型 | P2P / 签名链 |
|---|---|---|
| 防双花靠谁 | 每笔币退回铸币厂重铸,厂方查是否已花 | 全网公开交易,对「谁先到」形成单一历史 |
| 信任 | 必须信任中心机构不滥发、不拒兑、不宕机 | 不信任单一方;诚实算力过半则最长链可信 |
| 所有权证明 | 厂方账本说了算 | 数字签名链:上家把「前一笔 + 下家公钥」的哈希签上 |
| 收款人怎么验 | 问铸币厂「这枚还有效吗」 | 验签可知来源;是否双花要看是否已入最长链 |
| 隐私 / 单点 | 厂方看见全部流水,可冻结 | 公钥假名;无单点关停(代价是吞吐与最终性是概率的) |
| 论文态度 | 仍是中介,去中心化失败 | 用时间戳链 + PoW 代替铸币厂 |
1 | 铸币厂: 付款人 → 退币给厂 → 厂重发给收款人 |
交易
电子货币 = 数字签名链:拥有者把「上一笔交易 + 下家公钥」的哈希签名接到末尾;收款人验签即可知所有权。
缺口:收款人无法确认该币是否已被双花。铸币厂模型每笔退回重铸 → 仍是中心。论文要求:所有交易公开;参与者对收到顺序的单一历史达成共识;收款人需要「多数节点认同此交易最先」的证据。
多输入多输出:合并/拆分金额;常见两输出(支付 + 找零)。扇出依赖不要求保存完整独立历史副本(与 UTXO/Merkle 剪枝一致)。
时间戳
时间戳服务器:对一批待标记数据算块哈希并广泛发布(类比登报)。哈希纳入上一时间戳 → 链。证明:能算出该哈希时,数据必已存在。
1 | T1 = Hash(一批交易) |
登报 / 邮件列表发布的是哈希,不是全文:证明「此刻这批数据已经存在」,后人无法把过去的内容换成另一批还保持后续哈希不断。P2P 里没有一份全球报纸,于是用 PoW 代替「登报」:算出合格哈希本身就是昂贵的时间戳。
工作量证明
P2P 时间戳不能靠报纸,改用 Hashcash 式 PoW:找 Nonce,使块哈希(如 SHA-256)满足若干前导 0;工作量指数增、验证一次哈希即可。
改历史 = 重做该块及之后全部 PoW。多数决定按 CPU 投票(非 IP 投票,防女巫)。难度用移动平均调节出块速率。
▸与比特币实现
课件:约 10 分钟一块;约每 2016 块调难度。论文只写「移动平均、过快则加难」——实现细节见「# 二、原理」。
网络
六步:① 广播新交易 → ② 节点收入候选块 → ③ 找 PoW → ④ 广播新块 → ⑤ 仅当交易有效且未双花时接受 → ⑥ 在其上继续挖下一块表示接受。
分叉:同时收到不同下一块时先跟先到的,并保留另一分支;下一块出来后切到更长链。交易/块广播尽力而为,可丢包后补。
激励
块内第一笔为创币交易(Coinbase 思想):新币归出块者——既激励节点,也解决无央行时的初始分发(类比挖矿耗电换黄金)。另可收交易费(输入和 − 输出和);预定总量发完后激励可纯靠手续费。
博弈:攻击者若算力过半,与其双花破坏系统贬值自有币,不如遵规挖新币更有利(论文的激励相容叙述)。
磁盘与 SPV
旧交易可剪枝:交易进 Merkle 树,块头只留根;剪枝不改块哈希。论文估算:仅块头约 80 B × 每年块数 ≈ 数 MB 级(2008 语境)。
简化支付验证(SPV):只存最长链的块头,向全节点要 Merkle 分支,证明交易已入某块且后续有确认。诚实多数时可靠;算力被攻时轻客户端脆弱——对策含监听无效块警告、重要商户自跑全节点。
全节点磁盘:块头 + 全部交易。老交易花完后,叶子可以丢掉,只留通向 Merkle 根的内部节点——剪枝。块头里的根不变,所以块哈希不变,链不断。
SPV 更狠,连叶子和内部节点都不存:
1 | SPV 本地: 块头0—块头1—...—块头N (每头 80 B) |
诚实算力占优时,伪造一条带假 Merkle 根的头链成本等于重挖。算力被攻时,SPV 可能被骗「一笔其实没上主链的交易」;对策是听全节点的无效块警报,或重要商户自己跑全节点。
隐私
交易必须公开 → 不能靠「对公众隐藏流水」。模型改为:公钥匿名;公众见金额流动,难绑定真人。额外:尽量每笔新密钥对;多输入交易仍会暴露「同属一人」的关联风险。
计算
攻击者不能凭空造币或花别人的币(无效交易不被诚实节点接受);只能试图改自己已花出的交易(双花)。
诚实链 vs 攻击链 = 二项随机漫步;追上概率类赌徒破产。若诚实出块概率 (p > q)(攻击者),落后 (z) 块后追上概率随 (z) 指数下降。
实务:收款人等交易入块后再等 (z) 个确认;攻击者进度近似泊松。论文给出数值例:如 (q=0.1) 时 (z=5) 已使成功概率 (<0.1%) 量级;(q) 越大所需 (z) 越大(表见原文)。
▸「六次确认」从哪来
并非魔法常数,而是「在假设攻击者算力占比不太夸张时,(z) 取数个可使双花概率可忽略」的工程习惯;论文用公式与表说明指数衰减。
攻击者不能凭空给自己铸币(诚实节点不收非法交易),只能试图让「自己已经花掉的那笔」所在短叉反超主链。每出一个块:诚实方以概率 (p) 领先 +1,攻击者以 (q=1-p) 追上 1 步——这就是随机漫步 / 赌徒破产。
1 | 诚实链 ■■■■■■ 已确认 z 块 |
论文数值((q=0.1),攻击者占 10% 算力;(z) 为收款方多等的确认数):
| (z) | 攻击者仍能追上的近似概率 |
|---|---|
| 0 | 1 |
| 1 | 0.20 |
| 2 | 0.05 |
| 3 | 0.013 |
| 4 | 0.0035 |
| 5 | 0.0009 |
| 6 | 0.00024 |
(q=0.1) 时等 6 个确认,成功双花已到万分之几。(q) 更大则同样 (z) 不够,金额越大应增大 (z)。
总结
| 论文章节 | 一句话 | 笔记对照 |
|---|---|---|
| 交易 | 签名链 + 需公开历史防双花 | UTXO / 签名 |
| 时间戳 | 哈希链证明存在时刻 | 块头 prev 链接 |
| PoW | CPU 投票、改史要重算 | 挖矿 / 难度 |
| 网络 | 广播、最长链、分叉切换 | P2P |
| 激励 | 新币 + 手续费 | Coinbase |
| 剪枝 / SPV | Merkle;轻客户端验路径 | Merkle / SPV |
| 隐私 | 公钥匿名非流水保密 | 地址 |
| 计算 | 落后 (z) 块追上指数难 | 确认数 |
规则与激励都可通过「在有效块上继续 PoW、拒绝无效块」这一共识加强——即后续课程里「账本 + 共识 + 激励」三件套的原点。
复习总表
开卷速查:先认清「货币信用问题 → 密码学工具 → 谁来记账」,再按链选型填细节。
| 层级 | 比特币 | 以太坊 | Fabric |
|---|---|---|---|
| 参与 | 无许可公链 | 无许可公链 | 许可企业链 |
| 状态 | UTXO | 账户 + MPT | 世界状态 KV + 日志 |
| 执行 | 脚本(非图灵完备为主) | EVM + gas | 链码(容器) |
| 共识 | PoW(最重/最长链) | PoS Gasper | 背书 + 排序 + 验证(Execute–Order–Validate) |
| 身份 | 地址/公钥 | 地址 | MSP / X.509 |
| 隐私 | 假名 | 假名(主网) | 通道 / 私有数据 |
| 原生币 | BTC | ETH | 无 |
▸三条逻辑链
- 比特币:公开交易历史 + PoW 时间戳 → 概率最终性(确认数)。
- 以太坊:共享 EVM 状态 → 可编程;PoS 检查点 → 经济最终性。
- Fabric:已知身份背书 → Orderer 定序 → Peer 校验读写集 → 设计上不分叉。


