比特币挖矿的两种方式

原文地址:https://blog.csdn.net/superswords/article/details/72460520

比特币挖矿的两种方式

比特币挖矿,一般有两种方式,早期一般都是solo方式,就是单枪匹马淘金,随着挖矿设备性能的指数级提高,solo已经无法保障收入,现在一般都是采用加入矿池的方式。

solo 方式

先上一个图


说明如下:

  1. solo矿工一般通过bitcoind来网络上获得新的交易。
  2. 挖矿软件(比如50Miner,GUIMiner之类)周期性的调用RPC方法(getblocktemplate)来从bitcoind取得新交易 
    这个方法返回新交易的一览+coinbase交易
  3. 挖矿软件用得到的交易构筑一个新的区块,并创建一个80字节的区块头部。然后,挖矿软件把区块头部和难度设定传给挖矿硬件(比如CPU,GPU,ASIC等)
  4. 挖矿硬件穷举计算所有可能的头部nouce值,来寻找是否有符合难度设定的hash值。 
    如果没有,那么挖矿软件会在coinbase中追加额外的nouce值,再交给挖矿硬件来计算。 
    如果有,那么挖矿硬件把带有合适nouce值的区块头部返回给挖矿软件。
  5. 挖矿软件把区块头部+区块做成完成的区块传递给bitcoind。
  6. bitcoind把区块广播到P2P网络,等待网络确认。

矿池方式

挖矿这个事情,计算量越来越大,矿工得到收益的概率不但在降低,而且越来越不稳定。所以出现了矿池方式,大家一起挖,挖到了以后收益按照出力的多少来分配。

基本做法是:矿池把目标难度降低几个数量级,然后分配给各个矿工,矿工可能找到了很多符合矿池目标值的header,这个被称为shares。 
其中,某个header碰巧符合目标难度值,则被矿池提交给P2P网络,而收益按照各个矿工提交的shares多少来分配。

可以和上图比较下 

也说明下:

  1. 矿池通过bitcoind来从P2P网络获得新交易
  2. 矿工的挖矿软件连接到矿池,采用下面的方法之一来取得用于构筑区块头部的信息。 
    getwork RPC 
    直接提供给矿工构筑好的区块头部,现在基本只用于solo方式,并且是0.9.5及以下版本。 
    getblocktemplate RPC 
    提供给矿工coinbase交易,所有的新交易,以及版本号等其他必须信息。其中难度值是矿池接受shares的难度值,而不是P2P网络的难度值。 
    矿工可以检查交易,甚至可以追加或者删除交易 
    RPC都是通过HTTP协议,为了保证矿工可以及时拿到新的header,一般采用长轮询方式(longpoll) 
    Stratum 
    用于替代getblocktemplate。矿池只发送用于构筑header最少的数据给矿工,以减少网络通信。 
    矿工不可以检查交易,也不能追加或者删除交易 
    利用TCP通信保持双向直接连接。
  3. 同solo方式的3
  4. 同solo方式的4
  5. 挖矿软件提供给矿池的是满足了矿池难度值要求的header,称为一个share
  6. 矿池把满足P2P网络难度值的区块广播到网络中。

本文大部分是对Bitcoin Developer Guide进行了翻译和整理,图片也是来自Bitcoin Developer Guide。另外夹杂了一部分其他渠道的内容。


猜你喜欢

转载自blog.csdn.net/metal1/article/details/80293449