美文网首页
[区块链 Sec5] 比特币挖矿

[区块链 Sec5] 比特币挖矿

作者: 梦中睡觉的巴子 | 来源:发表于2018-09-29 01:08 被阅读0次

1 比特币矿工的任务

要成为比特币矿工,你必须加入比特币网络并与其它节点相连。建立连接后,还有六个任务要完成:

  1. 监听交易广播,验证它们的签名是有效的,交易输出没有被重复使用。
  2. 维护区块链网络和监听新的区块,验证每个收到的区块(保证每笔交易有效)其包含了有效的随机数
  3. 组装一个备选区块
  4. 找到一个让你的区块有效的随机数
  5. 希望你的区块被全网接受
  6. 利润,如果你的区块被接受,就能获取利润

矿工的任务可以分为两类,第一类是验证交易和区块,这也是比特币网络赖以生存的基础。第二类是和其他矿工竞争并获益,这些任务实质上不是必需的,但却是为了鼓励矿工去完成第一类任务而设置的。

寻找有效区块

前文我们提到区块链主要有两层基于哈希函数的结构。第一层在区块链上,每个区块头部都有一个哈希指针指向其前一个区块,第二层是在每一个区块里,包括所有交易的梅克尔树。

作为矿工,首先需要从交易池中选出一系列有效的交易并编译成梅克尔树。然后,组装出一个新的区块,让它的头部指向区块链的前一个区块。新区快的头部,有一个32位的随机数区域。你需要尝试不同的随机临时数,直到能使整个区块的哈希值小于目标值。这个目标值一般体现为以零开始的特定位数的数值。你可能使随机数从0开始,每次自增1,直到使区块有效为止。

image

在大多数情况下,随机数试过所有32位可能后,仍然不能产生一个有效的哈希值。这个时候,值得注意的是,币基(coinbase)里还有一个随机数可以改动。当改变币基里的随机数后,在梅克尔树上会向上传递,产生大量哈希值的变更,所以矿工大部分只改动头部的随机数,除非真的遍历头部所有随机数可能仍无法成功,才改动coinbase中的随机数。

决定难度

每挖出2016个区块,挖矿难度会改变一次,这个周期大约是两个星期。难度的改变是根据上2016个区块的挖矿效率来决定的:

下一个难度=上一个难度x2016x10分钟 / 产生上2016个区块所花费的时间

此处的2016x10分钟就是两周,这个公式意义就是测量全网难度进而维持每10分钟产生一个新的区块的速度。

每个比特币矿工独立地计算难度,只接受达到这个难度的区块

挖矿所需硬件

由CPU到GPU,由GPU到FPGA,再由FPGA到ASIC


2 挖矿的激励和策略

在挑选一个区块开挖之前,每个矿工都需要做一些策略上的选择:

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

矿工面临很多策略,每个决定都有一个默认策略。绝大多数客户端都是按照默认策略运行的。非默认策略也有可能使挖矿收益更高,在接下来的内容里,我们假设一个运行非默认策略的矿工掌握一定的比特币网络挖掘市场份额,设为α

分叉攻击

最简单的攻击就是分叉攻击(forking attack),这是一个显而易见的获利方式——重复支付。

一个恶意的矿工给一个受害者Bob发送了一些比特币来购买服务或者商品,Bob等到这笔支付交易被放进最长链之后,甚至等到了6个证实确认安全之后,才开始发货或者提供服务。
现在这个恶意矿工开始跳到前一个区块开始重新挖矿——包含给Bob支付交易的区块之前的一块。在这个分叉的区块链中,他插入了一个替代交易——比如一个双重支付。


分叉攻击

想要这个攻击成功,被分叉的区块链必须要超过当前最长的一条链,如果这个矿工掌握占优势的哈希算力,也就是α>0.5的话,这种攻击就会成功。(但实际上,51%算力不是必要条件,而是一个分水岭)

事实上,这种攻击可以被察觉到,而且这种攻击可以摧毁大家对比特币的信心,比特币的拥有者就想把资产转移出去,以至于比特币价格崩溃。
因此,虽然一个具有51%算力的攻击者可能会在短期内利用双重支付获取收益,但从长远来看,其实这么做造成的损失可能更大。除非攻击者的本意就是摧毁比特币。

通过贿赂来进行分叉攻击

通过掌控大部分算力来进行分叉攻击,是一件非常困难的事情。
但存在更简单的方法来进行分叉攻击:贿赂那些有能力的矿工来为你工作

  1. 系统外部贿赂
  2. 利用矿池的高额奖励
  3. 分叉交易留下足够多的”小费”

核心思路都是去贿赂已经拥有算力的人,让他们帮助自己分叉出另外一条最长的区块链。

临时保留区块攻击

假设找到一个区块之后,默认的做法是你会立刻向全网宣布找到的区块。
但是你也可以不立刻宣布,然后在这块上面继续挖矿,期望你可以在其他矿工找到下一个区块前连续找到两个区块,在整个过程秘密保留你发现的区块。

如果你已经拥有两个公共区块链上超前的秘密区块,那么全网剩下的矿工所做的挖矿努力都会被浪费,其他矿工都会在他们认为最长的链上继续挖矿,一旦他们宣布找到了一个有效区块,你可以立刻宣布你所秘密保留的两个区块,这样你的区块链立刻变成了最长的区块链,而其他人辛苦挖出来的区块就变成一个孤块被丢弃。这种行为被称为自私挖矿(selfish mining),通过使其他矿工浪费算力计算出来的区块瞬间过期,可以有效增加你的挖矿获利。

自私挖矿

这里面的关键在于你需要运气好到连续发现两个区块,风险在于你只领先了一个区块,其他人就已经宣布了一个有效区块,这个时候你必须立刻宣布你的秘密区块,造成一个区块的分叉。这种攻击的有效性严重依赖于你的算力,同时也依赖于你的网络位置。

出人意料的是,采用这种攻击方式,如果基于50%的概率赢得区块分叉竞争,在α<=0.5的情况下可能可以获得比默认策略更高的收益。但由于非常容易被检测——会增加同时宣布区块的概率——所以仅仅存在于理论。

黑名单与惩罚分叉攻击

如果你拥有大部分市场运算能力,你可以宣布拒绝在包含来自某地址X的交易的区块链上工作,那应该足以保证黑名单上的交易永远不会被认可,因为其他矿工很可能不会试图把这笔交易放入区块链,这可能会导致他们自己的区块链被分叉,从而使挖出的区块成为孤块。

羽量级分叉

如果没有很大的算力,上述几个分叉攻击在现实中都不太可能实现。甚至你有可能宣布拒绝接受黑名单交易而导致被永远排除在共识链之外。与其于一看到从地址X出来的交易就宣布你会进行永久分叉,不如宣布你会将会尝试分叉,但过一段时间你可能会放弃封杀的尝试。例如,你可以宣布:当k个区块证实了从这个地址出来的交易是正当的时候,你便会回到最长链。

如果你在一个区块证实后便放弃,把那笔从地址X出来的交易成功封杀的概率是α²,原因是你必须在其他矿工找到下一个区块之前找到连续两个区块。

概率看似很低,但只要你把你的计划公开了,其他矿工便会知道:如果他们把这个来自地址X的交易加入自己的区块,就有α²的可能会丧失自己已经发现的区块。只要他们不是有很强的主观意愿把这个交易包括进来而且这个交易没有很高的交易费,他们可能更加愿意规避那α²丢掉奖励的风险。

这就演化为:其他矿工经过理性思考,决定加入你对X地址的封杀行动,这样你即使掌握很小的算力,也有可能实现对地址X的成功封杀。

相关文章

网友评论

      本文标题:[区块链 Sec5] 比特币挖矿

      本文链接:https://www.haomeiwen.com/subject/dqqmoftx.html