主页 > 官网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; 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 C块

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