比特币之六挖矿

正在学习区块链,如果我哪里有错误希望大家指出,如果有任何想法也欢迎留言。这些笔记本身是在typora上写的,如果有显示不正确的敬请谅解。笔记本身也是给我自己写的,所以如果有侵权的请通知我,我立即删除。


  如果网络中已经有人挖到了矿,公布了一个最长合法链,我就得放弃手头的挖矿工作,这个很好理解,因为如果(或者说一定)那条链中的交易和我正在打包的交易有重叠,那我就白挖了,反正出来了别人也不会承认。那对于我来说,可惜吗?挖了半天,什么都没有。不可惜,理由没听懂,肖老师是这么说的:前面有讲,因为挖矿是无记忆性的,这个是概率,指数分布的知识。

比特币安全性的保证,有两点,类比银行的工作人员。首先去银行取钱要先保证你的密码正确且安全,不会被别人破解。这就是生成私钥的时候随机源要足够好,保证你的签名正确且不易破解。再者就是银行的工作人员只会把钱给用户本人,这也就是比特币系统中矿工的保证。

6.1挖矿的难度

这个就是确定block header哈希值是否合格的要求,比如求出来的哈希值前面有很多个0,其实并不是说0的个数,而是小于target,这个target叫做目标阈值。
S H A 256 ( b l o c k h e a d e r ) t a r g e t SHA256(block header) \leq target
  那挖矿难度和目标阈值什么关系呢?反比
d i f f i c u l t y = d i f f i c u l t y _ 1 _ t a r g e t t a r g e t difficulty = \frac{difficulty\_1\_target}{target}
  difficulty_1_target是目标阈值为1时的挖矿难度。挖矿难度最小为1,这时候target肯定很大。

这个出块时间为什么是10分钟,1分钟或者几十秒不好吗?秒到帐它不香吗?

对于这个问题,我第一反应是:肯定不好,因为比特币是有限的,要是1s一个块,出的比特币就是原来的10倍了。虽然这可能要是答案,那我1s一个块,但是奖励是原来的十分之一不行吗?听起来听香的哈,然而并不是。一个区块的结果在网络中传输可能就需要几十秒,有更大的概率出现分叉,因为可能这个区块我比别人慢,但是下一个区块我就能赶上,所以不会立刻丢弃。前面有说,区块链处理分叉是最长有效链,如果网络中现在出现了十个分叉,就会降低网络的效率。原来有两条链,全网有50%的算力分别在两条链后面算,但是现在有十条链,每条链后面都只有10的算力,那这又有什么坏处呢?更容易实现51%攻击,因为这个51%是针对每条链的,如果每条链的算力都是原来的1/5,那么51%攻击需要的算力代价也就是原来的1/5。

6.2难度调整方法

先说一下调整时间,大概是14天,因为不一定是10分钟一个块,2016个块调整一次。
2016 ( ) 10 ( m i n / ) 60 ( m i n / h ) 24 ( h / ) = 14 ( ) \frac{2016(块)*10(min/块)}{60(min/h)*24(h/天)} = 14(天)
  调整挖矿难度即目标阈值到方法:
n e w   t a r g e t = o l d   t a r g e t a c t u a l   t i m e e x p e c t e d   t i m e new\ target = old\ target* \frac{actual\ time}{expected\ time}
  real time是前2016个区块实际的挖矿时间, expected time就是上面的14天。如果实际到挖矿时间大于14天了,new target就会变大,导致挖矿难敌降低。我还以为是什么智能调整呢,搞半天就这个啊。实际使用的时候变化的比例不会超过4倍,例如前一次是2星期,现在已经超过8星期了,本次的new target也只能是原来的4倍。同样,就算这次一天就挖完了2016个块,new target也只是原来的1/4,这样做是为了避免某一次网络的波动。

因为区块链的代码是开源的,如果有点人修改了这个target的调整逻辑,自己的target一直很小,别的节点是不会认的。这个target就是在block header中的nBits位,不过这个nBits是256位的target编码后的结果,因为target确实太长了。

6.3矿池

因为单个人挖矿很不稳定,能不能挖到就是靠概率,这个概率是你设备的算力占全部算力的百分比。那大家扎堆是不是就好了,是的,这样能平摊风险,这就是矿池。矿池就涉及到了任务如何分配,奖励如何分配。

任务分配:矿池中的矿主会把所有的数据分给全部的矿工(是不是均分就不知道了),比如有的人尝试0100的nonce有的人尝试100200的nonce,有的人修改merkle tree里出块节点的值。有人算出来了,把结果给矿主,矿主组装发布。

奖励分配:这个很有问题,怎么证明我的算力比别人强多少呢,这个要精确到数值才可以。有一个概念叫almost valid block。比如我要前面10个0的哈希值,你算出了前面9个0的结果,这个值也给我,这个值就是almost valid block。这个值肯定是没用的,矿主也不能把这个区块发布出去,但是这个值却可以当做工作量证明。挖到矿的概率和尝试的nonce数量是成正比的,如果你尝试的次数多,almost valid block的个数也就多了。

结果藏匿:如果有的节点自己挖到了矿不告诉矿主,自己偷偷发布出去,自己挣钱不行吗?不行。因为矿主给你任务的时候,出块奖励的收款人写的就已经是矿主了,如果你发布出去收益的也是矿主。那如果你把收款人不写矿主,写自己呢?那和自己挖矿有什么区别呢?一个值发生了变化nonce就会产生非常大的影响。

**恶意的矿工:**会不会有的矿工明明挖到了结果但是却不告诉矿主呢?这么损人不利己的事情会有人做吗?会的,那就是别的矿池派来的奸细。当然,这个挖出来的结果,别的矿池也用不了,只能废掉,但是却影响了这个矿池的出块。

**矿池攻击:**矿池这么好,有什么缺点吗?有的,之前就有过,如果某个矿池的算力达到了51%,矿主可以编造出恶意的区块给自己的矿工计算,矿工也不知道就去计算了。这样矿主并不需要自己达到51%算力,只需要有一个这么的矿池就可以了。曾经的那个51%算力的矿池就因为这个原因自己放弃了部分算力,因为如果这样下去比特币的可信性就不足了。现在这个矿池已经没有了。矿主在分配奖励的时候,自己也要收取点管理费,然而如果有的矿主管理费很低,或者只是赔本赚吆喝,那就要小心了。

发布了38 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qigezuishuaide/article/details/104244461