比特币源码解析(7)

来源:互联网 发布:深入浅出数据分析 下载 编辑:程序博客网 时间:2024/06/07 09:36

0x00 摘要

区块是区块链的组成基本结构,也是交易信息的载体,矿工通过挖矿的形式来产生新的区块并获得奖励,新块产生的过程也是一个交易打包的过程,只有加入到区块中的交易才会被系统所有其他节点所认可,才是有效的。

0x01 CBlockHeader

/**  * 网络中的节点不断收集新的交易,然后一个Merkle树的形式打包进区块中, * 打包的过程就是要完成工作量证明的要求,当节点解出了当前的随机数时, * 它就把当前的区块广播到其他所有节点,并且加到区块链上。 * 区块中的第一笔交易称之为CoinBase交易,是产生的新币,发送给区块的产生者 */class CBlockHeader{public:    // header    int32_t nVersion;  // 版本    uint256 hashPrevBlock; //前一个区块的hash    uint256 hashMerkleRoot; // Merkle树根    uint32_t nTime;  // 时间戳    uint32_t nBits; // POW难度    uint32_t nNonce; // 要找的随机数    CBlockHeader()    {        SetNull();    }    ADD_SERIALIZE_METHODS;    template <typename Stream, typename Operation>    inline void SerializationOp(Stream& s, Operation ser_action) {        READWRITE(this->nVersion);        READWRITE(hashPrevBlock);        READWRITE(hashMerkleRoot);        READWRITE(nTime);        READWRITE(nBits);        READWRITE(nNonce);    }    void SetNull()    {        nVersion = 0;        hashPrevBlock.SetNull();        hashMerkleRoot.SetNull();        nTime = 0;        nBits = 0;        nNonce = 0;    }    bool IsNull() const    {        return (nBits == 0);    }    uint256 GetHash() const;    int64_t GetBlockTime() const    {        return (int64_t)nTime;    }};

0x02 CBlock

class CBlock : public CBlockHeader{public:    // network and disk    std::vector<CTransactionRef> vtx; // 所有的交易    // memory only    mutable bool fChecked;  // 交易是否验证过并构成Merkle树    CBlock()    {        SetNull();    }    CBlock(const CBlockHeader &header)    {        SetNull();        *((CBlockHeader*)this) = header;    }    ADD_SERIALIZE_METHODS;    template <typename Stream, typename Operation>    inline void SerializationOp(Stream& s, Operation ser_action) {        READWRITE(*(CBlockHeader*)this);        READWRITE(vtx);    }    void SetNull()    {        CBlockHeader::SetNull();        vtx.clear();        fChecked = false;    }    CBlockHeader GetBlockHeader() const    {        CBlockHeader block;        block.nVersion       = nVersion;        block.hashPrevBlock  = hashPrevBlock;        block.hashMerkleRoot = hashMerkleRoot;        block.nTime          = nTime;        block.nBits          = nBits;        block.nNonce         = nNonce;        return block;    }    std::string ToString() const;};