使用VC学习BTC:(二)block工作量验证

使用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");
				}

然后编译运行,结果示例如下:

使用VC学习BTC:(二)block工作量验证_第1张图片

这里特别说明几点:

  • 目标值(nBits)是一个Compact格式的256bit的数,关于这个格式的说明,比特币官网说的很清楚,想了解的还是看英文原文为好,地址https://bitcoin.org/en/developer-reference#target-nbits,代码里对应的类是arith_uint256
  • block的HASH256,只使用了block的头数据共48字节;而比特币使用的HASH256是双SHA-256,即先把数据做一次SHA-256,然后将得到的32字节的哈希值,再一次做SHA-256。这部分对应的代码在hash.h的27行-31行,类CHASH256的Finalize函数中
    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,转发请保留此链接】

你可能感兴趣的:(比特币)