/*
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
技术交流群 群号码:432336863
欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
部分老代码存放地点
http://www.oschina.net/code/list_by_user?id=614253
*/
今天,我将开启一个使用c++模拟区块链的系列,记录自己学习区块链与实践的心得体会.
文章将参考《一步步教小白使用C++构建区块链》(c++语言)
《用 Go 构建一个区块链 ---- Part 1: 基本原型》 (go语言) 等博客文,
通过使用c++编写和讲解一个简单的区块链代码,来加深自己对区块链原理的理解。
区块链中大量使用哈希算法。
算法将参与需要计算的整体内容全部作为元素添加至哈希计算中,最后得出一个独一无二的计算结果。
他的好处在于,可以用来验证一个文件没有被任何人更改。如果同时拥有待验证内容和哈希计算的结果,那么你可以很快验证自己的待验证内容是否正确。同时,正确内容遭到刻意的修改而计算出正确的哈希结果这种事情几乎不存在。
在这个示例中 我们使用来自Zedwood的C++ sha256函数提供我们需要的哈希计算,该链接中有sha256.h,sha256.cpp和LICENSE.txt文件,我们将它们保存在项目文件夹中。
前言少叙,开始建立工程。使用工具为vs2017,环境为windows操作系统.
创建一个窗口程序,名字叫做MyBlockChainCppSample.如图
建成后,MyBlockChainCppSample.cpp就是main文件包含main入口函数,暂时不必管它.如图
我们接下来创建区块和区块链的结构说明和实现。
区块的结构放在Block.h,由Block.cpp实现。
区块链的结构放在Blockchain.h,由Blockchain.cpp实现.
还有刚才提到的sha256.h,sha256.cpp和LICENSE.txt也要添加进工程中.

1 #pragma once 2 3 4 #include <cstdint> 5 #include <iostream> 6 7 8 using namespace std; 9 10 #define DifficultyNum 4 11 12 class Block { 13 public: 14 string sPrevHash; //记录上个块的哈希值 15 Block(uint32_t nIndexIn, const string &sDataIn); //构造函数 16 string GetHash(); //获取哈希函数 17 void MineBlock(uint32_t nDifficulty); //挖矿函数 18 private: 19 uint32_t _nIndex; //该区块的索引值 20 int64_t _nNonce; //区块随机数 用于哈希值的产生?? 21 string _sData; //区块描述字符 22 string _sHash; //区块哈希值 23 time_t _tTime; //创建时间 24 string _CalculateHash() const; //哈希值计算函数 25 };

1 #include "Block.h" 2 #include "sha256.h" 3 #include <time.h> 4 #include <sstream> 5 6 Block::Block(uint32_t nIndexIn, const string &sDataIn) : _nIndex(nIndexIn), _sData(sDataIn) { 7 _nNonce = -1; 8 _tTime = time(nullptr); 9 } 10 11 string Block::GetHash() { 12 return _sHash; 13 } 14 15 void Block::MineBlock(uint32_t nDifficulty) { 16 char cstr[DifficultyNum + 1]; 17 for (uint32_t i = 0; i < DifficultyNum; ++i) { 18 cstr[i] = '0'; 19 } 20 cstr[DifficultyNum] = '