cpp 区块链模拟示例工程代码解析
Posted itdef
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cpp 区块链模拟示例工程代码解析相关的知识,希望对你有一定的参考价值。
书接上文
我们先来看区块的结构
1 class Block { 2 public: 3 string sPrevHash; //记录上个块的哈希值 4 Block(uint32_t nIndexIn, const string &sDataIn); //构造函数 5 string GetHash(); //获取哈希函数 6 void MineBlock(uint32_t nDifficulty); //挖矿函数 7 private: 8 uint32_t _nIndex; //该区块的索引值 9 int64_t _nNonce; //区块随机数 用于哈希值的产生 10 string _sData; //区块描述字符 11 string _sHash; //区块哈希值 12 time_t _tTime; //创建时间 13 string _CalculateHash() const; //哈希值计算函数 14 };
区块结构很清晰。 一个区块就是一个创建时间、描述字符、区块随机数字等数据组成。
我们要创建一个区块就是根据创建时间、描述字符、区块随机数字等数据来计算出一个哈希值(_CalculateHash函数的功能)。
inline string Block::_CalculateHash() const { stringstream ss; ss << _nIndex << _tTime << _sData << _nNonce << sPrevHash; return sha256(ss.str()); }
由于_nNonce与创建时间是一值在变化的,_CalculateHash()会产生一个个的哈希。
在MineBlock()函数中对这些哈希进行检测,看看是否符合标准,一旦符合标准,那么久诞生了一个区块。
这里的MineBlock()函数中,根据设置的DifficultyNum,来检测哈希数值前DifficultyNum位是否为零,只有符合标准才是产生的区块的可使用的哈希值
随即产生的哈希值中,前DifficultyNum位为零,只在一定概率下才产生。 这也是为了限制区块的产生速度,在本次区块链技术模拟中,我们称之为"工作量证明"
void Block::MineBlock(uint32_t nDifficulty) { char cstr[DifficultyNum + 1]; for (uint32_t i = 0; i < DifficultyNum; ++i) { cstr[i] = ‘0‘; } cstr[DifficultyNum] = ‘