主页 > 官网imtoken安卓版 > 比特币源码分析(七)——数据结构——区块
比特币源码分析(七)——数据结构——区块
官网imtoken安卓版 2023-05-27 08:10:09
比特币源码分析(七)——数据结构——区块
2018-05-16 16:42 区块链学习笔记
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; templateinline 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 C块
class CBlock : public CBlockHeader {public: // network and disk std::vectorvtx; // 所有的交易 // 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; };