第 5 讲:BTC 实现(二):挖矿概率、安全性与攻击分析

第 5 讲:BTC 实现(二):挖矿概率、安全性与攻击分析
agsd第 5 讲:BTC 实现(二):挖矿概率、安全性与攻击分析
1. 本节主线
- 本节从概率角度解释比特币挖矿:每次尝试
nonce都可以看作一次伯努利试验(Bernoulli trial)。 - 通过伯努利过程、泊松过程和指数分布,理解为什么比特币出块时间具有无记忆性(memoryless property)。
- 分析比特币总量为什么约为 2100 万,以及区块奖励减半机制如何产生稀缺性。
- 讨论比特币安全性:挖矿不能绝对保证安全,只能提供概率意义上的安全保证。
- 重点理解双花攻击(double spending attack)、确认数(confirmation)、零确认(zero confirmation)和自私挖矿(selfish mining)。
2. 核心概念速览
| 概念 | 简要理解 | 在本节中的作用 |
|---|---|---|
nonce |
矿工不断修改的随机数 | 用于反复尝试找到满足难度要求的区块哈希 |
| 伯努利试验(Bernoulli trial) | 只有成功 / 失败两种结果的随机试验 | 每次尝试一个 nonce 可视为一次伯努利试验 |
| 伯努利过程(Bernoulli process) | 一系列相互独立的伯努利试验 | 用来描述矿工连续尝试 nonce 的过程 |
| 泊松过程(Poisson process) | 大量低概率独立事件的近似模型 | 用来近似整个系统产生新区块的过程 |
| 指数分布(exponential distribution) | 描述下一次事件发生等待时间的分布 | 用来描述比特币系统的出块时间 |
| 无记忆性(memoryless property) | 过去等待多久不影响未来还要等多久 | 解释为什么“已经挖了很久”不代表“快挖到了” |
| Progress free | 挖矿进度不可累积 | 保证算力强的矿工只有按算力比例获得优势,而不是超比例优势 |
| 区块奖励(block reward) | 矿工成功出块后获得的新比特币 | 是新比特币产生的主要途径 |
| 交易费(transaction fee) | 用户为了让交易被打包支付给矿工的费用 | 当区块奖励下降后,继续激励矿工 |
| 双花攻击(double spending attack) | 试图把已经花出去的币再花一遍 | 比特币安全分析中的核心攻击场景 |
| 确认数(confirmation) | 某交易后面接上的区块数量 | 确认数越多,交易越难被回滚 |
| 零确认(zero confirmation) | 交易已广播但尚未写入区块 | 速度快,但安全性弱 |
| 自私挖矿(selfish mining) | 挖到区块后暂不发布,私下继续挖 | 可用于制造分叉或减少他人有效竞争 |
3. 知识结构图
flowchart TD
A[BTC 挖矿] --> B[概率模型]
A --> C[经济激励]
A --> D[安全性分析]
B --> B1[Bernoulli trial]
B1 --> B2[Bernoulli process]
B2 --> B3[Poisson process 近似]
B3 --> B4[指数分布]
B4 --> B5[Memoryless / Progress free]
C --> C1[Block reward]
C1 --> C2[每 21 万区块减半]
C2 --> C3[总量约 2100 万]
C --> C4[Transaction fee]
D --> D1[恶意节点获得记账权]
D1 --> D2[不能伪造签名偷币]
D1 --> D3[可能尝试 double spending]
D3 --> D4[等待 confirmations]
D3 --> D5[Selfish mining]
这张图展示了本节的三条主线:第一条是挖矿的概率模型,用于解释出块时间和公平性;第二条是经济激励机制,解释矿工为什么愿意参与;第三条是安全性分析,说明比特币的不可篡改性不是绝对的,而是依靠算力竞争和确认数形成的概率保证。
4. 课程内容详解
4.1 挖矿为什么可以看作伯努利试验?
比特币挖矿的本质是矿工不断尝试不同的 nonce,计算区块头哈希,看看结果是否小于目标阈值。
每一次尝试只有两种结果:
- 成功:哈希值满足难度要求,矿工找到合法区块。
- 失败:哈希值不满足要求,矿工继续尝试下一个
nonce。
这就符合伯努利试验(Bernoulli trial)的定义:一次随机实验只有两种结果。
可以类比抛硬币:
- 抛硬币:正面 / 反面。
- 挖矿:成功 / 失败。
但二者最大的不同是概率。抛普通硬币时,正反面概率接近各一半;而挖矿时,单次尝试成功的概率极低,绝大多数 nonce 都是失败的。
因此,挖矿不是“靠思考解数学题”,而是不断做大量随机尝试。谁能做更多尝试,谁就有更高概率先找到合法区块。
4.2 伯努利过程与无记忆性
如果矿工不断尝试 nonce,每次尝试都是独立的伯努利试验,那么这些试验连在一起,就构成伯努利过程(Bernoulli process)。
伯努利过程有一个重要性质:无记忆性(memoryless property)。
意思是:
前面失败了多少次,不会影响下一次成功的概率。
比如抛硬币时,前面连续 10 次都是反面,并不意味着第 11 次正面的概率会变大。每次抛硬币仍然按照原本概率独立发生。
挖矿也一样:
- 你已经尝试了很多
nonce,不代表下一个nonce更容易成功。 - 你已经挖了 9 分钟,不代表第 10 分钟更容易出块。
- 你之前做过的失败尝试不会“积累进度”。
这就是课程中提到的 progress free:挖矿没有可累积的进度条。
4.3 为什么说挖矿是 progress free?
progress free 直译是“没有进度优势”。它的意思不是说挖矿没有意义,而是说:
对单个矿工来说,已经尝试过的失败计算不会让后续尝试更容易成功。
这听起来有点“无情”,因为过去做的工作似乎都白费了。但这个性质恰恰保证了挖矿公平性。
假设有两个矿工:
- 矿工 A 的算力是矿工 B 的 10 倍。
- 那么 A 每秒能尝试的
nonce数量大约是 B 的 10 倍。 - 理想情况下,A 找到新区块的概率也应该是 B 的 10 倍。
这就是按算力比例分配机会。
如果挖矿不是 progress free,而是“失败得越多,下一次越容易成功”,那么算力强的矿工就会获得超比例优势。因为算力强者在同一时间里失败次数更多,于是后续成功概率也会更快变大。这样一来,A 的优势就不只是 10 倍,而可能超过 10 倍。
所以,progress free 的真正作用是:
防止强矿工因为历史尝试次数更多而获得不成比例的额外优势。
4.4 泊松过程与指数分布:为什么平均出块时间是 10 分钟?
比特币系统中,每次尝试 nonce 的成功概率极小,但整个网络每秒会进行海量尝试。
这种场景符合一个常见近似:
大量独立试验 + 单次成功概率极低,可以用泊松过程(Poisson process)近似。
在泊松过程下,等待下一次事件发生的时间服从指数分布(exponential distribution)。
对于比特币来说,这个“事件”就是:
整个系统中有人成功挖出下一个合法区块。
因此,比特币的出块时间可以理解为服从指数分布。
注意这里说的是整个系统的出块时间,不是某个具体矿工的出块时间。
比特币协议通过调整挖矿难度,让整个系统的平均出块时间维持在大约 10 分钟。也就是说,从全网角度看,平均每 10 分钟会产生一个新区块。
但具体到某个矿工,情况取决于他的算力占比。
例如:
- 某矿工拥有全网 1% 的算力。
- 那么平均来说,全网每产生 100 个区块,其中约 1 个属于他。
- 全网平均 10 分钟一个区块。
- 所以这个矿工平均约每 1000 分钟才能挖到一个区块。
这里要区分两个平均时间:
| 对象 | 平均出块时间 |
|---|---|
| 整个比特币系统 | 约 10 分钟 |
| 单个矿工 | 取决于该矿工算力占比 |
4.5 指数分布的无记忆性
指数分布也具有无记忆性。
这意味着:
即使当前已经过去 10 分钟还没有出块,接下来平均仍然要再等 10 分钟。
这点很容易违反直觉。很多人会觉得:“平均 10 分钟出块,现在已经等了 10 分钟,那应该快出了吧?”
但概率模型告诉我们,不是这样。
因为挖矿没有进度积累,系统并不会因为已经很久没出块,就自动提高下一秒出块的概率。每一刻的状态仍然由当前全网算力和当前难度决定。
所以:
- 已经等了 1 分钟,未来平均还要等 10 分钟。
- 已经等了 10 分钟,未来平均还要等 10 分钟。
- 已经等了 30 分钟,未来平均仍然还要等 10 分钟。
当然,这里的“平均”不是说每次都一定再等 10 分钟,而是指条件分布的期望仍然不变。
4.6 比特币总量为什么约为 2100 万?
比特币中新币的产生主要来自区块奖励(block reward)。
课程中强调:
区块奖励是系统中产生新比特币的途径。
比特币的区块奖励不是一直不变的,而是每隔约 21 万个区块减半一次。由于平均 10 分钟出一个区块,21 万个区块大约对应 4 年。
最初:
- 前 21 万个区块:每个区块奖励 50 BTC。
- 接下来 21 万个区块:每个区块奖励 25 BTC。
- 再接下来:12.5 BTC。
- 之后继续减半。
于是总量可以写成一个几何级数:
1 | 总量 = 210000 × 50 × (1 + 1/2 + 1/4 + 1/8 + ...) |
括号中的几何级数:
1 | 1 + 1/2 + 1/4 + 1/8 + ... = 2 |
所以:
1 | 总量 = 210000 × 50 × 2 |
因此,比特币总量约为 2100 万枚。
这里要注意一个常见误解:比特币越来越难“获得”,不是因为它在解决某个越来越稀少的数学对象,比如寻找某种特殊质数;而是因为协议规定的区块奖励不断减半,新增比特币越来越少。
4.7 挖矿本身没有实际计算意义,但有安全意义
课程中特别区分了两件事:
- 挖矿计算本身没有实际业务意义。
- 挖矿机制对维护系统安全非常重要。
也就是说,矿工反复计算哈希,并不是在解决科学问题,也不是在完成某种有实际用途的数学任务。它的直接作用是竞争记账权。
但是在一个去中心化系统里,没有中心机构决定“谁有资格记账”。比特币需要一种开放的、抗女巫攻击的记账权分配方式。
Proof of Work 的作用就是:
用算力作为竞争记账权的成本。
只要大部分算力掌握在诚实节点手中,恶意节点想篡改账本就必须投入大量算力与全网竞争。这样,挖矿虽然表面上像是在做“无用功”,但它实际上是在给区块链安全性提供成本屏障。
4.8 区块奖励下降后,矿工还有动力吗?
随着区块奖励不断减半,矿工获得的新比特币数量会越来越少。直觉上可能会担心:
如果最后区块奖励趋近于 0,矿工是不是就没有动力挖矿了?
课程中给出的答案是:不一定,因为还有交易费(transaction fee)。
矿工的收入可以理解为两部分:
1 | 矿工收入 = 区块奖励 + 交易费 |
早期,区块奖励是主要激励。随着区块奖励减少,交易费会变得越来越重要。
所以,比特币长期安全性的一个关键问题是:
当新币发行奖励逐渐降低后,交易费能否继续支撑足够多矿工参与维护系统安全?
本节没有展开这个长期问题,只需要先理解:比特币激励矿工的机制并不只有区块奖励,还有交易费。
4.9 恶意矿工获得记账权后,能不能偷币?
假设恶意矿工获得了某个区块的记账权,他能不能直接把别人的钱转给自己?
答案是:不能。
原因是比特币交易需要数字签名(digital signature)。
例如,恶意节点 M 想把 A 的币转给自己,需要构造一笔交易:
1 | A -> M |
但这笔交易必须有 A 的私钥签名才有效。M 虽然获得了记账权,但他不知道 A 的私钥,所以无法伪造 A 的签名。
如果 M 强行把这笔非法交易写入区块,会发生什么?
诚实节点会验证区块中的交易。一旦发现交易签名无效,就不会接受这个区块。比特币节点遵循的是扩展最长合法链,而不是扩展任意最长链。
因此:
不合法的链再长,也不能被诚实节点接受。
这说明,挖矿获得的是记账权,不是随意改账的权力。
4.10 恶意矿工能不能双花?
虽然恶意矿工不能伪造别人签名偷币,但他可以尝试另一类攻击:双花攻击(double spending attack)。
双花的核心目标是:
把同一笔币花出去后,再通过分叉让这笔付款所在的区块作废,从而把钱“拿回来”。
典型场景:
- M 向商家 A 发起一笔付款交易。
- 这笔交易被写入区块链。
- 商家看到交易上链,以为付款完成,于是发货。
- M 在较早位置制造另一条分叉链,把同一笔钱转回给自己。
- 如果 M 的分叉链最终变成最长合法链,那么原来付款给商家的交易就被回滚。
- M 既拿到了商品,又收回了钱。
这里的关键是:恶意交易不能直接接在已有付款交易后面。因为如果同一笔钱已经在上一笔交易中花出,再在后续区块里花一次,诚实节点会直接识别为 double spending 并拒绝。
所以攻击者必须从付款交易之前的位置开始分叉,构造另一条合法链。
4.11 为什么多等几个 confirmation 可以防范双花?
确认数(confirmation)表示某笔交易被写入区块后,后面又接上了多少个区块。
可以简单理解为:
| 状态 | 含义 |
|---|---|
| 0 confirmation | 交易已广播,但还没被写入区块 |
| 1 confirmation | 交易已经被写入一个区块 |
| 2 confirmations | 交易所在区块后面又接了 1 个新区块 |
| 6 confirmations | 交易所在区块后面已有多个区块,回滚难度较高 |
比特币中常见经验是等待 6 个 confirmation。因为平均 10 分钟一个区块,6 个确认大约需要 1 小时。
为什么确认数越多,双花越难?
因为攻击者要回滚某笔交易,就必须从交易之前的位置开始挖一条分叉链,并让这条分叉链赶上甚至超过诚实链。
如果交易刚刚上链,攻击者只需要赶上很短的链。
如果交易后面已经有多个确认,攻击者就必须连续挖出多个区块,才能让自己的分叉链超过诚实链。
只要大多数算力掌握在诚实节点手中,攻击者连续追上的概率会随着确认数增加而快速下降。
所以,“不可篡改”不是绝对不能改,而是:
随着确认数增加,被成功篡改的概率快速下降。
4.12 区块链不可篡改是概率意义上的
很多人会说区块链是不可篡改账本(irreversible ledger)。这句话要谨慎理解。
严格来说,比特币的不可篡改性不是物理上、逻辑上绝对不可改变。刚刚写入区块链的交易仍然有可能因为分叉而被回滚。
比特币真正提供的是:
基于算力竞争的概率安全性。
确认数越多,攻击者需要重组的区块越多,成功概率越低。因此,交易不是在某一瞬间从“可篡改”变成“绝对不可篡改”,而是随着后续区块增加,逐渐变得越来越难以篡改。
可以把它理解成安全性的连续增强:
1 | 0 confirmation:风险最高 |
4.13 什么是 zero confirmation?
零确认(zero confirmation)指的是:
交易已经广播到网络中,但还没有被写入任何区块。
例如,用户向商家付款后,交易被广播出去,商家节点监听到了这笔交易,并验证其签名合法、输入未花费,但此时还没有新区块包含这笔交易。
这时商家如果直接接受付款,就属于接受 zero confirmation 交易。
这显然有风险,因为交易还没进入区块链,更容易被替换或冲突交易影响。
但课程提到,zero confirmation 在一些实际场景中仍然可能被使用,原因包括:
- 节点通常倾向于接受自己最先听到的合法交易。
- 很多商业场景本身有处理延迟,比如电商不会立刻发货。
- 如果后续发现交易没有进入最长合法链,商家仍可取消发货。
因此,zero confirmation 不是“没有风险”,而是某些低风险或可撤销场景下,为了提升用户体验而接受的一种权衡。
4.14 恶意矿工可以故意不打包某些交易吗?
可以。
比特币协议并没有强制规定矿工必须把哪些交易写入区块。矿工获得记账权后,可以选择:
- 打包某些交易。
- 不打包某些交易。
- 优先打包交易费高的交易。
所以,恶意矿工确实可以故意不把某些合法交易写入自己发布的区块。
但这通常不会造成严重后果,因为:
- 其他诚实矿工仍然可以在后续区块中打包这些交易。
- 区块容量有限,正常情况下也可能出现合法交易暂时未被打包的情况。
- 除非恶意矿工长期控制大量算力,否则很难永久阻止某笔合法交易上链。
这说明,单个恶意矿工可以延迟交易,但很难在诚实算力占多数时长期审查交易。
4.15 什么是 selfish mining?
自私挖矿(selfish mining)指的是:
矿工挖到新区块后,不立即广播,而是先藏起来,继续在自己的私有链上挖。
正常挖矿逻辑是:矿工一旦挖到新区块,应该马上发布。原因很简单:如果不发布,别人可能也挖出同一高度的区块,导致自己的区块失去优势。
但 selfish mining 故意反其道而行之。
攻击者的想法是:
- 自己挖到一个区块后先不公布。
- 其他矿工还以为旧区块是链尾,继续在旧区块后面挖。
- 攻击者私下继续挖,试图形成一条隐藏的私有链。
- 等公开链快追上或某个时机成熟时,攻击者一次性公布私有链。
- 如果私有链更长,网络会切换到攻击者的链,其他矿工之前挖出的区块作废。
selfish mining 的目的可能有两个:
- 配合分叉攻击,回滚某些交易。
- 在正常挖矿中减少别人有效竞争,让其他矿工做无用功。
但这种策略有风险。攻击者如果算力不够强,私有链可能被公开链追上甚至超过。那他之前藏起来的区块就可能作废,损失区块奖励。
因此,selfish mining 不是普通小矿工随便就能稳定成功的策略,它依赖较强算力和合适的网络传播条件。
4.16 为什么不能提前把未来很多区块都算好?
课堂中有同学提出一个问题:攻击者能不能提前准备很多未来区块,等需要攻击时一次性发布?
答案是:不能简单地“跳着算未来区块”。
因为每个区块头里都要包含前一个区块的哈希值。也就是说,区块之间是通过哈希指针串起来的。
如果你要挖第 1001 个区块,必须知道第 1000 个区块的哈希。
如果你要挖第 1002 个区块,必须先知道第 1001 个区块的哈希。
所以,攻击者不能在不知道前一区块哈希的情况下,直接提前计算后面很多区块。
他可以做的是:
- 从某个已知区块开始,私下构造一条分叉链;
- 挖出一个区块后,再基于这个区块继续挖下一个;
- 这就是 selfish mining 或分叉攻击中的“私下挖链”。
但他不能凭空提前计算未来还不存在的区块链位置。
5. 关键机制图解
5.1 挖矿概率模型
flowchart TD
A[尝试一个 nonce] --> B{Hash 是否小于目标值?}
B -- 否 --> C[失败]
C --> A
B -- 是 --> D[找到合法区块]
D --> E[广播区块]
E --> F[获得记账权和奖励]
A --> G[Bernoulli trial]
G --> H[Bernoulli process]
H --> I[Poisson process 近似]
I --> J[出块时间服从指数分布]
J --> K[Memoryless]
这张图说明:挖矿不是一步步接近答案,而是不断重复独立随机尝试。每次尝试都是一次伯努利试验,大量尝试形成伯努利过程,从全网角度可以用泊松过程近似,进而得到出块时间服从指数分布。最重要的结论是:出块等待时间具有无记忆性。
5.2 双花攻击与确认数
flowchart TD
A[攻击者向商家付款] --> B[付款交易进入区块]
B --> C[商家看到交易上链]
C --> D[商家发货或提供服务]
B --> E[攻击者从付款前分叉]
E --> F[构造另一笔交易: 转给自己]
F --> G[私下挖分叉链]
G --> H{分叉链是否超过诚实链?}
H -- 是 --> I[付款交易被回滚]
I --> J[Double spending 成功]
H -- 否 --> K[攻击失败]
B --> L[等待更多 confirmations]
L --> M[攻击者追赶难度增加]
这张图展示了 double spending 的核心逻辑:攻击者不是直接在付款交易后面再次花费同一笔币,而是从付款交易之前的位置制造分叉。确认数越多,诚实链越长,攻击者需要追赶的距离越大,攻击成功概率越低。
5.3 Selfish mining 的基本思路
flowchart TD
A[矿工挖到新区块] --> B{是否立即广播?}
B -- 正常挖矿 --> C[广播新区块]
C --> D[全网基于新区块继续挖]
B -- Selfish mining --> E[暂时隐藏区块]
E --> F[攻击者私下继续挖]
F --> G[其他矿工仍在旧链上挖]
G --> H{公开链是否快追上?}
H -- 是 --> I[攻击者公布私有链]
H -- 否 --> F
I --> J{私有链更长?}
J -- 是 --> K[公开链部分区块作废]
J -- 否 --> L[攻击者隐藏区块可能作废]
这张图说明 selfish mining 的关键不是“算得更快就一定赢”,而是通过隐藏区块改变其他矿工的信息状态,让其他矿工在旧链上浪费算力。但如果攻击者算力不足,隐藏策略反而可能导致自己损失奖励。
6. 易混点与常见误解
| 易混点 | 正确理解 |
|---|---|
| 挖矿是不是在解决有实际意义的数学难题? | 不是。挖矿主要是反复尝试 nonce,找到满足难度要求的哈希。它本身没有实际计算意义,但对系统安全有意义。 |
| 比特币越来越难挖,是不是因为“剩下的数学答案越来越少”? | 不是。难度来自协议调节和区块奖励减半机制,不是因为某类数学对象越来越稀缺。 |
| 已经挖了 10 分钟还没出块,是不是马上就要出了? | 不是。出块时间近似服从指数分布,具有无记忆性,未来平均仍然还要等约 10 分钟。 |
| Progress free 是不是说明矿工之前的工作都没意义? | 对单次成功概率来说,过去失败尝试不能积累进度;但整体上,算力投入越多,单位时间尝试次数越多,成功概率越高。 |
| 区块链不可篡改是不是绝对不能改? | 不是绝对不能改,而是确认数越多,篡改成本越高、成功概率越低。 |
| 最长链是不是只看长度? | 不是。诚实节点扩展的是最长合法链,包含非法交易的链再长也不会被接受。 |
| 恶意矿工获得记账权后能不能偷别人币? | 不能。转走别人的币需要对方私钥签名,恶意矿工无法伪造签名。 |
| 恶意矿工能不能故意不打包某些交易? | 可以,但通常只能延迟交易,除非长期掌握大量算力,否则很难永久阻止合法交易上链。 |
| Zero confirmation 是不是完全不能用? | 不是。它风险较高,但在低金额、可撤销、存在业务延迟的场景下可能被接受。 |
| Selfish mining 是不是可以提前把未来区块都算好? | 不能跳着提前计算未来区块,因为每个区块都依赖前一个区块的哈希。攻击者只能从某个已知区块开始私下连续挖。 |
7. 课堂外补充理解
7.1 为什么指数分布会出现“越等不越近”的现象?
日常生活中很多任务是有进度条的。比如下载文件,已经下载 90%,说明快完成了。
但挖矿不是这种任务。挖矿更像不停买彩票:
- 每张彩票中奖概率相同。
- 你之前买了很多张没中,不代表下一张中奖概率更高。
- 当然,你买得越多,总中奖概率越高;但每一张彩票本身不会因为之前没中而变得更容易中。
所以,“已经挖了很久”只是说明过去没有成功,并不说明未来更接近成功。
7.2 “概率安全性”怎么理解?
比特币很多安全结论都不是绝对的,而是概率性的。
例如:
- 恶意节点算力越低,攻击越难。
- 确认数越多,攻击越难。
- 诚实节点越多,最长合法链越稳定。
这和传统中心化系统不同。中心化系统通常依赖一个明确的权威服务器判断交易最终状态。比特币则通过全网算力竞争,让某条链逐渐成为更可信的历史。
因此,比特币的安全性来自:
1 | 密码学签名 + 哈希指针 + Proof of Work + 最长合法链规则 + 经济激励 |
本节重点讨论的是后面三个:Proof of Work、最长合法链规则和经济激励。
7.3 为什么区块奖励和交易费都是安全机制的一部分?
矿工不是免费维护系统的。矿工投入硬件、电力和时间,是因为能获得收益。
这些收益来自:
- 区块奖励。
- 交易费。
如果奖励不足,矿工减少,系统总算力下降,攻击者发动攻击的成本也会下降。
所以,区块奖励和交易费不只是经济问题,也是安全问题。比特币通过经济激励吸引矿工参与,再通过矿工算力维护账本安全。
8. 本节小结
- 比特币挖矿可以看作不断尝试
nonce的伯努利过程,每次尝试只有成功或失败两种结果。 - 全网出块过程可以用泊松过程近似,出块等待时间服从指数分布,具有无记忆性。
Progress free保证了挖矿机会基本按算力比例分配,避免强矿工获得超比例优势。- 比特币总量约 2100 万,来自区块奖励每 21 万个区块减半形成的几何级数。
- 挖矿本身没有实际计算意义,但通过 Proof of Work 为去中心化系统提供记账权竞争机制和安全成本。
- 比特币的不可篡改性是概率意义上的,确认数越多,交易被回滚的概率越低。
- 恶意矿工不能伪造签名偷币,但可以尝试 double spending、交易审查或 selfish mining。
- Selfish mining 的核心是隐藏已挖出的区块,试图让其他矿工浪费算力,但这种策略依赖较强算力,也有失败风险。
9. 自测问题
1. 为什么每次尝试 nonce 可以看作一次 Bernoulli trial?
参考答案:因为每次尝试只有两种结果:哈希满足目标要求,成功;哈希不满足目标要求,失败。这符合伯努利试验“二元结果”的定义。
2. 什么是挖矿中的 memoryless property?
参考答案:过去尝试了多少次、已经挖了多久,不会影响下一次尝试成功的概率。即使已经等了很久没出块,未来平均等待时间仍然不变。
3. 为什么 progress free 反而有助于挖矿公平?
参考答案:因为它保证过去失败尝试不能积累成额外优势。算力强的矿工优势只来自单位时间尝试次数更多,而不是因为历史尝试越多导致后续成功概率更高。
4. 比特币总量约 2100 万是怎么来的?
参考答案:区块奖励每 21 万个区块减半。总量为:
1 | 210000 × 50 × (1 + 1/2 + 1/4 + ...) = 210000 × 50 × 2 = 21000000 |
5. 恶意矿工获得记账权后,为什么不能直接偷别人的币?
参考答案:因为交易需要币所有者的私钥签名。恶意矿工不知道别人的私钥,无法伪造合法签名。包含非法签名交易的区块不会被诚实节点接受。
6. Double spending attack 为什么要通过分叉实现?
参考答案:如果攻击者直接在付款交易后面再次花费同一笔币,诚实节点会识别为双花并拒绝。攻击者必须从付款交易之前的位置构造另一条合法分叉链,让原付款交易所在链被回滚。
7. 为什么等待更多 confirmations 可以提高安全性?
参考答案:确认数越多,付款交易后面接上的诚实区块越多。攻击者要回滚该交易,就必须从更早位置开始追赶并超过诚实链,成功概率随确认数增加而快速降低。
8. Selfish mining 和正常挖矿的区别是什么?
参考答案:正常挖矿是挖到区块后立即广播;selfish mining 是挖到区块后先隐藏,私下继续挖,试图在合适时机公布更长私有链,让其他矿工的区块作废。









