比特币源码分析--挖矿的实现

挖矿应该是近几年非常流行的一个名词了,通过前面文章的介绍我们现在已经知道了:在区块链中,所谓的挖矿其实是系统通过共识算法就“由谁来向区块链中写入区块并获取奖励”一事达成一致的过程。本文通过分析比特币源码,从技术角度来分析一下挖矿是如何实现的。1 挖矿的流程    可以说,比特币就是靠挖矿来运作的,挖矿不仅保证比特币了比特币系统的安全性,同时比特币也是通过挖矿的方式来发行的,先简要概括一下挖矿流程:    当一个矿工收到一个新区块的广播以后,证明已经有人抢先一步了,矿工对收到的区块的工作量和区块中的交易校验无误后就将区块添加到区块链中,然后立刻投入到挖掘下一个区块的竞赛中:    (1) 矿工从交易池中选择一批交易构造出候选区块;    (2) 生成工作量证明(hash运算,拼算力);    (3) 算出工作量证明后立即将区块加入到本地区块链,并将区块广播到到网络中;    (4) 网络中其他的矿工节点收到区块,验证无误后也将区块加入自己的区块链,共识完成;    (5) 开始下一个挖矿周期。2 源码分析2.1 区块链相关的数据结构和变量    在分析源码之前,首先了解几个重要的数据结构和变量,这些数据结构和变量对于理解区块链非常之重要。2.1.1 CBlockIndex    因为区块链有可能存在分叉的情况,所以从逻辑上讲它的数据结构是一颗树,出现分叉时,每条分叉对应树的一条分支。在内存中区块链是由CBlockIndex的向量来表示的。class CBlockIndex{public:    //! pointer to the hash of the block, if any. Memory is owned by this CBlockIndex    //指向区块hash值的指针    const uint256* phashBlock;     //! pointer to the index of the predecessor of this block    //指向上一个区块的指针,因为区块链可能存在分叉的情况,所以一个区块可能有多个指针指向它    CBlockIndex* pprev;     //! pointer to the index of some further predecessor of this block    // 指向 此区块更远的祖先的指针    CBlockIndex* pskip;     //! height of the entry in the chain. The genesis block has height 0    //该区块的高度,从创世区块开始算起    int nHeight;     //! Which # file this block is stored in (blk?????.dat)    //存储本区块的数据的文件,比如第100个区块,其区块文件存储在blk100.data中    int nFile;     //! Byte offset within blk?????.dat where this block's data is stored    //区块的数据取在blk????.data中的偏移量    unsigned int nDataPos;     //! Byte offset within rev?????.dat where this block's undo data is stored    unsigned int nUndoPos;     //! (memory only) Total amount of work (expected number of hashes) in the chain up to and including this block    //从创始区块到本区块的累积工作量    arith_uint256 nChainWork;     //! Number of transactions in this block.    //! Note: in a potential headers-first mode, this number cannot be relied upon    //区块中包含的交易数    unsigned int nTx;     //! (memory only) Number of transactions in the chain up to and including this block.    //! This value will be non-zero only if and only if transactions for this block and all its parents are available.    //! Change to 64-bit type when necessary; won't happen before 2030    //从创始区块到本区块的所有交易的数量,只有收到区块以及它所有的父区块的交易数据时这个值才会非0    unsigned int nChainTx;     //! Verification status of this block. See enum BlockStatus    //区块的状态    uint32_t nStatus;     //! block header    //区块头    int32_t nVersion;    //版本    uint256 hashMerkleRoot;  //merkel树的树根    uint32_t nTime; //时间戳    //这两个变量用于计算PoW    uint32_t nBits; //难度位    uint32_t nNonce;     //! (memory only) Sequential id assigned to distinguish order in which blocks are received.    int32_t nSequenceId;     //! (memory only) Maximum nTime in the chain up to and including this block.    unsigned int nTimeMax;    上面结构中的nStatus表示区块的状态,区块可能的状态定义如下:
--------------------- 
作者:jupiterwangq 
来源:CSDN 
原文:https://blog.csdn.net/ztemt_sw2/article/details/80958087 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(比特币源码分析--挖矿的实现)