比特幣原始碼解析(7) - 資料結構 - 區塊
阿新 • • 發佈:2019-01-02
比特幣原始碼解析(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; };