区块

区块(block)由区块头(block header)和交易列表(transaction list,tx list)组成,block之间通过block header的hash连接成了一个链表结构。但这个链表不同于普通链表。

1. block header

比特币的block header:

int32_t nVersion;uint256 hashPrevBlock;uint256 hashMerkleRoot;uint32_t nTime;uint32_t nBits;uint32_t nNonce;

以太坊的block header:

ParentHashcommon.Hash`json:"parentHash" gencodec:"required"`UncleHash common.Hash`json:"sha3Uncles" gencodec:"required"`Coinbasecommon.Address `json:"miner"gencodec:"required"`Rootcommon.Hash`json:"stateRoot"gencodec:"required"`TxHashcommon.Hash`json:"transactionsRoot" gencodec:"required"`ReceiptHash common.Hash`json:"receiptsRoot" gencodec:"required"`Bloom Bloom`json:"logsBloom"gencodec:"required"`Difficulty*big.Int `json:"difficulty" gencodec:"required"`Number*big.Int `json:"number" gencodec:"required"`GasLimituint64 `json:"gasLimit" gencodec:"required"`GasUsed uint64 `json:"gasUsed"gencodec:"required"`Timeuint64 `json:"timestamp"gencodec:"required"`Extra []byte `json:"extraData"gencodec:"required"`MixDigest common.Hash`json:"mixHash"`Nonce BlockNonce `json:"nonce"`// BaseFee was added by EIP-1559 and is ignored in legacy headers.BaseFee *big.Int `json:"baseFeePerGas" rlp:"optional"`
  • hashPrevBlock /ParentHash,上一个block header的hash
  • hashMerkleRoot/TxHash,交易list的hash

TxHash和ParentHash相结合,赋予了区块链不可篡改的特性。

2. block body

  • block body就是交易list,block header通过TxHash指向唯一的交易list
  • 从tx hash list得到TxHash的hash算法叫做默克尔树(Merkle tree),相比其他的hash算法有特殊的性质(可以简洁地证明tx存在其中)

block header通过ParentHash指向唯一的上个block header,并最终形成一条链。

例如:一个结构体B里面如果包括了一个指针pa,那这个结构体就可以指向另一个结构体A。一个结构体C里面如果包括了一个指针pb,那这个结构体就可以指向另一个结构体B。以此类推,通过指针,结构体就可以连起来。

而区块链是用哈希指针(hash pointers)代替了普通指针。哈希指针是一个可以指向数据存储位置及位置的数据的哈希值的指针。

哈希指针:不仅要存放地址,还要存放这个结构体的哈希值,一般用H表示一个哈希指针。

这样做的好处是:我们不光可以找到这个结构体的位置,同时还能够检测出这个结构体的内容有没有被篡改,因为我们保存了他的哈希值。

最前面的区块是系统中产生的第一个区块,叫做创世纪块(genesis block),顺便说一句,比特币的创世区块里,中本聪写了一句话“The Times 03/Jan/2009 Chancellor on brink of second bailout forbanks.”

最后一个区块是最近产生的区块,每个区块都包含指向前一个区块的哈希指针,最后一个区块也有一个指向它的哈希指针H()保存在系统里。