比特幣源碼解析(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  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 vtx; // 所有的交易 // memory only mutable bool fChecked; // 交易是否驗證過並構成Merkle樹 CBlock() { SetNull(); } CBlock(const CBlockHeader &header) { SetNull(); *((CBlockHeader*)this) = header; } ADD_SERIALIZE_METHODS; template  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;};


分享到:


相關文章: