挖矿
一、概念
- 谁来发币?
- 谁来验证交易?
- 谁来维护账本?
挖矿就是网络中的维护节点,通过协助生成和确认新区块来获取一定量新增比特币的过程。
映射到分布式账本上来讲,挖矿就是竞争记账权。
区块链设计了一套算法以保证10分钟左右生成一个新区块,并奖励挖矿成功者。
每个区块的奖励最初是 50
个比特币,每隔 21
万个区块自动减半,即 4
年时间,最终比特币总量稳定在 2100
万个。
二、过程
挖矿的过程:
- 选择一个随机数(nonce)
- 在交易池中挑选交易,将这些交易列表放入
block body
中。 - 计算
Hash(block header + nonce)
- 如果
Hash(block header + nonce)< target
,则证明你有能力解决这个问题,可以获得记账权。 - 否则,重复上述过程,直到找到符合条件的 nonce。
挖矿的目标值:
- 目标值越大,挖矿难度越小
- 目标值越小,挖矿难度越大
- 目标值根据网络的总算力和区块生成时间动态调整,以保持平均每 10 分钟生成一个新区块。
挖矿的奖励:记账权 + Block Reward
- 矿工将获得一定数量的比特币作为奖励。起始为 50 BTC,每 210,000 (大约 4 年)个区块减半。
- 在挖矿开始前,矿工会在交易池中挑选交易,将这些交易打包成区块。 除了区块奖励,还有这些交易的交易费用作为奖励。
- 这个激励机制鼓励矿工们积极打包交易,并帮助网络的运行。
行使记账权
- 所谓记账权,其实就是候选区块转正的过程。
- 一旦成功挖矿成功将拥有记账权,矿工将完整的新区块(包括其哈希值和所有打包的交易)提交给区块链网络。
- 其他节点将验证该区块,并将其添加到自身节点维护的区块链中
关于挖矿
- 挖矿的过程不具有可预测性,即前一次的结果与后一次计算没有任何因果关系,每次都是独立重复。
- 挖矿的过程需要消耗大量的计算资源,这些计算本身毫无意义。
// 区块的大致结构
{
"block Header": {
// 区块头
"Hash of previous block header": "", // (指向前一个区块指针)
"target": "", // (挖矿难度目标阈值)
"nonce": "", // (随机数)
"Merkle root hash": "" //(默克尔树根哈希)
},
"block body": {
"transactions": [] //(交易列表)
}
}
2
3
4
5
6
7
8
9
10
11
12
13
三、挖矿难度
挖矿本质上就是不断调整 block header
中的 nonce
值,使整个 block header
的哈希值小于等于给定的目标阈值。 即:H(block header) <= target
.(target 便是目标阈值,target 越小,目标难度就越大)。
对于挖矿难度的调整,可以视为调整目标空间在整个输出空间中所占比例大小。
在比特币系统设计中,区块链的出块时间保持在平均 10min 左右。 系统总算力越来越强,若挖矿难度保持不变,则出块时间会越来越短。
3.1 出块时间越来越短是好事吗?
出块时间缩短,那么交易可以很快便被写入区块链,并且提高了系统响应时间,增加了区块链系统效率。但是,出块时间并不是越短越好, 出块时间太短也会造成一定的问题:
首先,区块在网络上传播具有时延,假如出块时间为 1 秒,但网络传播需要 10 秒,则会使得系统中节点经常性处于不一致的状态,增加了系统不稳定性,且系统经常性位于分叉状态(不仅二分叉,乃至多分叉)。
分叉过多,则不利于系统达成共识,且会造成算力分散,使得黑客攻击成本大大降低(不再需要整个系统 51%的算力)。
3.2 10min 的出块间隔是最优吗?
当然不是。 但可以确定的是,系统出块时间需要维持在一个定值附近。
以太坊中平均出块时间仅为 15 秒左右,但同样在以太坊中也有相应难度调整算法维持其平均出块时间,当然 15s 的时间明显会产生经常性的分叉,所以以太坊设计了新的共识协议 Ghost。
当然,对于一个交易系统来说,10min 这样一个交易时间是比较长的。但对于跨国交易来说,这个时间反而大大缩短了交易时间,减少了相应成本。
3.3 系统如何调整挖矿难度
在 BTC 协议中规定,每隔 2016 个区块需要调整一次难度,根据 10min 产生一个新区块可以得到,大概需要 14 天的时间。具体调整公式如下:
actual time
: 系统中产生最近 2016 所花费的时间expected time
: 预期时间
可见,如果实际实际比较长,target 会比较大,相应的挖矿难度会降低;如果实际实际比较短,target 会比较小,相应的挖矿难度会增大。
3.4 如何让所有矿工都愿意调整这个挖矿难度?
这一调整算法在代码中已经写入,如果有恶意节点故意不调,其所产生的区块不会被大多数诚实的节点承认。
在 block header
中有一个 nbits
的域,它是对 target 的编码存储(target 为 256 位,nbits
为 32 位,也就是说 block header 并未直接存储 target),其他节点在进行合法性验证时候会验证 nbits
域是否合法,不合法则对该区块不予以承认。
四、挖矿设备演化
2010 年以前,挖矿还是一个非常热门的盈利行业。
但是随着相关技术和设备的发展,现在个人进行挖矿的收益已经降得很低。从概率上说,由于当前参与挖矿的计算力实在过于庞大(已经超出了大部分的超算中心),一般的算力已经不可能挖到比特币。特别是利用虚拟机来挖矿的想法,已经基本不可能了。
从普通的 CPU(2009 年)、到后来的 GPU(2010 年) 和 FPGA(2011 年末)、到后来的 ASIC 矿机(2013 年年初,目前单片算力已达每秒数百亿次 Hash 计算)、再到现在众多矿机联合组成矿池(知名矿池包括 F2Pool、BitFury 等)。短短数年间,比特币矿机的技术走完了过去几十年的集成电路的进化历程,甚至还颇有创新之处。高回报刺激了科技的飞速发展。
目前,矿机主要集中在少数矿池手中,全网的算力已超过每秒 10^20 次 Hash 计算。如果简单认为一次 Hash 计算等同于一次浮点运算,那么比特币全网算力将等同于 500 台 Summit 超级计算机(目前最快的超级计算机,由 IBM 和 Nvidia 于 2018 年研制)。
定制
ASIC
芯片 只能挖某一种固定的币, 除非有相同的miming puzzle
(挖矿算法)
ASIC 芯片的出现是好事吗?
很明显,ASIC 芯片一定程度上提升了挖矿的门槛,违背了比特币系统去中心化的初衷。理想状态下,所有人用 CPU 挖矿,这样只要有一台家用计算机便可以参与挖矿。当然,后续有一些货币便考虑到了这个问题,设计了抗 ASIC 芯片化的解决方案。
但反过来想,如果大家都用 ASIC 矿机挖矿,如果有人想要颠覆 BTC 系统,必然会导致 BTC 价格跳水,从而导致其所购买 ASIC 矿机作废,投入成本血本无归。所以,很多人反倒认为 ASIC 芯片出现,一定程度上并不是坏事。
五、矿池
挖矿另一个趋势便是大型矿池的出现。
对于单个矿工来说,即使使用了 ASIC
矿机,其算力在整个系统中仍然只占据很少一部分,即使从平均收益看有利可图,但收入很不稳定。 此外,单个矿工除挖矿还要承担全节点其他责任,造成了算力的消耗。
因此,为了解决这些问题,便引入了矿池的概念。
通常是一个全节点驱动多台矿机。矿工只需要不停计算哈希值,而全节点其他职责由矿主来承担。ASIC
芯片只能计算哈希值,不能实现全节点其他功能。此外,矿池出现解决了单个矿工收益不稳定的问题。当获得收益后,所有矿工对收益进行分配,从而保证了收益的稳定性。
矿池一般具有两种组织形式:
- 类似大型数据中心(同一机构),集中成千上万矿机进行哈希计算。
- 分布式。矿工与矿主不认识(不同机构),矿工与矿主联系,自愿加入其矿池,矿主分配任务,矿工进行计算,获得收益后整个矿池中所有矿工进行利益分配。
矿池的出现,使得矿工的收益更加稳定,矿池的收益也更加公平。
大型矿池越容易发动攻击
矿池本身对 BTC 系统带来了较大威胁。某个恶意用户如果想发动攻击,以前需要自己达到 51%算力,现在自己只需要作为矿主,只需要很少一部分算力就可以了。只要能够吸引到足够多的不明真相的矿工,便可以用较低成本实现 51%攻击。
- 分叉攻击
- 对已经经过 6 次确认的交易分叉,利用 51%算力将交易记录回滚。
- 封锁交易
- 假如攻击者不喜欢某个账户 A,不想让 A 的交易上区块链,在监听到有其他人将 A 的交易发布到区块链上时,立刻发动分叉攻击,使 A 所在链无法成为”最长合法链“。这样,便实现了对 A 账户的封锁。
矿池出现的优劣
- 优点:解决了矿工收入不稳定的问题,减轻了矿工的负担。
- 缺点:威胁到了区块链系统的安全,使得 51% 攻击变得容易起来(s)。
关于全节点和轻节点
全节点 | 轻节点 |
---|---|
一直在线 | 不是一直在线 |
在本地硬盘上维护完整区块链信息 | 不保存整个区块链,只需要保存每隔区块块头 |
在内存中维护 UTXO 集合,以便于快速检验交易合法性 | 不保存全部交易,只保存和自己有关的交易 |
监听比特币网络中交易内容,验证每个交易合法性 | 无法验证大多数交易合法性,只能检验和自己相关的交易合法性 |
决定哪些交易会打包到区块中 | 无法检测网上发布的区块正确性 |
监听其他矿工挖出的区块,验证其合法性 | 可以验证挖矿难度 |
挖矿: 1.决定沿着哪条链挖下去。 2.当出现等长分叉,选择哪一个分叉 | 只能检测哪个是最长链,不知道哪个是最长合法链 |
在比特币网络中,大多数节点都是轻节点。 如果只是想进行转账操作,不需要挖矿,就无需运行一个全节点。
在挖矿过程中,如果监听到别人已经挖出区块延申了最长合法链,此时应该立刻放弃当前区块,在本地重新组装一个指向最后这个新合法区块的候选区块,重新开始挖矿(挖矿本身具有无记忆性,前面无论挖多久,对后续继续挖矿没有影响。)。