最近开始看比特币的源码(版本 0.17),会逐渐更新一些文章。
这篇学习下“验证区块头”的流程。
从 ProcessNewBlockHeaders(validation.cpp)开始:
下面是 AcceptBlockHeader (validation.cpp)函数:
这里面主要有两个函数:
- CheckBlockHeader ,根据当前区块头提供的信息,检查这个区块头本身,即 PoW 是否有效
- ContextualCheckBlockHeader,这个就不止根据当前区块的信息了,还要考察当前提供的信息是否有效,时间、checkpoint 等,很多方面,这主要是靠之前区块的信息,所以叫做上下文检查。
下面就一个个看下,先是 CheckBlockHeader(validation.cpp) :
CheckProofOfWork (pow.cpp):
ContextualCheckBlockHeader(validation.cpp) :
GetNextWorkRequired(pow.cpp):
MedianTime < 区块的时间戳 <= 现在时间 + 2h,这里的 MedianTime (chain.h)是取之前 11 个区块的中间时间。
checkpoint (chainparams.cpp)当前的代码中包含下面这些:
CalculateNextWorkRequired(pow.cpp):
到这里区块头的检查和记录就完成了,整个流程涉及到的文件:
- validation.cpp
pow.cpp
- chainparams.cpp
- chain.h