【区块链笔记】BTC_挖矿(06)

Page content

这篇文章简单的整理了比特币挖矿相关的内容。

1.挖矿难度

比特币的难度是每过2016块改变一次,平均10分钟出一块。
2016 * 10 / 60 * 24 = 14天。调整一次难度

挖矿难度是通过如下公式调整的。

Hash(bolck header) <= target (目标target是一个256位长的数值。)
计算公式:difficulty = difficulty_1_target / current_target

newdiff = diff * (2016 * 10 * 60 )/R  

newdiff:      新的难度调整值  
diff:          上次难度调整结果  
(2016*10*60):  每10分钟产生一个区块,两周时间产生区块数=2016,  
R:             本次难度调整的2016个出快实际用时  

难度 = 创世块hash/当前难度hash  

而创始区块的难度是写死的。hash:0x1d00ffff

genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);  

为了防止难度调整幅度异常,代码中做了调整不能大于或小于4倍的限制
难度调整是在各节点自己做计算。

那为什么调整挖矿难度?

因为系统逐渐的完善,参与的节点会越多,算力也会上涨。
如果不调整难度,出块速度会变得很快。
新出的块跟其他节点分享数据达到共识是需要几十秒时间的,
如果这期间又出新快,会出现很多临时分叉,这种临时分叉为常态的话,
很容易分散诚实节点的算力,这时恶意节点集中算力攻击,有可能只需10+%算力就可以达到最长链。
所以需要通过难度控制出块时间,因算力的提高减少出块时间会有极大的安全隐患。

2.挖矿过程

挖矿是通过密码学共识机制保证安全。
比如加密信息是代表你的身份,那共识机制是整个系统之间的约定。
你的身份不能造假,整个系统保证不乱发钱,才能确保整个比特币系统的稳定和安全。

2.1 全节点

  • 一直在线
  • 在本地硬盘上维护完整的区块链信息
  • 在内存里维护UTXO集合,以便快速检验交易的正确性
  • 监听比特币网络上的交易信息,验证每个交易的合法性
  • 决定哪些交易会被打包在区块里
  • 监听别的矿工挖出来的区块,验证其合法性
  • 挖矿并且可以决定挖矿的方向:最长链方向,如果出现等长的分叉时,选择最先监听到的那一条分叉

每出一个区块,全节点接受新的区块时都做如下3个验证:

  1. 每个交易的合法性,包括coinbase,
  2. 挖矿难度,目标预值等等…
  3. 是不是衍生了最长链。

2.2 轻节点

  • 不是一直在线
  • 不用保存全部整个区块链,只要保存每个区块的块头
  • 不用保存全部交易,只保存与自己相关的交易
  • 无法检验大多数交易的合法性,只能检验与自己相关的那些交易的合法性
  • 无法检测网上发布的区块的正确性
  • 可以验证挖矿的难度(即检测你发布的区块是否符合难度要求)
  • 只能检测哪个是最长链,不知道哪个是最长合法链

2.3 挖矿方法

如果矿机接收到别的节点的出块信息,就应该停止当前区块的计算,重新组装块身,挖新矿。

比特币的mining puzzle是哈希算法,
刚开始的CPU、到中期的GPU、到现在的ASIC。
比特币的挖矿速度和硬件越来越往专业化方向。
这根起初每个人都参与挖矿的理念有所差异了。

通常的矿机都是ASIC,高度并行化的专用芯片。
但是ASIC制作成本高、研发周期长,设计一款挖矿通常需要一年时间,投入巨大。
而矿机的淘汰速度很快,过一段时间就有更好的矿机问世,老款矿机就会因电费的原因被淘汰。

2.4 矿池

挖矿越来越专业,慢慢的出现的大型矿池。
矿池维护一个全节点,管理很多矿机,矿主们只提供算力,
大家一起分配coinbase和区块打包奖励。

那矿工能不能挖到矿后,不提交私吞?

这是不可能的,因为任务是由矿主分配,当算去区块时区块的coinbase的收货人是矿主本人。
如果自己擅自串改,挖矿就跟自己一个人挖矿是没区别了。

有没有可能捣乱?

我挖矿也不提交,这是有可能的,因为矿池之间竞争也很激烈,
有可能相互派过去卧底捣乱。

如果一个矿池的算力打到一定的程度后,能做以下攻击,影响比特币系统的稳定性。

1.分叉攻击

当矿池的算力达到51%,就可以进行硬分叉,追赶最长链。
废除之前的交易。 这样的攻击一旦形成,比特币整个系统的信任度会崩溃。

2.Boycott

针对某个账号不打包交易。恶意的封杀某个账户。只要有这个账户的信息直接硬分叉。
会影响其他诚实矿工也是为了减少损失一起针对此账号,不打包的行为。


欢迎大家的意见和交流

email: li_mingxie@163.com