使用VC学习BTC:(一)了解block的存盘文件blk*.dat中已经将存盘的block文件能够正确读入,本篇分析一下比特币的块验证,即工作量验证。
比特币的工作量证明,靠的是寻找block头中的一个合适的随机数,使当前块的HASH256符合要求,先不管要求是如何产生的,作为简单验证,那个要求是写在block头的目标值(nBits)里的,先不验证目标值是否符合要求,按照这个目标值是正确的处理。
在上篇文章的代码中,替换LoadExternalBlockFile函数部分的第45行
printf("%s\n\n", block.ToString().c_str());
改为:
// Verify POW
arith_uint256 powerLimit;
powerLimit.SetCompact(block.nBits);
uint256 blockHash256 = block.GetHash();
arith_uint256 pow = UintToArith256(blockHash256);
printf("block hash is %s\n", blockHash256.ToString().c_str());
printf("POW limit is %s\n", powerLimit.ToString().c_str());
if (pow < powerLimit)
{
printf("POW is correct, this block is acceptable.\n");
printf("%s\n\n", block.ToString().c_str());
}
else
{
printf("POW is wrong, this block is unacceptable.\n\n");
}
然后编译运行,结果示例如下:
这里特别说明几点:
void Finalize(unsigned char hash[OUTPUT_SIZE]) {
unsigned char buf[CSHA256::OUTPUT_SIZE];
sha.Finalize(buf);
sha.Reset().Write(buf, CSHA256::OUTPUT_SIZE).Finalize(hash);
}
【原创首发地址:http://blog.csdn.net/lazypiggy/article/details/79455655,转发请保留此链接】