开卷可带一张 A4。课件:杨小虎《区块链与数字货币》2025;教材参考毛德操、杨小虎《区块链教程》(浙大出版社,2021)、毛德操《区块链技术》(2019)。另对照中本聪白皮书《Bitcoin: A Peer-to-Peer Electronic Cash System》(2008)及中译本。


脉络

全课一条主线:货币要可信 → 密码学给工具 → 链式账本防篡改 → 共识解决「谁记账」→ 比特币落地 → 以太坊/合约可编程 → Fabric 许可链 → 趋势

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
货币 / 信用 / SWIFT / 加密货币 / 稳定币 / CBDC


【密码学底座】Hash(SHA-256)· 非对称 · 数字签名


【账本】链式区块 + Merkle 树 → 不可篡改、可快速证明


【共识】拜占庭问题 · PoW / PoS / PBFT / Raft


【比特币】UTXO · 挖矿 · SPV · 脚本 · 支付通道 / 闪电网络


【以太坊】账户 · EVM · Gas · PoS/Gasper · 预言机


【Fabric】许可 · MSP · 通道 · 背书 → 排序 → 提交


【白皮书对照】时间戳链 · PoW 投票 · SPV · 指数衰减攻击概率
课件 / 文献 内容重心 笔记章节
课程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 无国界流转,亦用于跨境支付与贸易结算。例:USDTUSDC


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 只能被一笔有效交易引用一次;冲突时靠共识选一条历史。

账本

流程:

  1. 交易向全网广播。
  2. 记账节点对记账权达成共识,胜出者发布区块。
  3. 完整账本存于(理想上)每个全节点。
  4. 各节点独立验证合法性与完整性。

两大核心:

  1. 链式区块组织数据 → 篡改代价极高。
  2. 分布式可信记账(共识)。
链为什么难改

每个块头含父块哈希。改历史某一块,其后所有块的「父哈希」全对不上,等于要重挖整条后缀,算力不够就追不上主链。

宏观:块与块用哈希链接;链越长、其上累计工作量越大,可信度越高。


区块

每个区块 = 区块头(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)。验证方只需算一次哈希并比对难度,所以「难挖、易验」。


标识

(课件「区块标识符:区块头哈希值和区块高度」)

两种标识:

  1. 区块头哈希值(主标识):对区块头做双重 SHA-256 得到的密码学哈希,即该块的「数字指纹」。创世块例:000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f。该哈希并不包含在区块的内部数据结构中(不是块头六字段之一)。
  2. 区块高度(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class CBlockHeader {
// 区块头:类 / 数据结构,内含下列字段(合计 80 字节)

int32_t nVersion;
// 所采用 Bitcoin 协议的版本号,用于跟踪软件/协议更新

uint256 hashPrevBlock;
// 上一个块的(块头)Hash 值;链上用它引用父块

uint256 hashMerkleRoot;
// 本块所记载交易的 TxID(即各交易 Hash)构成 Merkle 树后的根

uint32_t nTime;
// 本块的发布时间(精确到秒的 Unix 时间戳)

uint32_t nBits;
// 为挖矿过程设置的难度;课件表述为 Hash 值中须有的前导零位数
// (协议里是难度目标的紧凑编码)

uint32_t nNonce;
// 挖矿过程中使 Hash 达到 nBits 所要求前导零位数的试凑值
};

class CBlock : public CBlockHeader {
// 整块 = 块头 + 交易列表

std::vector<CTransactionRef> vtx;
// 本块交易序列;此字段内容会被发送并写入磁盘

mutable bool fChecked;
// memory only:只存在于内存,不发送、不落盘
// mutable:即使对象被视作 const,该标志仍可更改(校验完成后打标)
};

class CTransaction {
// 一笔交易请求或交易记录

const std::vector<CTxIn> vin;
// 本 Tx 的输入 UTXO 序列,即资金来源

const std::vector<CTxOut> vout;
// 本 Tx 的输出 UTXO 序列,即资金去向

const int32_t nVersion;
// CURRENT_VERSION = 2

const uint32_t nLockTime;
// 锁定时间;时间未到点之前本交易不入块

const uint256 hash;
// 本 Tx 的 Hash 值(TxID);只存内存,不作永久存储也不发送
};
哪些字段上链

会发送、会落盘:块头六字段 + 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
2
3
4
5
6
7
8
           Merkle 根 H_ABCD
← 写入区块头
/ \
H_AB H_CD
/ \ / \
H_A H_B H_C H_D
| | | |
Tx_A Tx_B Tx_C Tx_D

自底向上:

  1. 叶:(H_A=H(Tx_A)),同理得 (H_B,H_C,H_D)。
  2. 中间:(H_{AB}=H(H_A\Vert H_B)),(H_{CD}=H(H_C\Vert H_D))。
  3. 根:(H_{ABCD}=H(H_{AB}\Vert H_{CD})),写入块头。

要证明「(Tx_B) 在本块」(不必下载 (Tx_A,Tx_C,Tx_D) 原文)。验证方已有块头里的根,另需一条 Merkle 路径:沿 (H_B) 上到根时,每一层缺的那个兄弟哈希。对本例即 ({H_A,\ H_{CD}}),并标明左右位置。

验证步骤:

  1. 本地算 (H_B=H(Tx_B))。
  2. (H_A) 在左、(H_B) 在右 → (H_{AB}’=H(H_A\Vert H_B))。
  3. (H_{AB}’) 在左、(H_{CD}) 在右 → (H_{ABCD}’=H(H_{AB}’\Vert H_{CD}))。
  4. (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

  1. 对目标地址建布隆过滤器(Bloom Filter),少收无关交易。
  2. 全节点匹配后发 MerkleBlock:块头 + 到目标交易的 Merkle 路径。
  3. 存在性:沿路径重算至根,与块头 Merkle 根比对。
  4. 防双花置信:看该块之后又接了多少块;惯例约 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
2
3
4
5
6
7
8
9
10
11
class CBlockHeader {
// ... nVersion, hashPrevBlock, hashMerkleRoot, nTime ...

uint32_t nBits;
// 为挖矿过程设置的难度;课件:Hash 值中须有的前导零位数
// (协议里是难度目标的紧凑编码)

uint32_t nNonce;
// 试凑值(nonsense / number used once):不断 +1,
// 使块头 Hash 达到 nBits 所要求的前导零位数
};

内层循环:不断改 Nonce → 对改过的块头做哈希(实现里 GetHash() 为双 SHA-256)→ CheckProofOfWork 与目标比较;hash 小于目标则 PoW 成功。

1
2
3
4
5
6
7
8
9
10
11
12
// 课件挖矿内层循环:
// 1. 不断改变块头中的 Nonce
// 2. 对改过的块头做 SHA-256(GetHash)
// 3. CheckProofOfWork:把 hash 与目标比较;hash < target 则成功
// uint64_t nMaxTries = 1000000; // 本轮最多试 100 万次(示例上限)

while (nMaxTries > 0
&& pblock->nNonce < nInnerLoopCount
&& !CheckProofOfWork(pblock->GetHash(), pblock->nBits, params)) {
++pblock->nNonce; // 试凑值 +1
--nMaxTries; // 本轮剩余次数 -1
}

CheckProofOfWork 两个输入:① 本区块头算出的 256 位 hash;② 难度值 nBits。本次 SHA-256 不满足则 nNonce 加 1,继续尝试。


校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool CheckProofOfWork(uint256 hash, unsigned int nBits,
const Consensus::Params& params)
{
arith_uint256 bnTarget;
bnTarget.SetCompact(nBits); // nBits 紧凑编码 → 256 位目标 bnTarget

// 合法性:负值、零、溢出、超过 PoW 上限则拒绝
if (bnTarget <= 0 || bnTarget > params.powLimit)
return false;

// 核心(课件红框):算出的 hash 比目标还大 ⇒ 工作量不够,无效
if (UintToArith256(hash) > bnTarget)
return false;

return true; // hash ≤ 目标 ⇒ PoW 成立
}
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
2
3
4
5
6
7
8
时刻 t:A、B 几乎同时挖出块
块100
/ \
块101A 块101B ← 赛跑分叉,高度相同、哈希不同
|
时刻 t+1:A 这边先出 102A
块101A—102A ← 更长(累计 PoW 更大)
块101B ← 短叉上的 101B 变孤块,其中交易回内存池再打包

节点先收下先到的 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 量级以上(随行情变)。课件另有「中国告别比特币挖矿」:境内挖矿逐步清退(政策背景,了解即可)。


小结

  1. 全节点独立验证交易。
  2. 矿工 PoW 打包新块。
  3. 全节点独立校验并组装链。
  4. 选择累计工作量最大的链。

UTXO

(Unspent Transaction Output,未花费交易输出)

比特币维护「账户余额」字段,而维护一堆尚未花掉的输出。地址余额 = 该地址能解锁的 UTXO 之和;支付时选若干 UTXO 作输入,多退少补(找零输出)。

地址生成(课件简述「公钥 SHA160」;协议精确为):

[
\mathrm{Address} \leftarrow \mathrm{RIPEMD160}(\mathrm{SHA256}(\mathrm{pubkey}))
]

再 Base58Check 等编码成常见地址串。私钥自持,用于签名。

两类交易:

类型 结构
常规 有 vin(来源)+ vout(去向)
Coinbase 无有效 vin;产出新币 + 费

结构

CTransactionvin / vout / nVersion / nLockTime(未到点不入块)/ hash(TxID,常内存计算)。

CTxOutnValue(该 UTXO 承载的聪/比特币数量)+ scriptPubKey(招领脚本,名含 PubKey,却不必只是「付给公钥」)。类型:P2PK、P2PKH、P2SH、P2WPKH、P2WSH。

CTxInprevouthash = 前笔 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_CHECKSIGOP_DUPOP_HASH160OP_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>(证明「持有对应私钥」)。
招领 scriptPubKeyOP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

1
2
3
4
5
6
7
8
9
步骤              栈(右侧为顶)
─────────────────────────────────────────────
压入 <sig> [ sig ]
压入 <pubkey> [ sig, pubkey ]
OP_DUP [ sig, pubkey, pubkey ]
OP_HASH160 [ sig, pubkey, HASH160(pubkey) ]
压入 <pubKeyHash> [ sig, pubkey, HASH160(pubkey), pubKeyHash ]
OP_EQUALVERIFY [ sig, pubkey ] ← 两哈希必须相等,否则立即失败
OP_CHECKSIG [ true / false ] ← 用 sig + pubkey 验本交易摘要

含义拆开: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
2
3
4
5
传统: [版本][输入含 scriptSig 签名][输出][nLockTime]
↑ 签名算满 1 字节 = 1 字节体积

SegWit:[版本][marker 0x00][flag 0x01][输入无签名][输出][witness][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 补救 对方违约时惩罚并补救
通道三步记忆口诀
  1. 注资:双方把钱锁进 2-of-2 多签「保险箱」(上链一次)。
  2. 应承:链下反复改「保险箱里怎么分」的收据,只交换签名,不上链。
  3. 决算:把最后一版收据广播上链,真正分配 UTXO。
    闪电网 = 很多条通道连成图,A→B→C 可多跳;有人作弊广播旧收据,对方可用 Breach Remedy 惩罚拿走保证金。

时序

以双向通道、总额 5 BTC 为例(注资常用 P2SH 2-of-2 多签)。链上只出现首尾两笔;中间改余额全部链下。

1
2
3
4
5
6
7
8
时间 →
链上 Funding ─────────────────────────────────────────── Settlement
锁进 2-of-2 按最后一版拆 UTXO
(等确认后通道可用) (或超时走 Refund)

链下 C1: A=4, B=1
C2: A=3, B=2 ← 只交换签名,不广播
C3: A=1, B=4 ← 最新有效收据
  1. Funding(注资):A、B 各出一部分(或一方单边注资),输出锁到双方多签地址。此笔上链并获确认后,通道余额才可在链下改。
  2. Commitment(应承):每次付款生成一版新的「如何瓜分该注资 UTXO」交易,双方签名后各自收存。旧版作废:协议用 Revocable Delivery(可撤销交付)让对方拿到撤销密钥;以后谁再广播旧收据,对方可用 Breach Remedy(违约惩罚)把通道内资金全部取走。
  3. Settlement(决算):合作关闭时,按最后一版应承构造结算交易并广播,多签 UTXO 拆成各自输出,通道结束。
  4. Refund(退款):对方失联或超时,走预先签好的退款/超时路径,资金在锁定期后回到注资方(单向通道尤其依赖这一条)。

Delivery 是「到期可取」的交付输出;Revocable Delivery 在其上加「被撤销则对方可立即罚没」。因此应承可以放心反复更新:诚实方只广播最新版;作弊广播旧版会亏光保证金。


多跳

闪电网络把许多条通道连成图。A 要付给 C,不必先开 A–C 直连通道:只要存在 A–B、B–C,即可 A→B→C 多跳。中间人 B 不托管资金、也不必信任 A/C——靠 HTLC(Hash Time-Locked Contract,哈希时间锁合约)做成原子互换。

1
2
3
4
5
6
7
8
A ──通道── B ──通道── C
付 0.1 BTC 给 C(无 A–C 直连)

① C 生成随机原像 R,发票只公开 H = Hash(R)
② A→B:HTLC「出示 R 则付给 B(含少量路由费);超时退回 A」
③ B→C:同样条件的 HTLC(金额略少,差额即 B 的费)
④ C 出示 R 收款;B 拿同一 R 向 A 收款
⑤ 各通道只更新自己的应承余额,资金未在跳点「停留成托管」

超时未出示原像则沿 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

课件提到的两次「共识」与分叉上线(考试以课件口径为准):

  1. 香港共识(课件:2016-02-20,香港数码港):中方矿工与海外开发者开会。课件表述为:开发者同意区块从 1 MB 扩到 8 MB,中方矿工同意只运行 Core、不再支持 Gavin 的版本。
  2. 纽约共识(课件:全球 50 多家企业):拥堵使商业机构感到扩容紧迫,达成扩容至 2 MB
  3. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 示意:一次 scrypt 的内存困难部分(ROMix),不是完整 RFC 实现
# BlockMix / salsa20 细节从略;X 表示一块 128*r 字节的状态

def romix(B, N):
X = B
V = [None] * N # 必须常驻的大表,约 128 * N * r 字节

# ① 顺序填表:第 i 项依赖第 i-1 项,无法跳步、难以只算「需要的那一格」
for i in range(N):
V[i] = X
X = blockmix(X)

# ② 伪随机回读:下标 j 由当前 X 决定,访问无规律
# 不存 V 的话,每次 V[j] 都要从头重放 ①,时间炸开
for i in range(N):
j = integerify(X) % N
X = blockmix(xor(X, V[j]))

return X
1
2
3
4
5
6
V[0] V[1] V[2] ... V[j] ... V[N-1]     ← 整表留在 RAM

第 ② 步按 X 算出的 j 乱序点名

SHA-256: [80B 块头] → ALU → 哈希 内存 ≈ 常数
Scrypt: [填满 V] → 乱序读 V → 哈希 内存 ≈ Θ(N),并行 k 路 ≈ k 倍 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
2
3
4
5
6
7
矿工A ─┐          下发任务(块头模板 + 难度更低的「份额目标」)
矿工B ─┼→ 矿池 ← 上交 share(证明「做了这么多哈希」)
矿工C ─┘ │
▼ 某次哈希真的满足全网 nBits
广播真块(Coinbase 先打到矿池地址)

按份额给 A/B/C 打款(扣手续费)

复习

主题 必记
三形态 公 / 联盟 / 私;无许可 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
2
3
4
5
6
7
8
9
10
11
12
13
块头 stateRoot


世界状态 MPT(键 = 账户地址)
├── 0xAlice… EOA
│ nonce=5, balance=2 ETH
│ storageRoot=空, codeHash=空串哈希
└── 0xC0de… 合约
nonce=1, balance=10 ETH
codeHash → 字节码
storageRoot → 存储 MPT(slot → 值)
├── slot 0: totalSupply
└── slot 映射: 某地址余额
叶子 块头里的根
世界状态 账户地址 上述四字段 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=21000maxFeePerGas=300maxPriorityFeePerGas=10value=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
2
3
4
简单支付     EOA ──value──► EOA          gas ≈ 21000,几乎不跑合约
存证 EOA ──data──► (value=0) 内容写进链上,当收据
部署 EOA ──to=空──► 新合约账户 data=字节码,回执给合约地址
调用 EOA ──data──► 已有合约 如 transfer(地址, 数量)

付费拆成两块(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
2
3
4
5
6
7
8
9
10
11
12
13
钱包按 ABI 编 data


节点:查 nonce、余额、签名 → 扣 gas 预付款


EVM 逐步解释字节码(每步扣 gas)

┌────┴────┐
成功则提交状态 失败/气尽则整笔回滚
│ (nonce 仍增加,预付 gas 不退已耗部分)

Receipt:成功否、gasUsed、日志(事件)

区块

PoW 时代块头(课件:最长约 800 字节)含:parentHashunclesHash(叔块头列表的哈希)、coinbase(本块奖励与手续费打给谁,160 位地址)、stateRoottxTrieRootreceiptTrieRootdifficultytimestampnumber(高度,本块之前的块数)、gasLimitgasUsedextraData(任意附加,不超过 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)、logsBloommixHash(与 nonce 一起证明算力)。黄皮书式字段名与实现类名可对照记。

PoS 信标块(课件):

字段 含义
slot 本块所属时段
proposer_index 提议者验证者编号
parent_root 前一块哈希
state_root 信标状态根
body 见下表

bodyrandao_reveal(选下一提议者的随机素材)/ eth1_data(存款合约信息)/ graffiti(任意标记)/ proposer_slashingsattester_slashings(罚没名单)/ attestations(对本块的证明)/ deposits(新质押)/ voluntary_exits(自愿退出)/ sync_aggregate(服务轻客户端的子集)/ execution_payload(执行客户端交来的交易)。

execution_payload 近似执行层块头,但带交易列表提款列表(头里对应的是 transactions_root / withdrawal_root)。字段含:parent_hashfee_recipient(手续费收款地址,对应旧 coinbase)、state_rootreceipts_rootlogs_bloomprev_randaoblock_numbergas_limitgas_usedtimestampextra_database_fee_per_gasblock_hashtransactionswithdrawals。提款对象:address / amount / index / validatorIndex

网络:主网 chainId=1MAIN_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 / 合并后 PoSGasper = 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
2
3
4
5
合并前:一台程序既跑交易又挖矿(Eth1 PoW)
合并后:
执行客户端(Geth 等)── 跑 EVM、管世界状态
共识客户端(Lighthouse 等)── 信标链、投票、出块资格
└── 二者本地互连,缺一不可

时间格子:

1
2
3
4
epoch(32 个 slot,约 6.4 min)
slot0 slot1 ... slot31
│ │
委员会抽签 → 一人提议块,其余 attestation

最终性两步(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 实施硬分叉 → EthereumEthereum Classic(ETC)

合并后(2022-09-15)另有一条继续挖矿的 ETHW(PoW),与走 PoS 的 ETH 不是同一回事,也不同于 2016 的 ETC。

代码即法律 vs 社区干预

DAO 事件说明:链上合约一旦有漏洞会被利用;是否硬分叉回滚,是技术规则与社区治理的交叉点,也是 ETC 存在的原因。


预言机

(Oracle)

合约读不到链外 API。预言机是 data feed:获取、验证、传输链下信息给合约;也可把链上结果推到链外(如付费后开智能锁)。

要求 含义
正确性 不因无效链下数据触发改状态;来源真实、传输中未被改(完整性)
可用性 不拖延、不阻断合约执行;按请求提供数据
激励兼容 提供者愿提交正确信息。归因:能对应到谁提供;问责:按质量奖罚

结构:① 链上预言机合约——听其它合约的请求、转给节点、把返回值(可先聚合)写给调用方。② 链下预言机节点——调第三方 API,听链上事件并完成日志里的任务。

1
2
3
4
5
6
7
链下世界(价格、天气、比赛结果)
│ 预言机节点去抓、签名

链上 Oracle 合约(存最新值 / 聚合多家)
│ 业务合约读取

借贷、稳定币、保险等 DApp
模式 谁先动 例子
发布–订阅(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 Trustlfdecentralizedtrust.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
2
3
4
5
6
7
8
9
Org1 管理员(已有 CA 证书)
│ register --id.name peer0 --id.type peer

CA 库留下 peer0 + secret
│ enroll(peer0 用 secret 来领证)

peer0:signcerts/(ECert)+ keystore/(私钥)

▼ 该证写入本节点 Local MSP;通道 MSP 用同一信任根验签

证书类型直觉:

用途
ECert 长期身份;提案、背书、管理操作的签名
TLS 证 节点之间、Client↔Peer/Orderer 的加密通道
中间 CA 证 根 CA 只给各组织签发中间 CA;日常用户/Peer 由组织中间 CA 签发,便于撤销范围可控

CA 库可 SQLite / PostgreSQL 等;生产常配 HSM 护根私钥。属性例:hf.Registrar.Roles(能否再注册他人)、hf.Revokerhf.IntermediateCAhf.GenCRL。身份还有 affiliation(如 org1.department1),映射到证书 OU,供策略按部门细分。

注册 ≠ 上链

register 只写 CA 自己的数据库,链上还没有这个人。enroll 之后,证书必须被放进某节点的 MSP(以及通道配置里的组织 MSP),Peer/Orderer 验签时才会认。吊销同理:只 revoke、不更新 CRL/通道配置,其他节点仍可能接受旧证。

新员工进联盟
  1. Org1 管理员向 Org1 的 Fabric CA register 类型 client
  2. 员工 enroll 拿到 ECert。
  3. 应用用该证经 Gateway 向 Peer 提交交易;Peer 用通道 MSP 验「这是 Org1 的 client」。
  4. 离职: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.peerOrg1.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)+ 交易日志(区块链历史)。二者都表示与业务对象有关的事实:世界状态可创建/更新/删除、频繁变;区块链一旦写入不可改,用来理解「当前值是怎么来的」。

课件账本例(汽车):世界状态里 CAR0CAR3 为 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 把这件事拆成三步,且每步由不同角色做——

  1. 业务上「这笔该不该发生」→ 指定组织的 Endorser 跑链码并签名(背书策略)。
  2. 全通道「先发生哪笔」→ Orderer + Raft 给出唯一顺序。
  3. 账本「能不能过账」→ 全体 Committer 再验签名和读集版本。

三步都通过才改世界状态;排序时不跑业务,所以不会因为执行不确定而分叉。

交易三阶段(课件,经 Gateway):

  1. 提案与背书:客户端 A1 经所连 Peer 上的 gateway 提交已签名提案。背书组织选择可委托给网关,也可由应用显式指定。网关选 P1 或同组织其他 Peer 执行指定链码,生成含读写集的提案响应并签名返回;再按背书策略对每个所需组织重复执行。网关凑齐签名后组事务信封,交客户端 SDK 再签。
  2. 发送与排序:SDK 把已签信封交给网关,网关转发 Orderer 并回成功。Orderer 验签名后排序,与其它交易打成块,分发给通道节点。到达排序节点的已授权交易被机械打包,Orderer 不判断交易内容、不跑链码
  3. 验证与提交:每个 Peer 核对信封上的客户签名是否与原始提案一致;核对各背书的读写集与状态响应是否等价(背书匹配)以及是否满足背书策略;逐笔标有效/无效。再把有序块提交到通道账本(不可变写入)。世界状态实质是全部有效交易的总和,只用有效结果更新。每个提交 Peer 向客户端发 commit 事件(含账本更新证明)。

并非每个 Peer 都直连 Orderer;可用 Gossip 把块关联到其他节点。

交易结构字段(课件 H4 / S4 / P4 / R4 / E4):

字段 含义
头 H 元数据,如链码名与版本
签名 S 客户端用私钥签,防篡改
提案 P 编码应用交给合约的输入;与当前世界状态一起决定新状态
响应 R 读写集:世界状态之前与之后的值;验证成功才应用到账本
背书 E 策略规定组织对响应的签名集合,数量须满足策略
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Client(持 ECert,MSP=Org1)
│ ① 提案:调链码 f(args)

Endorser Peer(按背书策略,如 Org1+Org2)
│ 验 Client 证书 ∈ 通道 MSP
│ 容器里执行链码 → RW-set(不改账本)
│ 用 Peer 的 ECert 签名

Client 凑齐策略要求的背书
│ ② 信封送给 Orderer

Orderer(Raft 等)
│ 只排序、打包出块
│ **不跑业务链码、不看 RW-set 是否「算对」**

Committer Peer(通道内各组织)
│ ③ 验签名 + 背书策略 + 读集版本
│ 有效 → 应用写集,更新世界状态
│ 无效 → 仍写入区块历史,状态不动

commit 事件 → Client

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 台)。分区时少数派不能提交,避免两套顺序。

完整一拍(与图对应):

  1. Client 把已背书信封交给任一 Orderer;非 Leader 会转给当前 Leader。
  2. Leader 把交易追加进本地 Raft 日志(还不是区块)。
  3. Leader 把新日志项发给 Follower;Follower 写入自己的磁盘后应答。
  4. 应答达到多数 → 该日志项 committed。Leader 按批切成区块,通过 gRPC/Gossip 交给 Peer。
  5. 心跳: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
2
3
4
5
6
7
铸币厂:  付款人 → 退币给厂 → 厂重发给收款人
(厂是唯一「未花」判定者)

签名链: Tx0 ─签→ Tx1 ─签→ Tx2 → …
每环 = Hash(上一笔, 下家公钥) 的签名
缺口:链本身不告诉「这枚是否已被接到另一条链」(双花)
补上:广播全部交易 + PoW 链给出唯一顺序

交易

电子货币 = 数字签名链:拥有者把「上一笔交易 + 下家公钥」的哈希签名接到末尾;收款人验签即可知所有权。

缺口:收款人无法确认该币是否已被双花。铸币厂模型每笔退回重铸 → 仍是中心。论文要求:所有交易公开;参与者对收到顺序的单一历史达成共识;收款人需要「多数节点认同此交易最先」的证据。

多输入多输出:合并/拆分金额;常见两输出(支付 + 找零)。扇出依赖不要求保存完整独立历史副本(与 UTXO/Merkle 剪枝一致)。


时间戳

时间戳服务器:对一批待标记数据算块哈希并广泛发布(类比登报)。哈希纳入上一时间戳 → 。证明:能算出该哈希时,数据必已存在。

1
2
3
4
T1 = Hash(一批交易)
T2 = Hash(T1 ∥ 下一批) ← 要伪造 T1 对应的内容,T2 也对不上
T3 = Hash(T2 ∥ 再下一批)
...

登报 / 邮件列表发布的是哈希,不是全文:证明「此刻这批数据已经存在」,后人无法把过去的内容换成另一批还保持后续哈希不断。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
2
3
4
SPV 本地:  块头0—块头1—...—块头N     (每头 80 B)
要收款时: 向全节点要「Tx 所在块」+ Merkle 路径
本地做: 沿路径重算根 ≟ 该块头的 Merkle 根
再看后面接了多少个头(确认数)

诚实算力占优时,伪造一条带假 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
2
3
诚实链  ■■■■■■          已确认 z 块
攻击链 ■■ 还差 z 步
每步:p 诚实再出一块(差距拉大)或 q 攻击者出一块(差距缩小)

论文数值((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
三条逻辑链
  1. 比特币:公开交易历史 + PoW 时间戳 → 概率最终性(确认数)。
  2. 以太坊:共享 EVM 状态 → 可编程;PoS 检查点 → 经济最终性。
  3. Fabric:已知身份背书 → Orderer 定序 → Peer 校验读写集 → 设计上不分叉