mining总共可以分为两种,一种是:Solo Mining
;一种是:Pool Mining
Solo Mining
如下图所示,solo miner 使用bibtcoind
来从网络上面来拿到新的交易。 通过使用getblocktemplate
这个RPC命令去定期轮询bitcoind
来获取新的交易。
挖矿的时候,首先去构造一个80字节的块头结构。 之后遍历块头中的nonce字段来生成与其对应的hash值。
挖矿的时候,我们需要两个点,一个是去构造coinbase,另一个是回填块头结构的nonce值。当块头结构构造好之后,就会返回给client端。
上述过程也就是去折腾80字节的块头结构:
// header
int32_t nVersion; //4 byte
uint256 hashPrevBlock;//32 byte
uint256 hashMerkleRoot;//32 byte
uint32_t nTime;//4 byte
uint32_t nBits;
uint32_t nNonce;
solo mining简单来说就是,我一个人单干,挖到的就全是我的,但是截止目前,相对而言这种挖矿的形式不如Pool Mining的效益高,毕竟众人拾柴火焰高,这本来就是一个概率问题,所以只能说是相对而言
Pool Mining
Pool Mining.png这种挖矿的形式就是我每一个人贡献我自己的算力,然后大家的算力加起来,合成一个矿池,现在由我矿池统一挖矿,挖到块之后,按照大家算力的百分比分成。
上面我们提到了,挖矿就是折腾那80字节,现在我们具体看看怎么折腾。
nVersion
4 字节的nVersion字段,这个我们可以认为它是不变的,为什么这么说,因为这个字段只有在进行升级时候才会改变,平时没事也不升级啊。
hashPrevBlock
32字节的hashPrevBlock字段,这个是不变的,它是由前一个区块确定的,你没办法改变它。
nBits
4字节的nBits字段,这个也基本是不变的,它由全网的算力决定,每2016个块才会进行一次难度调整,调整的算法是固定的。
上述三个字段我们基本认为不会变,也就是在构造80字节的块头的时候,和你们没什么大的关系。
nTime
4字节的nTime,这个字段是可变的,但悲哀的是,蹦跶的范围不大,理论上是允许后一个区块的区块时间略早于前一个区块时间,所以看到你的“父亲”出生的比你晚不必要惊讶,全网太大了,网络稍微有点延迟,这个东西也没办法避免,一般来说,矿工会直接使用机器当前时间戳。
nNonce
4字节的nNonce,这个字段好好唠唠,一个字节8位,4字节32位,所以,它能提供2的32次方的寻址范围。在CPU和GPU的挖矿时代,这个字段也就足够用了,所以当时候都是去迭代遍历这个nNonce字段,算出来复合要求的值,回去填充块头。但是随着算力的提升,4GB的寻址肯定不够用了,怎么办呢?
hashMerkleRoot
32自己的hashMerkleRoot字段,merkle tree具体的作用就不在这里展开说明了,该字段是矿工构造的coinbase加上这个块打包进来的所有交易,算出来的一个32字节的hash‘值,只要包括coinbase字段在内的所有交易有任何风吹草动,该字段都会不一样。32字节啊,也就是说提供了2的256次方的寻址可能,目前世界上现存的所有算力全部加起来也算不完吧,如果量子计算落地,另当别论。
综上所述,挖矿流程我们可以简单总结如下:
- 构造coinbase交易
- 构建Merkleroot
- 构建区块头
网友评论