1. 程式人生 > >比特幣原始碼解析(7) - 資料結構 - 區塊

比特幣原始碼解析(7) - 資料結構 - 區塊

比特幣原始碼解析(7) - 資料結構 - 區塊

 

 https://blog.csdn.net/u012183589/article/details/77776730

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;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

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