美文网首页
bitcoin mining详解

bitcoin mining详解

作者: wolf4j | 来源:发表于2018-09-07 14:35 被阅读90次

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

    Solo Mining

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

    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

    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详解

          本文链接:https://www.haomeiwen.com/subject/lsuswftx.html