【比特币源码】block

背景 术语

  • 区块:
    ⼀个区块就是若⼲交易数据的集合,它会被标记上时间戳和之前⼀个区块的独特标记。区块头经过哈希运算后会⽣成⼀份⼯作量证明,从⽽验证区块中的交易。有效的区块经过全⽹络的共识后会被追加到主区块链中。
  • 区块链:
    区块链是⼀串通过验证的区块,当中的每⼀个区块都与上⼀个相连,⼀直连到创世区块。

区块头 - CBlockHeader

header只有80字节的数据,

block.h

1
2
3
4
5
6
7
8
9
class CBlockHeader
{
int32_t nVersion;
uint256 hashPrevBlock; // 上一个区块的Hash,区块哈希链就是比特币账本不可篡改的基础
uint256 hashMerkleRoot; // Merkle树根的Hash,根据本区块中的交易计算得来的
uint32_t nTime; // 该区块产生的近似时间 (精确到秒)
uint32_t nBits; // 该区块工作量证明算法的难度目标
uint32_t nNonce; // 用于验证 pow,当解决了pow时,广播该区块,并加入区块链
}

header不包括当前区块的Hash。当前区块的Hash,是GetHash这个函数算出来的,但算出来后在本地肯定有缓存供下个区块生成或者是到来较验用,下个区块如何包含进去的你就需要去了解下挖矿的过程了。

区块 - CBlock

block.h

区块由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成

1
2
3
4
5
6
7
8
9
class CBlock : public CBlockHeader
{
public:
// network and disk
std::vector<CTransactionRef> vtx; // 交易,一个区块包含至少一笔交易。这些Transaction的Hash通过Merkle Tree计算出所有交易的Merkle Hash,并被包含至区块Hash中,从而实现交易的不可修改。

// memory only
mutable bool fChecked;
};

当前区块的hash值存在哪里

区块哈希值实际上并不包含在区块的数据结构里,不管是该区块在网络上传输时,抑或是它作为区块链的一部分被存储在某节点的永久性存储设备上时。相反,区块哈希值是当该区块从网络被接收时由每个节点计算出来的。区块的哈希值可能会作为区块元数据的一部分被存储在一个独立的数据库表中,以便于索引和更快地从磁盘检索区块。

尼玛,说的什么?看不懂

BlockLocator

1
2
3
4
5
struct CBlockLocator
{
std::vector<uint256> vHave;
...
}

疑问