- 常见的hash算法:
- 文件防篡改:MD5
- 比特币挖矿:SHA256
- 证明数据片段:Merkle root
- 文本去重:SimHash
区块
区块(block)由区块头(block header)和交易列表(transaction list,tx list)组成,block之间通过block header的hash连接成了一个链表结构。
block header
- 比特币的block header(Github)
int32_t nVersion;
uint256 hashPrevBlock;
uint256 hashMerkleRoot;
uint32_t nTime;
uint32_t nBits;
uint32_t nNonce;
- 以太坊的block header(Github)
ParentHash common.Hash `json:"parentHash" gencodec:"required"`
UncleHash common.Hash `json:"sha3Uncles" gencodec:"required"`
Coinbase common.Address `json:"miner" gencodec:"required"`
Root common.Hash `json:"stateRoot" gencodec:"required"`
TxHash common.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"`
GasLimit uint64 `json:"gasLimit" gencodec:"required"`
GasUsed uint64 `json:"gasUsed" gencodec:"required"`
Time uint64 `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的hashhashMerkleRoot
/TxHash
,tx list的hash
block body
block body
- block body就是tx list,block header通过
TxHash
指向唯一的tx list - 从tx hash list得到
TxHash
的hash算法叫做默克尔树(Merkle tree),相比其他的hash算法有特殊的性质(可以简洁地证明tx存在其中)
默克尔树,也被称为哈希树,是一种典型的二叉树结构。它有一个根节点、一组中间节点和一组叶节点组成。叶节点包含存储数据或其哈希值,而非叶子节点(包括中间节点和根节点)则是它的两个孩子节点内容的哈希值。这种结构使得默克尔树具有一些独特的性质。
首先,任何底层数据的变动,都会传递到其父节点,一层层沿着路径一直到树根。这意味着根的值实际上代表了对底层所有数据的“数字摘要”。这种性质使得默克尔树成为快速归纳和校验区块数据存在性和完整性的理想选择。
其次,默克尔树的生成过程是将一个大数据块拆分成更多小的数据块,然后对每个数据块进行哈希运算,得到所有数据块的哈希值之后,再获得一个哈希列表。重复这个过程,最终得到一个哈希值,被称为根哈希。这个根哈希值可以用来快速验证整个区块数据的完整性和存在性。
在区块链中,默克尔树主要用于高效地验证大量数据的完整性和存在性。以比特币为例,每个区块都包含一个默克尔树,该树的根哈希值被包含在区块头中。这样,当一个节点想要验证某个交易是否被包含在某个区块中时,它只需要检查该交易的哈希值是否被包含在默克尔树的叶子节点中,以及该哈希值是否最终指向根哈希值。这种方式大大提高了验证效率,降低了不必要的计算量。
此外,默克尔树还有助于提高区块链的可扩展性和去中心化程度。由于每个节点都可以独立地验证其他节点的数据完整性和存在性,这使得区块链可以更好地适应大规模的应用场景。同时,由于默克尔树的生成过程是分布式的,它不需要中心化的第三方机构进行干预,从而提高了区块链的去中心化程度。
Nakamoto consensus
- 为什么:对block的有效性达成一致
- 决定每个高度上使用哪个block
- tx list
- block reward
- 决定每个高度上使用哪个block
- 怎么做:PoW(Proof of Work)算法
- 调节block header:
Nonce
和TxHash
- 让block header的hash小于Target
- 可以看到比特币的block hash都是一堆0开头的(btc.com)
nBits
会随着nTime
调整,保持区块间隔时间为10分钟
- 多个block时的选择
- 谁的块先出用谁的
- 谁的链更长用谁的
- 调节block header:
- 分叉的缓解(Etherscan):
- 一个block能包含最多2个(Github)叔块(uncle block)在
UncleHash
里 - 奖励
- 每包含一个叔块,能增加少量的block reward
- 被包含的叔块,能获得大部分的block reward
- 激励节点切换到被更多人所共识的链上
- 你出的块我已经给你算上了,赶紧切换到最长链吧
- 一个block能包含最多2个(Github)叔块(uncle block)在