文档章节

cpp 区块链模拟示例(二)工程代码解析

o
 osc_pn11u1x9
发布于 2018/08/06 11:19
字数 969
阅读 11
收藏 0

/*

作 者: itdef 

欢迎转帖 请保持文本完整并注明出处 
技术博客 http://www.cnblogs.com/itdef/ 
技术交流群 群号码:432336863
欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
部分老代码存放地点
http://www.oschina.net/code/list_by_user?id=614253

*/

 

书接上文

我们先来看区块的结构

 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] = '\0';
    string str(cstr);
    do {
        _nNonce++;
        _sHash = _CalculateHash();
    } while (_sHash.substr(0, nDifficulty) != str);
    cout << "Block mined: " << _sHash << endl;
}


Block
结构体中 sPrevHash就是记录该区块的上一个区块的哈希值。区块链技术中使用一种方法将哈希值与区块一一对应。

这样知道一个区块和区块中的sPrevHash。通过查找可以依次遍历区块链中的每个区块。这些有关联的区块也正是使用这种方法组成了区块链.

 

 

区块链结构体如下

class Blockchain {
public:
    Blockchain();                    //区块链构造函数
    void AddBlock(Block bNew);        //区块链添加区块函数
private:
    uint32_t _nDifficulty;            //难度值
    vector<Block> _vChain;            //记录区块链
    Block _GetLastBlock() const;    //获取最后一个区块
};

大致的示意图如下

我们的模拟文章中,区块链使用了vector<Block> _vChain来记录每个区块,每个区块中都有自己在这个vector中的索引_nIndex,这样查找起来更简单快捷。

区块链创建的时候会插入一个索引为零,描述字符为" Genesis Block "的区块,称之为创始块. 创世块与其他块的区别是交易的输入与输出,这个在后继章节再详细介绍。

AddBlock()与_GetLastBlock()相对比较简单,_GetLastBlock()就是返回vector<Block> _vChain的最后一个元素。

AddBlock()就是通过挖矿产生一个区块,放入到记录vector<Block> _vChain中。当然要记得设置该块的sPrevHash为之前区块链中最后一个块的哈希值.

Blockchain::Blockchain() {
    _vChain.emplace_back(Block(0, "Genesis Block"));
    _nDifficulty = DifficultyNum;
}

void Blockchain::AddBlock(Block bNew) {
    bNew.sPrevHash = _GetLastBlock().GetHash();
    bNew.MineBlock(_nDifficulty);
    _vChain.push_back(bNew);
}

Block Blockchain::_GetLastBlock() const {
    return _vChain.back();
}

 

《build-a-blockchain-with-c》 的讲解和VC工程的建立就到此为止。

相对《用 Go 构建一个区块链》 ,《build-a-blockchain-with-c》代码量少而且简单。

下面的章节我们将进行 《用 Go 构建一个区块链》的c++化  并讲解代码内容

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

git 为项目设置用户名/邮箱/密码

1.找到项目所在目录下的 .git,进入.git文件夹,然后执行如下命令分别设置用户名和邮箱 git config user.name "Affandi" git config user.email "123333333@qq.com" 然后执行命令查看con......

有时很滑稽
40分钟前
0
0
如何从int转换为String? - How do I convert from int to String?

问题: I'm working on a project where all conversions from int to String are done like this: 我正在一个项目中,所有从int到String转换都是这样完成的: int i = 5;String strI = "" ......

javail
51分钟前
10
0
Vue+Spring Data JPA+MySQL 增查改删

视频讲解: https://www.bilibili.com/video/BV16i4y1G7i2/ 工程概述: 前后端分离,进行简单增查改删(CRUD) 前端使用VUE 后端使用Spring Data JPA 数据库使用MySQL #EmployeeController.jav...

潘文海
今天
13
0
我花了一个星期,做出了公司的管理系统,只需几个步骤!

我是企业的管理人员,公司发展到现阶段,感觉进入到了瓶颈期,每个员工的工作都已经饱和,很难再挤出时间做其它的事情,需要一款合适的管理软件来协作我们的工作。本来打算买一套管理软件就行...

科技那些事儿
今天
19
0
如何从Android应用程序获取崩溃数据? - How do I obtain crash-data from my Android application?

问题: How can I get crash data (stack traces at least) from my Android application? 如何从我的Android应用程序获取崩溃数据(至少是堆栈跟踪)? At least when working on my own de......

技术盛宴
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部