区块链重要基础知识10——比特币挖矿

1. 比特币矿工的任务

注意:本节结合比特币的运行机制食用更佳。

1.1 主要内容

1.1.1 已经了解的:

  • 比特币依赖这些矿工们而运行的——他们查证交易记录,制造和储存所有的区块,并对被写入区块链的区块达成共识。我们还知道矿工们会从中得到一些奖励。

1.1.2 这里需要进行说明的:

  1. 这些矿工都是谁?
  2. 他们是如何进入这个行业的?
  3. 他们是怎么运作的?
  4. 他们的商业模式是什么?
  5. 他们对环境造成什么影响?

1.1.3 本节内容如下图所示:

依赖旷工的支付服务
1.这些矿工都是谁?
2.他们是如何进入这个行业的?
3.他们是怎么运作的?
4.他们的商业模式是什么?
5.他们对环境造成什么影响?
1.矿工的任务
2.矿工所需硬件
3.矿池
5.能源消耗和生态环保
4.挖矿的激励和政策

1.2 矿工的任务

要成为比特币矿工,你必须加入比特币网络并与其他节点相联。建立链接之后,需完成以下几个任务:

1.2.1 背景概念理解

其中有个总体的概念交易与区块之间的关系需要理解:

  • 交易是被打包进区块中,而各个区块之间用hash指针进行区块链,形成一个只可以进行增加不可以进行删减修改的数据库
  • 示意图如下:

交易与区块之间的关系

1.2.2 详细任务流程

  1. 验证节点阶段
    1. 维护区块链网络:可以要求其他节点把区块链上的历史记录(在你加入区块链网络之前的)同步过来。然后,监听那些被广播到网络上的新的区块。然后进行2的操作,验证区块交易
    2. 监听区块交易广播。监听时做两个验证a. a.\space然后验证每一个区块的交易签名是正当有效的;b. b.\space区块的交易输出没有被重复支付(每一个区块有相应的随机数);
  2. 制作有效的区块:
    1. 组装一个备选区块。拥有最新的全部区块链数据备份之后,可以开始制造你自己的区块了。保证你建立的新区块里的每笔交易都是正当有效的,然后将交易放进相应的区块中;
    2. 找到一个让你的区块有效的随机数。这一步的工作量最大,也是矿工工作中最难的一个环节。
  3. 和其他矿工竞争,让大家接受自己创造的区块
    1. 希望你的区块被全网接受。进入共识阶段让其他的矿工接受你的区块,然后从该区块开始继续接龙下去,而不是从别人发现的区块开始。
    2. 利润。如果所有其他矿工接受了你的区块,那你就能获取利润。
      • 在2015年,一个区块的奖励是25个比特币,大约在10 000美元左右。此外,如果在该区块里的任何交易都有交易费,所有交易费也会为矿工所有。到目前为止,交易费作为额外收入,相对来说还比较低,大概是一个区块默认奖励的1%。

1.3 对有效区块的理解以及设定

1.3.1 流程步骤2——寻找有效区块

1. 等价命题

如何找到一个使区块有效的随机数的问题?

2. 区块以及交易连接的结构

区块链主要有两层基于哈希函数的结构。

  1. 区块链上,每个区块的头部都有一个指针指向其前一个区块,
  2. 在每一个区块里,包括所有交易的梅克尔树。

3. 寻找有效区块的步骤:

  1. 从你的交易池中选出一系列有效的交易并且编译成梅克尔树;交易数<<上限

  2. 将默克尔树与其他相关数据组装成一个新的区块,新区块有两个部分应该注意:

    1. 新的区块头部指向区块链上的前一个区块;
    2. 新区块的头部,有一个32位的随机数区域,做到该随机数能使整个区块的哈希值<<目标值。
      1. 出现随机数始终满足不了条件的时候:
        • 可以尝试更改币基里面的随机数,但是不能更改其他交易的随机数,这是由于币基是自身节点用来创造比特币的,所以随机数在这个阶段是能够进行改动的,但是其他交易就不一样了,在交易发起的时候就已经进行了设定;

    寻找有效区块

4. 一个疑惑:每个人都在运算同一个谜题吗?

  • 首先可能不在同一个区块;
  • 其次即使在同一个区块的话,由于默克尔树底层是hash实现的原因使得只要结构中交易有一点不同或者次序有一点不同就可能导致最后的结构大相径庭

1.3.2 设定有效区块的决定难度

1. 历史难度

其难度:在2015年之前,大约2682^{68}个临时随机数里只有不到一个可以成功

2. 下一个难度公式以及意义

但是这个难度其实是不断变化波动的,每挖出2 016个区块,挖矿难度会改变一次,这个周期大约是两个星期。难度的改变是根据上2016个区块的挖矿效率来决定的。公式如下:
=×2016×102016 下一个难度=\frac{上一个难度 \times 2016 \times 10分钟}{产生出2016个区块所花费的时间}
注:2016×10=2016 \times 10分钟=两周

意义:测量全网难度进而维持平均每10分钟产生一个新的区块的速度,作为平衡的一个作用:

  1. 如果这个周期太短,难度会随着每一个周期找到的区块的数目的不同而波动(概率问题)。
  2. 如果太长,整个网络的哈希算力会与难度大大地失去平衡(难度的调整滞后于计算能力的变化),最终产生很多漏洞

3. 难度趋势变化以及规律总结

挖矿难度会随着时间不断地增加。其增加不一定是稳定线性或者是指数型,矿工越多使之效率增加那么随之而来挖矿难度自然也会相应变化,有一个不是线性的那么最终的变化就不会是线性的

找到一个有效区块所花费的时间2014年

找到一个有效区块所花费的时间2015年

  • 注:y轴开始于460秒。找到一个有效区块花费的时间是2 016个区块样本花费时间的平均值。由于当时全网挖矿速度的连续快速增长,找到一个有效区块所花费的时间在两周的时间内稳步减少。

所以区块产生时间的增长有一个水平线进行衡量,是根据上一个难度区间2016个区块的平均效率来定,如果大于平均算力的话就上升,小于的话就下降,这仅仅是针对于一个难度区间时间内的,因为在一个难度时间区间它的难度是不变的,之后就需要重新进行调整

糟糕的情况就是“死亡螺旋”:不断下降的比特币价格导致挖矿无利可图,矿工们因此而退出挖矿(全网运算能力下降),继而进一步导致价格下跌

2. 挖矿所需硬件

2.1 挖矿的难度——hashhash函数

挖矿难度主要在于hashhash函数,而区块链主要使用的hashhash函数SHA256SHA-256,之所以选择这一hashhash函数是因为在当时的加密算法里面,SHA256SHA-256的安全性是最高的,其原理如下图:

SHA-256原理

SHA-256名称中的“256”代表它有256位的状态和输出,属于SHA-2家族,现在已经有更加安全的SHA-3出现,但是区块链的时候只是SHA-256,所以最终使用的也是SHA-256函数

每一轮运算选择一定数量的字段——有些会进行一些小的逐位调整

2.2 线性反馈移位寄存器

线性反馈移位寄存器是hash函数的设计灵感:

  • 每一轮运算选择一定数量的字段——有些会进行一些小的逐位调整——最终进行32位模加法运算(modular addition),然后运算结果被移到状态最左的第一个字段,这样使得整个状态进行向右位移。这种设计的思路来自简单位的线性反馈移位寄存器(LinearFeedback Shift Registers,简称LFSR)。

2.2.1 定义

因为有相应的反馈函数,并没有中间的运算都是根据反馈函数计算的,而且变量就存在了每一个寄存器中;

  • 线性反馈移位寄存器(linear feedback shift register, LFSR)是指,给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。

    输出到
    前一状态
    当前

    线性反馈移位寄存器

其中,gng_n为反馈系数,取值只能为0011,取为00时表明不存在该反馈之路,取为11时表明存在该反馈之路;这里的反馈系数决定了产生随机数的算法的不同。用反馈函数表示成y=a0x0+a1x+a2x2.......y=a_0x^0+a_1x+a_2x^2.......反馈函数为线性的叫线性移位反馈序列,否则叫非线性反馈移位序列。

首先我们看最简单的反馈函数的线性反馈移位寄存器:y=x0+x1+x2+.......y=x_0+x_1+x_2+.......如下所示:

  • 我们首先得明确输入以及输出;\oplus为异或运算

最简单的线性反馈移位寄存器

那么它具有以下几个特性:

  1. 初始状态相同,输出序列相同(也就是说初始状态决定输出序列)
  2. 输出序列看起来是随机序列,但是达到一定位数后会循环
  3. LFSR可以产生的最长的随机序列是2n12^n−1的长度,其中nn表示寄存器数目
    • 由于这些特性,LFSR常被用来生成随机码,在密码学中有重要应用。大名鼎鼎的CRC就可以通过LFSR来产生和校验。在很多文章中,尤其是计算机相关的研究中,人们更多的把LFSR用多项式来表示。

2.2.2 非线性反馈分类

两种类型的非线性反馈:

  1. 斐波那契LFSR也可以称为多到一型LFSR,即抽头序列对应bit位置的多个触发器的输出通过异或逻辑来驱动一个触发器的输入。如下图所示:

    斐波那契LFSR1
    斐波那契LFSR2

  2. 伽罗瓦LFSR和斐波那契刚好相反,它是一到多型的LFSR,即最后一个触发器的输出通过与抽头序列对应位置触发器前一级触发器的输出异或逻辑驱动多个抽头序列对应位置触发器的输入。如下图所示:

    伽罗瓦LFSR1

    伽罗瓦LFSR2

2.3 三种挖矿方式:CPU和GPU、现场可编程门阵列挖矿

2.3.1 CPU挖矿

CPU挖矿的伪代码如下:

TARGET(65535 < 208) / DIFFICULTY;
coinbase_nonce;
while (1)
{
    header = makeBlockHeader(transactions, coinbase_nonce);
    for (header - nonce - ; header_nonce < (1 << 32); header_nonce +)
    {
        if (SHA256(SHA256(makeBlock(header, header_nonce))) < TARGET)
            break; //block found!
    }
    coinbase_nonce++;
}

一台高端的个人桌面电脑,每秒可以计算大约2千万次哈希函数(20MH/s),按照这个速度,根据2015年早期的难度水平(267),大概需要几十万年来找到一个有效区块。

2.3.2 GPU挖矿

优势:GPU都有高吞吐量和高并行处理功能

缺点:有大量的内置硬件来进行图形处理,这些特定硬件对比特币挖矿没有任何用处,比如它们大量的浮点运算单元(floating point units),在SHA-256的运算中完全用不到。

一个非常高端的显卡经过超频之后可能使得运行速度达到200MH/s,也就是说,每秒可以进行2亿次哈希运算,这是用CPU不可能达到的一个数量级

2.3.3 现场可编程门阵列挖矿

FPGA的工作原理是在追求定制硬件的最佳性能的同时,用户可以现场调试或者修改硬件参数。

计算速度:精心使用FPGA可以使得运算速度上升到1GH/s,也就是每秒10亿次哈希运算

但是有两个很严重的缺陷:

  1. 需要一直超频使用,容易产生很多报错和故障;
  2. 优化FPGA的32位加法处理上十分困难,而这在SHA-256的运算中非常关键。

最关键的是即使牺牲了这么多但是在性能功耗的提升仍然只有这么多

2.3.4 专用集成电路技术挖矿

当今的挖矿市场主要被ASIC所主导。这些IC芯片(集成电路芯片)被设计、制造、优化,就是为了比特币挖矿这个唯一目的,但是ASIC芯片的寿命十分短暂,因为他的性能不断被更先进的淘汰

2.3.5 如今:专业挖矿的天下

矿已经从个人领域转到了大型专业挖矿中心。为了保持竞争优势,运作这些挖矿中心的公司不愿意公布其运营细节。据猜测,这些运营者大量采购打过折的更新的功效更高的ASIC矿机而不是采购那些能够直接出售给个人的ASIC矿机来维持利润。

挖矿中心

挖矿中心,需要具备三个重要因素:气候(温度较低)、电费(便宜)、网络接入速度(稳定且快),所以格鲁吉亚和冰岛成为比特币挖矿中心的首选之地。

与挖金矿有相似之处:

  • 而历史上的挖金矿则是从个人拿着盘子在沙里淘金,到一小群人用流沙槽来淘金,再到一群人用水冲刷金山来淘金,直到现代机械化露天挖矿。比特币与黄金都从个人操作为主逐步演变为大公司专业运作。另外一个相似点就是,大多数的利润都被设备制造商拿走了,不管是黄金采掘设备还是比特币ASIC矿机生产商,而埋单的都是那些希望一夜致富的人。

    1.人拿着盘子在沙里淘金
    2.用水冲刷金山
    3.现代机械化露天挖矿
    挖金矿
    淘金
    演变为大公司运作
    挖比特币矿
    相同点
    1.大多数的利润都被设备制造商拿走了
    2.演变为大公司运作

有个问题值得思考:

  • 用ASIC挖矿是唯一一种可以赚钱的比特币挖矿手段,但对个体矿工来说周期长以及定价高。那么未来的发展如何?
    1. 小规模矿工是否永远不可能再参与到比特币挖矿中?
    2. 是否有办法把小规模矿工重新纳入挖矿体系中去?
    3. 更重要的是,现在使用的ASIC和专业挖矿中心是否已经违反了比特币当初设计的初衷:一个完全去中心化的系统,在这个系统上里每个人都能用自己的电脑去挖矿。

并且及时有其他的币种,如果依旧与比特币原理类似,必然导致它也会和比特币经历同样的阶段。从CPU到GPU,再到FPGA,或者直接到ASIC的过程并且如果想要经历这些阶段前提还需要这些币种比较成功。

3. 能源消耗和生态环保

算力单位换算如下图所示:

算力单位

3.1 蓝道尔原理:

任何一个不可逆转的计算都会消耗一定的能源。而挖矿就是一种不可逆的计算

3.2 能源消耗的几个方面

每进行一个不可逆的数位运算都会消耗一个最小量的焦耳,能源都是从一种形式转变成另外一种形式,那么比特币挖矿的过程是如何消耗能源的?

  1. 内涵能源:原材料被生产的时候消耗的能源
  2. 电能:当矿机启动开始挖矿时,它就会消耗电能
  3. 冷却:在非常寒冷的地方可以降低冷却成本

内涵能源和电能的消耗(每单位挖矿工作完成)会随着挖矿运营规模的增加而降低,这是由于批量化的原因,但是冷却问题的时候却恰恰相反,这是一个不可控制的因素

3.3 能源消耗估算方法

两种能源消耗估算方法,但是这些仅仅只是估算,如果有人拿它作为一个很可靠的东西,那么本身就不可信。

  1. 自上而下:通过比特币奖励从而计算相应的美元,把对应非美元换成电力数目
    • 奖励→电力
  2. 自下而上:通过难度以及每秒钟产生多少哈希数来计算最终消耗的电力,有个参照物就是:好的商业化矿机的功效数值差不多是3GH/s/W

3.4 如何有效地利用系统抵消能源消耗?

那么比特币这样一个系统是在浪费电力吗?这就在于我们是否认为它是一个有用的系统

如何有效地对能源进行循环使用:现在提出的想法就是把它运算时的热量当做一个取暖器

将电力转换为现金:由于政府对电力的一些补贴,所以这就对挖矿的时候电力提供了一些帮助,也是一种将电力转换为现金的方式。

4. 矿池

4.1 矿池的背景——高方差

从矿工第一年能找到有效区块数的概率分布上看,这个分布差异是很大的,期望值(也就是第一年能找到区块的平均数)是相当的低。

4.2 矿池的运营模式以及分发方式

矿池应运而生——矿池就是一个比特币矿工互相之间的保险。一组矿工可以形成一个矿池共同进行挖矿,并指定一个币基接受人。这个接受人就是矿池管理员。

  1. 矿池管理员如何知道矿池里每个成员实际上到底贡献了多少工作量呢?

  2. 同时他又是如何去分发收入的呢?

    1. 挖矿工分:通过与有效区块的接近程度证明他的工作量

      挖矿奖励

      1. 工分分红:矿工在发送工分之后,管理员马上就会对其支付奖励,而不需要等到整个矿池发现一个有效区块。
        • 不好的地方:一个恶意的管理员可以作为矿工参与另外一个矿池,用这个方法攻击另一个竞争对手,让他的矿池无法维持下去
    2. 按实际比列分红:每次找到一个有效区块才会按照工分对每个矿工进行分工,这样的分红方式实质是对管理员增加了压力,他要校验、计算和分配奖励

4.3 应对频繁的矿池转换——矿工在不同矿池的跳转

矿池转换是我们需要考虑的问题:由于人们想要获取高的奖励,采取以下措施:

  • 在挖矿周期的早期(也就是上一个区块刚刚被发现),在按实际比例分红的矿池中挖矿,这个时候的奖励可能相对比较高,然后只在周期的后期切换(“跳”)到一个工分分红模式的矿池,因为这个时候按实际比例分红的矿池收益可能相对较低。但这样导致的结果就是按比例分配的矿池可能无法运行。

一些方法可以在一定程度上防止这些事情的产生,比如:根据最近N个工分提交的结果才分配”

4.4 矿池协议API

矿池协议也提供了API,用于矿池管理员与每个矿工交流分派工作矿工们递交工分给管理员。获取有效区块模版(getblocktemplate,简称GBT)就作为一种标准化的矿池协议放进了比特币改进方案(Bitcoin Improvement Proposal,简称BIP)之中。

从事存在多个互不兼容的矿池协议没有造成太多的不便,最终可以由市场判定谁更好

有些做了一种优化,将协议写进硬件,那么只要一插上电就能够将电能转换为收益

4.5 矿池的优缺点

在2014年6月,网络里最大的矿池GHash.IO,曾经变得如此巨大,其算力甚至超过了比特币全网算力的50%。

矿池有可能会掩盖这样一个事实:实际上的算力集中在几个大的挖矿机构手上,这些大的机构可以同时参与多个不同的矿池以掩盖它们的真实规模。这种做法被称为“洗算力”

好处:

  1. 每一个矿池都有一个中心化的矿池管理员在网络中组装区块,所以网络更新变得更加容易;

坏处:

  1. 中心化管理。矿池管理员实际掌握了多大的算力
  2. 减少了比特币网络上校验全部交易节点的数量(全节点),慢慢演变成了一个矿池算作一个全节点

5. 挖矿的激励和策略

在挑选一个区块开挖之前,做策略上的选择:

策略选择
1.包括哪些交易
默认选择那些交易费比较高的交易
2.对哪一个区块进行挖矿运算
默认在最长的那条区块链上继续挖下去
3.在同一高度的多个区块中做选择
默认选择最先被监听到的那一个区块
4.什么时候宣布新的区块
默认立刻宣布

这四种选择都是根据自己选择而定德,但是最终网络只是认可最长的链

5.1 区块奖励时期存在的一系列攻击:

  1. 分叉攻击:

    1. 显而易见的获利方式——重复支付

    2. 一个恶意的矿工给一个受害者鲍勃发送了一些比特币来购买其服务和货品。鲍勃等到这笔支付交易被放进了最长链之后,甚至还等到了6个证实的时候确认支付安全之后,才开始发货或者提供服务。现在这个矿工开始跳到前一个区块上开始重新挖矿——就是在那个包含他给鲍勃的支付交易区块之前的那一块。在这个分叉的区块链里,他插进了另一个替代交易——或者进行一个双重支付——把那些已经支付给鲍勃的比特币重新发送回自己的地址里

      6个证实的时候确认支付安全
      跳到前一个区块上,已经提交的区块
      恶意的矿工
      受害者鲍勃
      交易
      上面的交易
      最长链
      开始发货或者提供服务
      重新挖矿
      替代原本的那个交易,转移比特币地址
      攻击能够成功?
      只要足够的节点进行确认,原先的就会失效
      • 想要这个攻击成功,被分叉的区块链必须要覆盖当前最长的一条链,一旦这个情况发生,支付给鲍勃的交易就不再存在于共识的区块链里。如果这个矿工掌握占优势的哈希算力的话,也就是说α > 0.5,这种攻击就会成功。
        1. 如果α > 0.5的话,发动一个分叉攻击是很有可能发生的。
        2. 拥有近乎50%算力的攻击者可能需要花很长时间才可能成功,因为有随机性。
      • 这类攻击最大的影响并不是它获得的短期收益,而是摧毁大家对比特币的信心,比特币的拥有者们就想要把资产转移出去,以至于比特币价格崩溃。
  2. 通过贿赂来进行分叉攻击:

    1. 系统外的”(out of band)——可能找到一些矿工然后直接用现金来贿赂他们。;
    2. 一个更加聪明的办法是创建一个新的矿池,然后提供更好的奖励来吸引其他矿工来加入,虽然不能长期维持但是可以有效地做到一个分叉攻击
    3. 贿赂可行需要在很多假设的前提下,比如人们想要去图一个眼前的利益
  3. 临时保留区块攻击:

    • 找到一个区块之后,不立即宣布,在这块上面继续挖矿,期望你可以在其他矿工找到下一个区块之前连续找到两个有效区块,在整个过程中秘密地保留你所发现的区块。

    • 这样导致的事情就是你一下拿出比别人更长的区块链,使得别人多日的努力付诸东流,这样能够使得你的获得比之前正常情况下增加一部分

      临时保留区块攻击2

    • 收益可能比我们想象中的高:假设只有50%的机会可以赢得这个竞赛,在α>0.25的情况下,自私挖矿可以比默认策略更有收益。如果α>0.333,即使你输掉每一个这种竞赛,仍然可以获得更高的收益。

      • 与原本人们所以为的相悖,以为的是:如果没有很大的算力——比如α≤0.5——不会有比默认策略更有利的挖矿策略。
  4. 黑名单与惩罚分叉攻击

    1. 想把一个来自地址X的交易列入黑名单,换句话说,他想冻结从该地址出来的钱,让这些钱变得不可用。或许他想用这个办法来敲诈勒索一笔钱,黑名单可能难以在比特币的世界中实施,但是另外一种手段却可以成功实施:惩罚分支
    2. 惩罚分支:
      1. 可以宣布拒绝在包含来自该地址的交易的区块链上工作。如果你拥有大部分市场运算能力,那应该足以保证这个黑名单上的交易永远不会被公布。
  5. 羽量级分叉

    1. 如果没有很大的算力,上述的几个分叉攻击在现实中都不太可能实现。甚至可能导致自己的利益受损,比如:
      1. 如果你宣布拒绝接受包含某些特定交易的区块链,但这条链被网络上的其他矿工所接受并形成最长链的话,你就会发现自己被永远排除在共识链之外(这就是一个硬分叉),所有你做的挖矿工作统统浪费了。更加糟糕的是,黑名单上的交易仍然存在于最长的区块链上。
      2. 与其一看到从地址X里出来的交易就宣布你会进行永久分叉,不如宣布你将会尝试分叉,这样是一种心理上的策略,通过宣称让别人相信你将会进行这样一个分支,告诉别人接收来自地址X的交易是有危险,但是这个前提是你的让人相信,实际上来说概念已经是2\partial^2,比较小,利用的是人们的心理

参考文章:

1.线性反馈移位寄存器

2.线性反馈移位寄存器的分类

3.教你如何看懂比特币算力“EH/S”、“PH/S”、“TH/S”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章