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] = ‘\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 构建一个区块链》的c++化和内容的讲解

原文地址:https://www.cnblogs.com/itdef/p/9429269.html

时间: 2024-09-30 12:11:20

cpp 区块链模拟示例(二)工程代码解析的相关文章

cpp 区块链模拟示例(三)新基本原形工程的建立

/* 作 者: itdef 欢迎转帖 请保持文本完整并注明出处 技术博客 http://www.cnblogs.com/itdef/ 技术交流群 群号码:432336863欢迎c c++ windows驱动爱好者 服务器程序员沟通交流部分老代码存放地点http://www.oschina.net/code/list_by_user?id=614253 */ 本章节相比前两节课程,增加了交易等处理,而在工作量证明,挖矿,创建区块,以及区块链的操作也细致了不少. 工程的具体建立可以参考前两章节内容,

cpp 区块链模拟示例(七) 补充 Merkle树

Merkle 树 完整的比特币数据库(也就是区块链)需要超过 140 Gb 的磁盘空间.因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本.随着越来越多的人使用比特币,这条规则变得越来越难以遵守:因为不太可能每个人都去运行一个全节点.并且,由于节点是网络中的完全参与者,它们负有相关责任:节点必须验证交易和区块.另外,要想与其他节点交互和下载新块,也有一定的网络流量需求. 在中本聪的 比特币原始论文 中,对这个问题也有一个解决方案:简易支付

区块链数字货币交易系统开发技术解析

区块链数字货币交易系统开发技术解析功能成熟.应用广泛的数字资产现货交易系统,强大的内存撮合引擎保证高并发量交易支持,包含完善的前后台系统,提供配套中心化钱包,系统安全稳定,可保障平台和用户双方的隐私安全.系统安全和资产安全.支持策略委托,支持国际化.提供自定义和第三方两种K线,技术分析和划线工具,支持策略委托,支持API下单三重用户KYC认证,多种身份校验,机器防刷,权限隔离配套财务系统和风控体系,配套中心化钱包,支持所有主流币种及其代币,配套后台审核和运营CMS系统,国际化语言包,快速稳定支持

第10讲 | 深入区块链技术(二):P2P网络

在上一篇文章中,我大致讲解了一下区块链技术的几个核心要素.P2P网络协议.分布式一致性算法(共识机制).加密签名算法.账户与存储模型.今天我们就来看看区块链技术的第一个核心要素:P2P网络. 如果我们简单来看P2P技术,它的应用领域已经非常广泛了,从流媒体到点对点通讯.从文件共享到协同处理,多种领域都有它的身影出现. 同样的,P2P的网络协议也有很多,比较常见的有BitTorrent.ED2K.Gnutella.Tor等,也就是我们常说的BT工具和电驴. 比特币.以太坊等众多数字货币都实现了属于

微信公众平台java开发详解(工程代码+解析)

最近再写一个中科大的硕士毕业论文——<基于HTML5的微信营销系统的设计与实现>,但在写论文第一章绪论中的研究内容时,思路突然中断,于是在网上必应了一下,于是看到了这篇文章,对于初学者来说,讲解的详细透彻,于是特意记录下来,以待日后使用. 参考如下来源: http://www.sxt.cn/info-2722-u-756.html

主流区块链技术特点及Fabric V0.6&V1.0版本特点

声明:文章内容来源于网络. 一.主流区块链技术特点 二.Hyperledger的fabric V0.6总体架构: 对应的0.6版本的运行时架构: 0.6版本的架构特点是: 结构简单: 应用-成员管理-Peer的三角形关系,主要业务功能全部集中于Peer节点:    架构问题:由于peer节点承担了太多的功能,所以带来扩展性.可维护性.安全性.业务隔离等方面的诸多问题,所以0.6版本在推出后,并没有大规模被行业使用,只是在一些零星的案例中进行业务验证: 三.Hyperledger的fabric V

星光区块链

如果我们把数据库假设成一本账本,读写数据库就可以看做一种记账的行为,区块链技术的原理就是在一段时间内找出记账最快最好的人,由这个人来记账,然后将账本的这一页信息发给整个系统里的其他所有人.这也就相当于改变数据库所有的记录,发给全网的其他每个节点,所以区块链技术也称为分布式账本(distributed ledger).联系电话:0755-23204229 区块链可以大致分成两个层面,一是做区块链底层技术;二是做区块链上层应用,即基于区块链的改造.优化或者创新应用.一:区块链的核心意义到底是什么我们

星光区块链技术

您认识区块链吗?如果我们把数据库假设成一本账本,读写数据库就可以看做一种记账的行为,区块链技术的原理就是在一段时间内找出记账最快最好的人,由这个人来记账,然后将账本的这一页信息发给整个系统里的其他所有人.这也就相当于改变数据库所有的记录,发给全网的其他每个节点,所以区块链技术也称为分布式账本(distributed ledger).联系电话:0755-23204229 区块链可以大致分成两个层面,一是做区块链底层技术;二是做区块链上层应用,即基于区块链的改造.优化或者创新应用.一:区块链的核心意

谈谈我对区块链的理解(基础篇)

最近,区块链技术成为每个人耳渲目染的话题,甚至被一些人认为可以颠覆整个社会,可能是由于比特币的大涨,也有可能是因为国家政策的出行,各个国家都在为区块链招兵买马.如果一个人没有了解区块链.没有了解过比特币的话,可能会认为这个只是被炒起来的数字货币而已,对整个社会并没有什么价值可言,起初,我也保持着这样的态度.但是,真正了解了区块链技术.这种去中心化的思想.以及智能合约的公平公正之后,我才意识到了这项技术对于未来社会的价值所在.接下来,我们一起去了解一下区块链.比特币,看一下这项技术会如何颠覆我们的