# BTC 学习笔记连载(13)——比特币挖矿

By [Crypto 吊车尾](https://paragraph.com/@imsongoku) · 2023-01-16

---

欢迎交流：[twitter.com/songoku\_web3](http://twitter.com/songoku_web3)

转载请注明出处~

写这篇文章的时候，我在google搜了一下“挖矿”，我以为会有传统挖矿内容，结果全是比特币相关：

![](https://storage.googleapis.com/papyrus_images/22ced113dbaee7dde0288279388fb60eceb22cd06b6987a028edf7c43e0bf2cd.jpg)

传统采矿是从地下开采有经济价值的矿物或其他物质，包括煤、钻石、铁、稀有金属、铅、石灰石等，几乎任何不能由农业生产的原始物质都是由矿物提供的，从广义来说石油、天然气、甚至地下水的开采都属于采矿范畴。

已知最早的人类采矿遗址大概是斯威士兰的“狮穴”，根据放射性测定大约是属于43,000年前的矿穴，当时是开采赤铁矿用于做原始人图腾的颜料。

传统采矿需要前期较大的投入并付出相应的工作，才能产出有价值的矿物质，而且随着开采的进行矿物质会越来越稀缺。

比特币挖矿（Mining）名称的由来就是对标了这个过程。

交易清算
----

传统的支付系统都依赖一个中央机构提供清算服务，验证及清算交易。

比特币是去中心化分布式系统，不会也不可能去依赖任何机构。

前面一篇文章《[BTC 学习笔记连载(12)——比特币网络](https://mirror.xyz/imsongoku.eth/426_ErETShFzndck0BjDv5xTgHrYYi2NCNZQ1E3CpLw)》讲到过，比特币系统没有裁判但有规则，这些规则构成了比特币共识机制，通过这种机制交易被打包上链的同时得到了验证及清算。

**挖矿就是比特币的去中心化交易清算机制！**

![](https://storage.googleapis.com/papyrus_images/50c00fe119a91a88e59c5cb5bfe4ad72dd381292b9d07371c8f8a7bf87c21d97.png)

*   历史已Confirm的区块包含的所有交易，都已得到验证及清算 已经清算的交易就构成了历史账本 这些账本按一个个块儿先后串联起来
    
*   矿工会接着最长的合法账本继续Mining Mining是在竞争最新区块的记账权
    
*   随着矿工获得记账权，交易也就在陆续被验证及清算
    

### 这个Mining的过程具体是怎样的呢？

![](https://storage.googleapis.com/papyrus_images/ed314600b61761e889ac48e1b9fdfd2ed27c2a6ccfc894a10f64608f5d77a0a8.png)

1.  **矿工监测到最长合法链** 比特币系统中诚实节点都会跟随最长合法链挖矿； 当监测到自己跟随Mining的区块已经不满足最长合法链时，需要及时切换；
    
2.  **重新打包区块** Block body里包含的交易一般都需要重新打包，因为某些交易可能已经被最新区块打包上链了，或者已经不合法了； 显然Block header里包含的Pre Block-header Hash 也一定需要更新，因为跟随的区块已经发生变化了；
    
3.  **Mining** Block header 包含6个字段信息： - Version：版本号 - Timestamp：时间戳 - Pre Block-header Hash：跟随区块的Block header Hash - Root Hash：本区块的根Hash - Target：难度阈值，实际存储的是4个字节的nBits - _Nonce：4个字节的随机数_
    
    Mining过程就是在不停地尝试Nonce以求得满足条件的Hash值：
    
    **H（block header）<= Target**
    
4.  **获得记账权并广播区块** 找到满足条件的Nonce也就获得了记账权； 所谓的记账权就是往比特币这个去中心化账本写入下一个区块的权利； 矿工需要及时将挖到的Block广播出去； 全网其它节点验证该区块满足最长合法链后，就会跟随该Block进行挖矿；
    

Target、Nonce共同表达了矿工为获得记账权所付出的工作量，我们在《[BTC 学习笔记连载(3)——Hash](https://mirror.xyz/dashboard/edit/LrjVzhrwY3TP97Wu6luIfqeqNl6WC7NM_KufMRtlxIk)》介绍过哈希函数的Collision resistance 特性，要求解到<= Target的哈希值只能不停地尝试Nonce值，除此之外没有任何捷径。

**这个过程本质上是在进行一场算力投票。**

Target 值越小Mining越难：

![](https://storage.googleapis.com/papyrus_images/1de6f4f40daa376dcfd72019ff7f8eb6e4887db29d491c2cc58da3148d38de25.png)

比特币挖矿使用的是SHA256，整个输出空间是2^256，这是一个天文数字。

Target只占整个输出空间的极小部分，Target之小以前面有多少0来表示，0越多值越小，要找到比Target小的哈希值就越难。以16进制表示这就是一个非常小的数了，小于该值的输出空间就已经非常有限了：

0x0000000000000000000333ff0000000000000000000000000000000000000000

如果还不能理解，就想想在酒吧玩儿摇骰子，2个筛子摇出小于10点很容易，但要摇出小于3点是不是就很难了？

POW、挖矿难度、难度调整
-------------

上面介绍的Mining是基于一种自发的共识机制，矿工们争相完成哈希运算难题，这些难题的解决方案就被称为：

**工作量证明（POW：Proof of work）**

这个证明的解就是满足条件的Nonce值，矿工需要付出巨大的计算量，这是获得记账权的基础，这里我想问几个问题：

1.  全网所有的节点都在付出巨大的计算工作量，但最终只有1个获得记账权，其它的矿工的计算岂不白费了？
    
2.  当监听到一个新的合法区块时，要重新打包并跟随最新区块进行挖矿，之前付出的工作量岂不白费了？
    
3.  我们说求解Nonce的过程只能不断尝试，有可能某个矿工一上来就试出来了，不可否认Hash运算是有一定运气成分的，这对其他付出巨大算力还没有尝试出来的矿工是不是很不公平？
    

思考一下，我们后面来分析~

该Nonce值被包含在新区块Block header中，其它节点收到广播的区块后，带入Nonce值只需要做1次Hash运算就可以进行验证，这就是典型的计算困难验证容易。

正在写这篇文章的时候，比特币区块高度来到Block # 771,442，求解出来的Hash值以16进制展示最前面已经有19个0：

![16进制前面19个0](https://storage.googleapis.com/papyrus_images/61446f8ebd8af6ac6ec30f39de6865cd6d74fae78e423b47c44fb391c3f1e87f.png)

16进制前面19个0

其**难度值**（Difficulty）为：34,093,570,325,204

难度值又是怎么回事？

需要强调的是Block header里并没有存储Difficulty，也没有存储Target，而是4个字节的nBits。nBits又是什么？和Target、Difficulty之间是啥关系？

我们知道区块头SHA256 的结果是一个256位二进制数，Traget 当然也应该是一个一个256位二进制数，区块链寸土寸金，耗费32个字节来存储显然有点浪费，所以以4个字节的nBits 压缩编码来替代，nBits通过一个简单转换就可以得到Target：

**Target = coefficient \* 2^(8 \*(exponent – 3))**

nBits被存为系数/指数(coefficient/exponent)的格式，前1个字节代表指数（exponent），后3个字节代表系数（coefficient）。

以区块277,316为例，其nBits的值为 0x1903a30c，其中0x19 为指数，0x03a30c 为系数，计算Target值：

Target= 0x03a30c \* 2^(0x08 \* (0x19 - 0x03)) =0x0000000000000003A30C00000000000000000000000000000000000000000000

虽然存储的是nBits，但实际代码里用的依然是目标阈值。

搞清了nBits、Target 之间的关系，我们再来看看和Difficulty之间的关系。

Block header 里并没有存Difficulty，Difficulty是通过计算得到的。（通常在比特币浏览器里看到的N多信息其实并没有显性地记录在区块里）

中本聪的创世区块中nBits为0x1d00ffff（十进制为486,604,799），对应的难度（difficulty）为1：

![](https://storage.googleapis.com/papyrus_images/a3d7bc4965a4fade974de8ddab44c673cecea030899b409cb95d4d4fc9cfd1ee.png)

**Difficulty = Target\_Genesis / Target**

Difficulty代表挖矿难度，难度值越大Target目标阈值应该越小，创世区块的Target值是一个确定的常数，所以Difficulty和Target是互为倒数的关系。

创世区块的Target值很容易计算得到：0x00ffff \* 256 ^ 26，以[区块501509](https://www.blockchain.com/explorer/blocks/btc/0000000000000000006c5532f4fd9ee03e07f94df165c556b89c495e97680147)为例，其nBits值为0x18009645，其Target值计算结果：0x009645 \* 256 ^ 21

带入公式 Difficulty

\= （0x00ffff \* 256 ^ 26）/ （0x009645 \* 256 ^ 21）

\= 65535/38469 \* (256^5)

\= 1.703579505575918 \* 2^40

\= 1,873,105,475,221.61

可见这个难度值（Difficulty）是变化的，而且绝大多数情况难度都是在增大的，也就是Target是在变得更小，挖矿是变得越来越难的。

那么这个变化规律是怎么定义的呢？

### 挖矿难度调整

比特币系统规定每隔2016个区块就要调整难度，很容易计算其调整频率的数学期望为2周：

**（2016 \* _10_）_/（60_ \* 24）= 14**

为什么要调整难度？

前面文章讲过比特币系统每个区块的出块时长的数学期望为10分钟，但每个区块实际出块时间就是10分钟吗？

按写本篇文章时最新Block # 771,442 计算一下：

771,442 \* 10 / 60 /24 / 365 = 14.67 年

如果按每隔区块都10分钟来算，该高度已经对应到14.67年了，而我们知道前几天1月3号刚好是Genesis发布 14周年，整个系统实际出块平均时长明显是小于10分钟的。

出块时长并不是写死的10分钟，那它是由什么决定的？

**算力！**

**算力！**

**算力！**

当全网算力突飞猛进后（可能是新型矿机投入市场），Hash运算也会突飞猛进，找到Nonce的时间就会缩短，这个时候系统就需要增大难度使得未来出块时长的数学期望保持在10分钟。

当市场上的算力突然瀑布式缩减时（可能是某个市场因监管退出挖矿），整个系统计算Hash难题的时间自然就拉长了，这个时候系统就需要减小难度使得未来出块时长的数学期望保持在10分钟。

**Next\_Target = Pre\_Target \* _Actual time /（2016_ \* 10）**

从这个公式我们可以看出2016个区块实际时间**_Actual time_**，如果大于2016 \* 10 分钟就代表太难了，应该增大Target的值从而降低挖矿难度。

**Next\_difficulty = Pre\_difficulty _2016 \*_ 10 / _Actual time_**

也可以用难度值来表达，**Actual time** 如果小于2016 \* 10分钟，挖矿难度就应该增加了。

这是一个自动调整机制，不管市场火爆或是冷清，比特币系统都能持续保持稳定性，这是一个分布式系统的重中之重。

如果有一天目前的主要矿池都退出了，比特币会瘫痪吗？不会，因为全网算力爆跌，那些原本没有出场机会的GPU甚至CPU就可以回归了，比特币依然会稳定运行。

那为什么是2周？

我们知道以太坊是每个区块都可以调整难度值的，比特币为什么需要2周，我觉得中本聪当初在这个问题上也没太过深究，也没有条件验证比特币系统设置的一些参数的可行性。

2周会带来什么问题？

市场上突然陡增的算力，要2周之后才能做出反应，有可能这种陡增的算力让这2周的平均出块时长远远小于10分钟，这可能会造成一个无法修复的问题，因为比特币系统机制倾向不会去过度修复。

什么意思呢？

_Actual time 超过2016_ \* 10分钟再多都最多只按4倍来算，_Actual time 少于2016_ \* 10再多都最多只按1/4来算，所以陡增的算力太夸张，下一个周期的难度可能是修复不过来的，好在这种情况并不会经常发生。

10分钟是针对整个比特币系统算力来讲的，某个矿工如果占整个系统算力的1%，那么有可能需要1000分钟才能挖到一个区块，如果算力小到一定程度基本就跟记账权无缘了。

再提一个问题：

比特币是一个分布式系统，节点之间怎么就难度值（即nBits）达成一致呢？没有任何中心化服务器，要验证一个区块Target应该取多少呢？你说难度是3，我说难度是5，这怎么能达成一致？

多思考比特币的设计，有助于理解其它公链。

货币的发行
-----

**比特币系统的货币是通过挖矿发行的！**

除了每个区块的Coinbase铸币交易，整个比特币系统没有任何其它交易会产生新的BTC，都是在消费已经存在的BTC。铸币交易不会消耗任何UTXO，也不包含“解锁脚本“，只包含一个被称作_Coinbase_的输入，从无到有地创建比特币。

最开始每个区块铸币交易生成50个BTC，每过210000个区块奖励减半：

**21000 \* 10 / 60 / 24 / 365 ≈ 4**

这就是BTC 4年减半的由来，以此类推我们很容易计算其总量：

210000 \* 50 + 210000 \* 25 + 210000 \* 12.5 + 210000 \* 6.25 + ……

\= 210000 \* 50 \* （1 + 1/2 + 1/4 + …）

\= 210000 \* 50 \* 2

**\= 21,000,000**

这就是比特币总量2100万的由来。

2012年11月产出降到了每区块25个BTC，2016年7月降到12.5个。2020年5月区块高度来到630,000时减半再次发生，降至每个区块6.25个BTC。目前我们处在630,000~840,000之间的周期，大概24—25年奖励就会进一步降到3.125个。

新币的发行量以指数级进行32次“等分”，直到第6,720,000个区块达到比特币的最小货币单位1聪，这个大致会发生在2137年。然后在第6,930,000万个区块所有的BTC共 2,099,999,997,690,000聪，或者说约2,100万BTC将全部发行完毕。

在此之后新区块将不再包含coinbase铸币奖励，这个世界上不会再有新的比特币产生，矿工的收益将全部来自交易手续费。

这就是比特币的发行机制，不会因为任何外部市场因素多增发一枚BTC，也不会因为任何情况停止、推迟或提前增发，所有BTC都按照中本聪设置好的规则在稳定地发行。

法币可被央行无限制地印刷出来，而比特币永远不会因超发而出现通胀，总量有限且发行量递减创造了一个固定的货币供应量来抵御通货膨胀。

人类历史上出现过的所有货币，谁能比肩？

但是还是有些问题，需要操心一下：

待到比特币系统产出很小或只有交易手续费的时候，挖矿机制是否还能稳定的运转？

到时候交易手续费都能支撑矿工成本？如果交易手续费都能支撑矿工成本，那谁还舍得去转账BTC而付出高昂的手续费？

如果大型矿工都退出了比特币挖矿，是否能看到比特币回归全面电脑挖矿的时代？

### Coinbase铸币交易

每个区块的第一笔交易就是铸币交易，依然以771,442这笔交易为例，没有Input来源，在比特币浏览器里显示为Block Reward，交易的Output指向该区块矿工的地址：

![](https://storage.googleapis.com/papyrus_images/ca8230470a458e9fc67d1226775c6806168bb2ae069781a61d316f93a909eae1.png)

问个问题：

当前区块的挖矿奖励应该是6.25个BTC，为什么这里的铸币交易产出为6.31003878个BTC？

最好这些问题都能自行思考一下？

之前讲过每笔Transaction都会消耗至少1个UTXO，生成最少1个新的UTXO，当Alice有1个BTC（比如就是1条UTXO）想给Bob转0.5个时，交易需要将除开手续费的剩余再转给自己的地址，否则就会被全部当做手续费贡献给矿工（当然在使用钱包时会自动帮你处理）。

如果一个区块包含2000笔交易，是不是每笔交易的手续费fee都会以一条新的UTXO的形式转给矿工呢？

用户在签名交易的时候也不知道未来矿工是谁，地址是多少呀。

那到底是怎么处理的？

实际上整个区块的交易手续费是整合到一起，合并到Coinbase铸币交易一起转给矿工的，只需要将输入总额减去输出总额即可得到矿工费总额：

**Total Fees = Sum(Inputs) - Sum(Outputs)**

汇总计算后区块771,442矿工费总额为0.06003878个BTC，加上区块奖励一共是6.31003878个BTC。

之前讲过Coinbase交易还有另一个关键作用，还记得不？

Nonce 只有4个字节，当2^32 空间遍历完还是没有找到解时，可以利用Coinbase data部分填充任意数据，这样理论上就可以将输入空间扩展到无限大。比如中本聪在创世区块中填入的那句话一样： “The Times 03/Jan/ 2009 Chancellor on brink of second bailout for banks“，也有一些矿池会带上标识自己矿池的字符串。

### 通缩问题

通货膨胀导致货币不可避免的贬值，造成了一种隐藏的税收，惩罚储蓄者解救了债务人，政府往往以牺牲储蓄者为代价，通过贬值来抹去债务，而且在过往经验中屡试不鲜。

Cypher punk 的创始人Tim May曾今表示：加密算法将从根本上改变企业的性质和政府对经济行为的干预，而现代社会政府对经济行为最大的干预就是：**垄断货币！**

比特币就是解决这种货币垄断问题的，不但无法超发而且发行量还在递减。

递减有没有问题呢？

当然有，就是现在没有人将BTC当做一种支付货币来使用，总量有限且发行量递减让BTC成为了一种实质上的通缩货币，大家都舍不得用比特币来消费，比特币变成了一种资产。这显然不是中本聪当初发明比特币的初衷：

**Bitcoin：A Peer-to-Peer Electronic Cash System**

Wei Dai 后来表示如果当初好好看了中本聪的白皮书，一定会建议他不要使用这种通缩的模式。

Bernoulli trial、Bernoulli process、Memoryless、Poisson process、Exponential distribution & 挖矿公平性
---------------------------------------------------------------------------------------------

挖矿的过程就是不断的尝试Nonce求解区块高度对应的Puzzle，每次对Nonce的尝试都可以看做是一次**Bernoulli Trial（伯努力实验）**。

什么是Bernoulli Trial？

当一个实验只有2种结果，且2种结果出现的概率可以表示为p & 1-p，这样的实验就是伯努力实验，我们生活中一个典型的伯努力实验就是抛硬币。抛一枚质地均匀的硬币足够多的次数，p & 1-p 的概率都会接近50%，但比特币挖矿尝试Nonce成功的概率是微乎其微的，失败的概率是常态。

一系列独立的Bernoulli Trial就构成了**Bernoulli process**。

Bernoulli process的最大一个特性就是**Memoryless（无记忆性）**，或者叫做**Progress free**，这个概念怎么理解呢？

Memoryless 的特性就是说无论你做多少次Bernoulli Trial，任何历史结果对未来的实验都没有任何影响，即便硬币已经掷了1000次正面，下次掷出反面的概率依然是50%，之前的事对未来没有任何积累经验。

对挖矿来说每次尝试Nonce成功的概率很小，需要进行大量的运算才能求解Puzzle，这种情况Bernoulli process就可以用**Poisson process**来概括！

**什么是Poisson process？**

我们以一个实际例子来理解一下，公司的网络直播平台在过往650天内发生了10次故障，每次故障并不会互相影响，我们很容易知道故障之间的平均间隔时间为65天，这就是一个泊松过程：

![](https://storage.googleapis.com/papyrus_images/26c35b5e58510fe42546024cd1110a315d865d05260c737c618f2a51ea489d84.png)

*   事件之间彼此独立且随机 一个事件发生不会影响另一个事件的发生概率
    
*   事件发生的平均间隔是恒定的 但独立的事件是随机的，可能只间隔几天，也可能间隔几百天
    

如果2个事件不会同事发生，那Poisson process 就可以看做是一个Bernoulli process ，对于整个650天的每一天都是一个Bernoulli Trail，实验结果要么故障要么正常运行。

我么来看看比特币挖矿的Poisson process：

*   每次尝试Nonce成功的概率非常小，需要进行大量的尝试
    
*   每次尝试Nonce的事件之间都不会互相影响 尝试到某个值不满足要求，对未来找到合适的Nonce没有任何积累
    
*   每次找到合适Nonce耗时是随机的 可能很短，也可能很长
    
*   出块的平均时长为10分钟 类似上面例子中平均65天发生一次故障
    

比特币系统关心的是这个出块时间，系统产生下一个Block（区块）的时间，这个平均挖矿时长10分钟是通过比特币协议定义的挖矿难度来保障的，从概率推导出这个时间是服从**指数分布**（Exponential distribution）的：

![比特币系统平均出块时间10分钟](https://storage.googleapis.com/papyrus_images/f03b74d6757367fda4080a7d4a5d1b128b951dcacecbe4669ed7f470741c1bb6.png)

比特币系统平均出块时间10分钟

这张图从任意位置以垂直的线切开，剩下右边的部分依然是一样的Exponential distribution。

开篇留了几个问题，还记得不？本小节看完了就应该有答案了。

对于整个系统来讲，如果已经过去10分钟还没有出块，那还需要多久才能挖出？

**依然是10分钟！**

依然满足该概率密度分布！

这可能不符合一般人的惯常直觉，不是都挖了10分钟了吗，感觉应该块出来了。事实并非如此，这是Memoryless 的特性决定的，未来需要挖多长时间和已经挖了多长时间是没有关系的，就像抛硬币一样下一次抛出正面还是反面跟过往抛出那一面没有任何关系。

**这就是Progress free！**

无论你已经挖了多久，之前做的任何尝试对未来的Trail都没有任何影响。

那过去尽做无用功了？这个机制很不人性?

做过游戏的都知道，氪金抽卡如果N多次都没爆到好英雄，数值一般会调大神将概率以维护付费玩家良好的体验。Bitcoin为什么要Memoryless？

我们试想一下如果没有这个Memoryless的特性，有什么问题？

不知道你有没有玩过真实类赛车游戏，只要你的技术稍微比对手高出一点，那N圈下来就会拉开巨大的差距。同样很多竞技类运动都是这样的，比如游泳。

如果挖矿是Memory的，那**算力强的矿工就会有不成比例的优势！**

什么叫不成比例的优势？

Memory就代表过去做的Hash运算越多，接下来尝试Nonce的成功概率就越大。那我们假设Alice的算力是Bob的10倍，那么Alice 尝试Nonce计算Hash的速度就是Bob的10倍，随着时间的推移Alice 尝试Nonce获得记账权的概率相比Bob就会远远大于10倍。

这是一个公平的分布式竞赛不可接受的！

所以并非不人性，反而恰恰是Memoryless / Progress free 的特性保障了比特币挖矿的公平性。

当监听到一个新的合法区块时，要跟随其后重新打包挖矿，那过去做的工作全都白费了？

我想这个问题应该有答案了吧。

比特币的安全基石
--------

**Bitcoin is secured by mining！**

为什么？

经过之前文章的分享，比特币的安全性不是应该由密码学来保障的吗？

是的，椭圆曲线加密保障了个人比特币资产的安全性，任何非诚实节点没有你的私钥都不可能伪造交易将你的BTC转走，即便一个作恶节点获得了记账权发布了一笔非法交易转走你的BTC，全网任何诚实节点都不可能接受，他们不会跟随一个非法区块进行挖矿。

这又涉及到比特币系统的共识机制，所有诚实节点都在：

1.  解决工作量证明难题，竞争出块奖励；
    
2.  获得记账权的节点在区块链上记录交易；
    

这二者是比特币安全模型的基石，这是一种由激励机制驱动的正向循环：

*   正常人不会因为一己私利去破坏整个比特币系统 整个系统的坍塌也将让其拥有的BTC一文不值
    
*   诚实的节点付出大量的工作目的是要获得价值更大的奖励
    
*   作恶节点想要破坏比特币系统，需付出高昂的成本而得不到任何回报 没有人会干这种吃力不讨好的事
    
*   获得记账权的节点获得了丰厚奖励，同时还让这个由交易驱动的状态机良好地运转
    

挖矿是使得比特币与众不同的发明，是一种去中心化的自发安全机制，是点对点数字现金的基础，整个比特币系统的安全性是由挖矿保障的！

### Forking attack

从上一篇文章《[BTC 学习笔记连载(12)——比特币网络](https://mirror.xyz/imsongoku.eth/426_ErETShFzndck0BjDv5xTgHrYYi2NCNZQ1E3CpLw)》，我们知道挖矿是一定会导致Forking（分叉）的，基于比特币共识机制适当的分叉现象是正常的。

但是如果我们试图调整比特币系统某些规则的时候就会出问题，比如将比特币出块时长调整到1分钟。出块时长过长可能造成系统更加拥堵，但出块时长太短是绝对无法容忍的。因为出块时长短到一定程度时，出块越快Forking attack 越容易！

为什么？

![](https://storage.googleapis.com/papyrus_images/926f41554f3f3a9ef00600609245ab2f58c01fea6e54cce290e49f95f028e4f5.png)

如果出块时长缩短到1分钟，那必然导致有很多正常分叉，不同的算力接收到相同高度的不同合法区块，必将导致算力分散，算力的过度分散自然就会导致Forking attack所需的算力降低，到时候根本就不需要全网算力的51%，如图，如果a5后面产生了10个分叉，那节点B只需要全网10%算力就可以发动攻击了。所以出块时长之于挖矿是核心问题，一定要远大于交易及区块广播到全网绝大多数节点的耗时。

10分钟就是最合适的吗？不一定，可能8分钟更好，可能5分钟也行，但总的来说比特币运行了14年还算比较稳定的，我想这种系统安全性问题中本聪一定考虑到了的。

挖矿设备、矿池、抗ASIC
-------------

早在2012年左右，随便一台电脑就可以运行Bitcoin core 进行挖矿，而且还很容易挖出来，还记得那个用10000个Bitcoin换了披萨的哥们儿吗？挖得太容易了。

后来就发展到用GPU来挖，电脑城的显卡一度被买断货，游戏玩家们沦落到跟矿工抢显卡的局面。但其实无论是CPU还是GPU，都并不是为挖矿而设计的，比如GPU里的浮点计算对于Hash运算来讲其实没什么必要。

后来出现了ASIC（Application Specific Integrated ）矿机，整个芯片就是为比特币计算哈希值而设计的，这种矿机干不了其它的事，而且为某种加密货币设计的ASIC芯片只能挖该加密货币，除非基于同样的mining puzzle。

ASIC矿机的最大问题就是算力过时就报废了。

所以后来的Bitcoin Killer 们也研究ASIC resistance 的挖矿算法，目的就是让普通设备也能参与挖矿，从而提升整个公链的去中心化程度及安全性。

ASIC resistance 就没问题了吗？

比如目前的Bitcoin 系统，如果设计成普通电脑挖矿的模式，会有什么问题？那么美国政府可以在战时状态调用整个AWS的服务器轻松达到算力垄断，如果是ASIC矿机的话政府就必须自掏腰包购买专业矿机，这个问题我们在POW→POS一篇再来分析。

### 矿池

单个矿工即便购买了ASIC矿机，其算力跟全网总算力比也是微不足道的，有可能1年都挖不到一个块，收益是极不稳定的。

这个时候就可以加入矿池获取稳定的收益，矿池和矿工就是Pool manager — Miner的区别，这里的Miner除了执行Hash运算不需要做任何其它工作。

矿池来行使全节点的职责，打包好区块然后下发给不同的Miner，Miner甚至连自己挖的区块是否合法都不需要关心，形容他们是不明真相的群众再合适不过。

矿池汇集了大量的零散算力，然后给他们分配工作，这些不明真相的算力助推矿池进一步中心化，这对比特币系统是极大的风险。曾经有一个矿池叫Ghash.IO 的，其算力就一度达到全网算力的50%：

![](https://storage.googleapis.com/papyrus_images/3b4b7618dc3b630aebfccc13557f90f0d24eeab3c293917e65f8573b4b39bf7b.png)

如图，这些大型矿池的算力是相当大的，这几家要是合盟干点坏事，整个比特币系统必然崩掉，比特币将一文不值，还好挖矿机制让他们不会去干对自己不利的事情。

但即便这些矿池不去干毁灭整个系统的事情，在符合比特币共识机制的基础上依然可以作恶，比如算力强大的矿池拒绝打包Alice相关的交易（这是可以的，比特币共识机制里没有规定矿工必须要打包什么样的交易），只要谁打包了Alice相关交易上链，矿池就发起Forking attack，久而久之没有人再敢打包Alice的交易，这和前不久美国中心化机构要封杀部分“有问题”的以太坊地址是一样的性质。

这绝对不是中本聪当初发明比特币所希望看到的局面。

矿池的算力几种对公链来讲是弊大于利，一个好的系统本身就应该从机制上杜绝发生这种事情的可能性，这也是后来者需要思考的问题。

挖矿行业的体量是非常大的，但我的目的不是讲挖矿这项生意，比特币运行了14年了依然还比较稳定，Mining 机制有巨大的功劳。

---

*Originally published on [Crypto 吊车尾](https://paragraph.com/@imsongoku/btc-13)*
