1. 程式人生 > >比特幣原始碼解析(7)

比特幣原始碼解析(7)

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;
};