/*

作 者: itdef

欢迎转帖 请保持文本完整并注明出处

技术博客 http://www.cnblogs.com/itdef/

技术交流群 群号码:432336863

欢迎c c++ windows驱动爱好者 服务器程序员沟通交流

部分老代码存放地点

http://www.oschina.net/code/list_by_user?id=614253

*/

今天,我将开启一个使用c++模拟区块链的系列,记录自己学习区块链与实践的心得体会.

通过使用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

5 #include

6

7

8 using namespacestd;9

10 #define DifficultyNum 4

11

12 classBlock {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 };

Block.h

1 #include "Block.h"

2 #include "sha256.h"

3 #include

4 #include

5

6 Block::Block(uint32_t nIndexIn, const string &sDataIn) : _nIndex(nIndexIn), _sData(sDataIn) {7 _nNonce = -1;8 _tTime =time(nullptr);9 }10

11 stringBlock::GetHash() {12 return_sHash;13 }14

15 voidBlock::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] = '\0';21 stringstr(cstr);22 do{23 _nNonce++;24 _sHash =_CalculateHash();25 } while (_sHash.substr(0, nDifficulty) !=str);26 cout << "Block mined:" << _sHash <

29

30 inline string Block::_CalculateHash() const{31 stringstream ss;32 ss << _nIndex << _tTime << _sData << _nNonce <

Block.cpp

1 #pragma once

2

3 #include

4 #include

5 #include "Block.h"

6

7 using namespacestd;8

9 classBlockchain {10 public:11 Blockchain(); //区块链构造函数

12 void AddBlock(Block bNew); //区块链添加区块函数

13 private:14 uint32_t _nDifficulty; //难度值

15 vector _vChain; //记录区块链

16 Block _GetLastBlock() const; //获取最后一个区块

17 };

Blockchain.h

1 #include "Blockchain.h"

2

3

4 Blockchain::Blockchain() {5 _vChain.emplace_back(Block(0, "Genesis Block"));6 _nDifficulty =DifficultyNum;7 }8

9 voidBlockchain::AddBlock(Block bNew) {10 bNew.sPrevHash =_GetLastBlock().GetHash();11 bNew.MineBlock(_nDifficulty);12 _vChain.push_back(bNew);13 }14

15 Block Blockchain::_GetLastBlock() const{16 return_vChain.back();17 }

Blockchain.cpp

最后的工程结构如图

在MyBlockChainCppSample.cpp中添加以下代码

#include "Blockchain.h"

int main() {

Blockchain bChain = Blockchain();

cout << "Mining block 1..." << endl;

bChain.AddBlock(Block(1, "Block 1 Data"));

cout << "Mining block 2..." << endl;

bChain.AddBlock(Block(2, "Block 2 Data"));

cout << "Mining block 3..." << endl;

bChain.AddBlock(Block(3, "Block 3 Data"));

return 0;

}

到此代码添加结束 但是VC中编译代码可能会遇到以下问题

1 提示 stdafx.h未添加  这是VC默认要添加预编译头 我们可以设置不需要预编译头来解决这个问题(也可以在每个cpp文件中添加stdafx.h)

解决方式如图

2 会提示sprintf函数 不能使用。这是因为该函数时候早期使用的,在字符串处理上可能存在潜在处理错误。我们可以定义一个宏来告知编译器我们知道此类错误并愿意使用

定义如图

最后编译结果如图

这是设置 #define DifficultyNum 6  , 难度为6的计算结果

Mining block 1...

Block mined: 000000182cfdfadfd84a0578f64d68a1c38bbaf4cbcf18027b0be00ee9a37e18

Mining block 2...

Block mined: 0000002f57459a48244bbf39d089a2b6e7b9aac8dca7ef8b7e71ef6a24753522

Mining block 3...

Block mined: 000000a2eaf0c37a192b182e038e4b20146bfdadb5fffb3bb836d8a7af89c16d

请按任意键继续. . .

这是设置 #define DifficultyNum 4 , 难度为4的计算结果

Mining block 1...

Block mined: 0000dcdb20156ad2777f685bab10bde456b756c40ac7c1a70ab5015ccf207309

Mining block 2...

Block mined: 0000350fb47c51201df28dd8e5b0baf517bcf6175dad8df29feba87b5eaadfbe

Mining block 3...

Block mined: 0000aede11083363a82c9ec43346b1895d818ecde528a171e837e5577478cd78

请按任意键继续. . .

下篇进行代码解析

c++区块链实例_cpp 区块链模拟示例(一)工程建立相关推荐

  1. 一个基于PoS共识算法的区块链实例解析(升级版)

    一个基于PoS共识算法的区块链实例解析(升级版) 一.前言 前面我们简单的介绍了一个基于PoS共识算法的例子,今天我们来解析一个升级版的例子.如果喜欢博主的话,记得点赞,关注,收藏哦~ 二.本例中的一 ...

  2. c++区块链实例_以太坊C++源码解析(五)区块链同步(2)

    区块链同步的核心类是BlockChainSync,在继续深入了解同步流程之前,我们还是先来了解一下这个类有哪些重要成员吧. m_chainStartBlock & m_startingBloc ...

  3. 区块链架构、跨链和演进

    本文是基于作者近几年来对各种区块链平台理念和技术的研究,结合作者过去十多年的 IT 经验,审慎思考的结果 ,文章仅代表作者个人观点.作者会假设读者对各种区块链平台有一定的认知,不会对具体的区块链平台再 ...

  4. 区块链为什么叫区块链_什么是区块链?

    区块链为什么叫区块链 世界和它的狗为区块链(及相关技术,这是另一篇文章)疯狂了. 在过去的两年中,这项技术大肆宣传过山车,其中包括同样疯狂的估值,技术建议,媒体曝光,监管噩梦,欺诈和未实现的梦想. 但 ...

  5. 【区块链实战】区块链在哪些行业得到了应用

    目录 一.简介 二.知识点 区块链应用场景 数字金融:微众 FISCO BCOS 北京互联网法院: 天平链 食品安全: 京东智臻链 三.应用实例 1.微众 FISCO BCOS 2.北京互联网法院 天 ...

  6. 【案例】蜂巢链:基于区块链的资产证劵化

    资产证券化作为一种新的投融资工具,可以完善资本市场的结构,改善资源配置,提高资金金运作效率,从而促进经济结构的优化,实现盘活存量量.为实体经济服务的目的. 作者 | 泛融科技 官网 | www.dat ...

  7. [区块链安全-Ethernaut]区块链智能合约安全实战-已完结

    [区块链安全-Ethernaut]区块链智能合约安全实战-已完结 准备 0. Hello Ethernaut 准备工作 创建实例并分析 合约交互 总结 1. Fallback 创建实例并分析 合约交互 ...

  8. 区块链性能提升:链上设计之道

    补天遗石 本文目录: 1 区块链的功能组件(Functional Components of a Blockchain) 1.1 交易验证(Transaction Validation) 1.2 区块 ...

  9. 区块链编程_区块链编程的10个最佳工具包

    区块链编程 区块链世界中的许多精力和兴奋都集中在加密货币,其暴涨的估值以及令人震惊的崩溃上. 大多数企业界都静静地待在场上,弹出一些玉米,然后定居下来欣赏表演. 但是,随着公司开始将脚趾伸向动荡的水域 ...

最新文章

  1. (0020)iOS 开发之-设计模式-懒加载解惑
  2. java 下雪_如何用JAVA实现下雪场景
  3. vim 格式化json
  4. JavaScript学习总结(六)——JavaScript判断数据类型总结
  5. layui Form内容重置清空
  6. TortoiseGit使用
  7. python真的那么火还是炒作_Python语言为什么会这么火?老男孩python
  8. r intersect()_30分钟掌握R语言编程基础
  9. 源码编译wget问题解决
  10. MATLAB中常见的取整函数
  11. 20200819:力扣202周周赛题解记录
  12. MITRE 发布防御知识库 Shield
  13. 【转帖】WEB架构师成长之路之一-走正确的路
  14. SpringMVC 搭建遇到的坑
  15. MapReduce工作机制详解
  16. 桑心啊,ListT.FindAll()的效率竟然比for循环还差。
  17. 关于perl6的若干问题?
  18. java Eclipse 如何打开bin文件目录视图
  19. minIO安装教程及代码使用
  20. 【PX4 飞控剖析】05 PIX4 连接QGC 可以烧录固件但是连接不上

热门文章

  1. android pcm文件大小_Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件...
  2. 【Proteus仿真】基于DHT11的温度测量,LCD1602显示
  3. 测试控件页面 html,Web页面测试总结—控件类
  4. vue+quasar开发移动app-搭建项目
  5. 深入浅出CChart 每日一课——快乐高四第三十课 麦正帮主,ActiveX控件巨鲸帮巨鲸岛之易语言篇
  6. 中台实践:数字化转型方法论与解决方案
  7. javaScript的Map数据类型
  8. SOC与MCU的区别是什么
  9. bowtie 加mn标签_bowtie和bowtie2用法详解
  10. e‘q‘e‘q‘e‘q‘w