比特幣原始碼解析(7)
阿新 • • 發佈:2018-12-30
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;
}
};
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;
};