bitcoin mining详解

mining总共可以分为两种,一种是:Solo Mining;一种是:Pool Mining

Solo Mining

如下图所示,solo miner 使用bibtcoind来从网络上面来拿到新的交易。 通过使用getblocktemplate 这个RPC命令去定期轮询bitcoind来获取新的交易。

bitcoin mining详解_第1张图片
Solo Mining.png

挖矿的时候,首先去构造一个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

bitcoin mining详解_第2张图片
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次方的寻址可能,目前世界上现存的所有算力全部加起来也算不完吧,如果量子计算落地,另当别论。

综上所述,挖矿流程我们可以简单总结如下:

  1. 构造coinbase交易
  2. 构建Merkleroot
  3. 构建区块头

你可能感兴趣的:(bitcoin mining详解)