最新消息:

比特币源码剖析(四)之核心数据结构

Bitcoin justnode 248浏览

区块的结构

字段 说明 大小
Magic no 魔术字,值为0xD9B4BEF9 4 字节
Blocksize 表示区块的大小,单位是字节 4 字节
Blockheader 包含6个字段:version,hashPrevBlock,hashMerkeRoot,Times,Bits,Nonce 80 字节
Transaction counter 区块中包含的交易数量 1 – 9 字节
transactions 存放交易的列表

CBlock和CBlockHeader类
CBlock继承自CBlockHeader类,其中CBlockHeader类为区块头中的六个字段定义了六个成员变量,CBlock类定义了成员变量vtx,用于保存区块中的transactions。同时CBlock类中定义了BuildMerkleTree方法用来生成默卡尔树。
CBlockHeader类的定义如下所示,该类中包含6个成员变量。

class CBlockHeader
{
public:
    // header
    static const int32_t CURRENT_VERSION=4;
    int32_t nVersion;
    uint256 hashPrevBlock;
    uint256 hashMerkleRoot;
    uint32_t nTime;
    uint32_t nBits;
    uint32_t nNonce;

    CBlockHeader()
    {
        SetNull();
    }
};

CBlock类定义如下:

class CBlock : public CBlockHeader
{
public:
    // network and disk
    std::vector<CTransaction> vtx;

    // memory only
    mutable std::vector<uint256> vMerkleTree;

    CBlock()
    {
        SetNull();
    }

    uint256 BuildMerkleTree(bool* mutated = NULL) const;

    std::vector<uint256> GetMerkleBranch(int nIndex) const;
    static uint256 CheckMerkleBranch(uint256 hash, const std::vector<uint256>& vMerkleBranch, int nIndex);
    std::string ToString() const;
};

 

交易的结构

字段 描述 大小
Version no 版本号,值总是为1 4 字节
In-counter input的数量 1 – 9 字节
list of inputs 存放input的列表 不固定
Out-counter output的数量 1 – 9 字节
list of outputs 存放output的列表 不固定
lock_time 交易的锁定时间 4 字节

CTransaction类是比特币交易的核心类,类的定义如下所示,该类中有两个vector变量vin和vout,分别存放CTxIn和CTxOut类型的数据。其中CTxIn是输入交易,CTxOut是输出交易。

CTransaction类的定义如下所示:

class CTransaction
{
private:
    /** Memory only. */
    const uint256 hash;
    void UpdateHash() const;

public:
    static const int32_t CURRENT_VERSION=1;

    const int32_t nVersion;
    const std::vector<CTxIn> vin;
    const std::vector<CTxOut> vout;
    const uint32_t nLockTime;

    /** Construct a CTransaction that qualifies as IsNull() */
    CTransaction();


    bool IsNull() const {
        return vin.empty() && vout.empty();
    }

    const uint256& GetHash() const {
        return hash;
    }
    bool IsCoinBase() const
    {
        return (vin.size() == 1 && vin[0].prevout.IsNull());
    }
    std::string ToString() const;
};

CTransaction类中变量的组成如下图所示:

scriptSig和scriptPubKey的作用,请参考理解比特币脚本一文