BTC-08挖矿

内容整理自 北京大学肖臻老师《区块链技术与应用》公开课 08-BTC-挖矿

比特币系统中两种节点:

图片来源于视频。 

比特币系统中大部分节点是轻节点,如果只是转账而不挖矿,那么就没必要运行全节点。挖矿过程中,如果监听到别人发布一个区块,而且区块合法,也在最长合法链,此时要停止已有的挖矿,在本地重新组装候选区块,重新挖矿。因为要沿着新区块继续挖的话,那么本地组装的区块中所包含的交易就会发生变化,有些交易可能已经被写到新发布的区块中。另外,block header中的内容也会变化,像merkle tree的root hash,指向前一区块的hash pointer也会发生变化。由于挖矿有memoryless(progress free)的性质,所以无论是继续挖原来的区块,还是停下来改成挖一个新区块,成功概率是一样的。

比特币中的安全性保证:

1.密码学上的保证。其他人没有你的私钥,无法伪造你的签名,所以不能转走你账户中的钱,前提是拥有大多数算力的矿工是诚实的,否则该保证无效。   

2.共识机制。

挖矿设备

挖矿设备的演变趋势:趋于专业化

1.最早普遍用普通CPU挖矿,如家用计算机。但是用一台计算机专门挖矿很不划算,计算机中大部分内存都是闲置的,CPU中大部分部件也是闲置的,硬盘和其他很多资源也都是闲置的。

2.用GPU挖矿,效率提高了很多,GPU主要用于大规模并行计算,深度学习。但还是不划算,很多部件仍然闲置。目前比特币挖矿难度的提升,已经超过了GPU的算力范围。 

3.ASIC芯片(Application Specific Integrated Circuit),性价比高,只能用来挖矿。一个芯片只能为一种加密货币挖矿,除非两种货币mining puzzle相同(merge mining)。研发周期长。

矿池:

挖矿另一个趋势是大型矿池的出现:把旷工组织起来作为一个整体。

好处:减轻矿工负担,矿工 miner只计算hash值,全节点的其他职责由矿主 pool manager承担。而且解决收益不稳定问题,挖到区块,收益大家一起分配单矿工存在挖矿时间长,收益不稳定,挖到赚到挖不到就浪费,还要承担全节点所有责任的劣势。

过程:如果矿工和矿主不在同一地方,矿工要加入一个矿池,按照矿池规定的通讯协议和矿主进行联系。矿主把要计算的哈希值的任务分配给矿工,矿工计算完之后把结果返回给矿主,如果有出块奖励大家一起参与分红。

矿工收益分配:不能平均分配,要按照贡献大小进行分配,需要工作量证明。降低挖矿难度,使得收益稳定,因为挖矿难度太高,挖矿时间过长,导致收益不稳定。如果说原来要求hash值前面至少有70个0算是合法区块的话,那么现在要求前面只要有60个0就可以,这样挖到的叫做share(almost valid block),挖到后交给矿主,矿主拿到后除了用作矿工的工作量证明以外,毫无用处。矿主需要记录每个矿工提交了多少个share。等到某个矿工真正挖到合法区块后,按照每个矿工的工作量,也就是share数目分配出块奖励。可行性在于每个矿工挖到矿的概率,取决于尝试了多少个nonce,尝试的nonce越多,找到的share越多。

可能存在的问题:

1.某个矿工挖到矿后,会不会自己偷偷发布,不给矿主?

不可能。每个矿工的任务是由矿主分配的,矿主负责组装区块,然后交给矿工组装各种各样的nonce,而且仅仅调整nonce还不够,还要调整coinbase parameter。矿主可能把不同的parameter所对应的nonce值范围交给不同的矿工去尝试。coinbase tx中包含收款人地址,该地址为矿主地址,所以矿工不提交给矿主而自己发布出去并没有用,取不出钱。如果矿工一开始没有管矿主的任务,自己组装一个区块,收款人地址为自己地址,那样的话提交的share矿主不会认,因为里面交易列表被改过,算出的root hash也不一样。

2.会不会有某矿工挖到矿之后扔掉不发布,只提交share作为工作量证明?

有可能。但是对矿工来说没有任何经济上的好处。可能是矿池之间竞争,为打击竞争对手,派矿工到对手矿池分收益。

矿池统计数据:

图片来源于视频

该图显示的是矿池在各个国家的分布比例。

 

就单个矿池而言,曾经有个矿池叫作GHash.IO,它的算力占到了51%,足以发动51%攻击。该事件公布之后该矿池主动把算力占比大幅度减少,避免大家失去对比特币的信心。

该图显示的是18年的矿池分布情况。没有那么集中,GHash也不存在了。挖矿集中化的程度仍然比较大,但是没有哪个矿池占到一半以上。

危害:

矿池发动51%攻击更容易,只需要召集51%算力即可,无需自己有51%算力。

假如某矿池占据51%以上的算力,可以发动的攻击:1.forking attack    2.Boycott 针对某账户,比如攻击者不喜欢A账户,怀疑A账户参与非法交易,想把交易封锁掉。所有和A账户相关的交易都不让上链,如果有人把包含A的交易发布出去,就进行分叉攻击,产生一个不包含A交易的区块。而且不需要等到六个确认区块。

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

猜你喜欢

转载自blog.csdn.net/a972669015/article/details/104606403
08