原文地址:https://blog.csdn.net/superswords/article/details/72460520
比特币挖矿的两种方式
比特币挖矿,一般有两种方式,早期一般都是solo方式,就是单枪匹马淘金,随着挖矿设备性能的指数级提高,solo已经无法保障收入,现在一般都是采用加入矿池的方式。
solo 方式
先上一个图
说明如下:
- solo矿工一般通过bitcoind来网络上获得新的交易。
- 挖矿软件(比如50Miner,GUIMiner之类)周期性的调用RPC方法(getblocktemplate)来从bitcoind取得新交易
这个方法返回新交易的一览+coinbase交易 - 挖矿软件用得到的交易构筑一个新的区块,并创建一个80字节的区块头部。然后,挖矿软件把区块头部和难度设定传给挖矿硬件(比如CPU,GPU,ASIC等)
- 挖矿硬件穷举计算所有可能的头部nouce值,来寻找是否有符合难度设定的hash值。
如果没有,那么挖矿软件会在coinbase中追加额外的nouce值,再交给挖矿硬件来计算。
如果有,那么挖矿硬件把带有合适nouce值的区块头部返回给挖矿软件。 - 挖矿软件把区块头部+区块做成完成的区块传递给bitcoind。
- bitcoind把区块广播到P2P网络,等待网络确认。
矿池方式
挖矿这个事情,计算量越来越大,矿工得到收益的概率不但在降低,而且越来越不稳定。所以出现了矿池方式,大家一起挖,挖到了以后收益按照出力的多少来分配。
基本做法是:矿池把目标难度降低几个数量级,然后分配给各个矿工,矿工可能找到了很多符合矿池目标值的header,这个被称为shares。
其中,某个header碰巧符合目标难度值,则被矿池提交给P2P网络,而收益按照各个矿工提交的shares多少来分配。
可以和上图比较下
也说明下:
- 矿池通过bitcoind来从P2P网络获得新交易
- 矿工的挖矿软件连接到矿池,采用下面的方法之一来取得用于构筑区块头部的信息。
getwork RPC
直接提供给矿工构筑好的区块头部,现在基本只用于solo方式,并且是0.9.5及以下版本。
getblocktemplate RPC
提供给矿工coinbase交易,所有的新交易,以及版本号等其他必须信息。其中难度值是矿池接受shares的难度值,而不是P2P网络的难度值。
矿工可以检查交易,甚至可以追加或者删除交易
RPC都是通过HTTP协议,为了保证矿工可以及时拿到新的header,一般采用长轮询方式(longpoll)
Stratum
用于替代getblocktemplate。矿池只发送用于构筑header最少的数据给矿工,以减少网络通信。
矿工不可以检查交易,也不能追加或者删除交易
利用TCP通信保持双向直接连接。 - 同solo方式的3
- 同solo方式的4
- 挖矿软件提供给矿池的是满足了矿池难度值要求的header,称为一个share
- 矿池把满足P2P网络难度值的区块广播到网络中。
本文大部分是对Bitcoin Developer Guide进行了翻译和整理,图片也是来自Bitcoin Developer Guide。另外夹杂了一部分其他渠道的内容。