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

/*

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

*/

本章节相比前两节课程,增加了交易等处理,而在工作量证明,挖矿,创建区块,以及区块链的操作也细致了不少。

工程的具体建立可以参考前两章节内容,这里不再赘述。

区块Block

我们在工程中首先创建Block.h和Block.cpp,用来实现block区块的功能

我们不会实现一个如同比特币技术中使用的区块链,那太复杂。我们实现一个简化版的区块链基本原形,它仅包含了一些创建时间,区块描述以及本身的哈希数值,以及上一个区块的哈希数值。

 1 class Block {
 2 public:
 3     string    _hash;                //当前区块的哈希
 4     string    _data;                //区块描述字符
 5     string    _prevHash;            //记录上个块的哈希值
 6     Block(const string&    prevHash, const string& dataIn);    //构造函数
 7     void SetHash();                //设置本区块的哈希
 8 private:
 9     int64_t _nNonce;            //区块随机数 用于哈希值的产生
10     time_t    _tTime;                //创建时间
11
12 };
SetHash()函数就是根据区块的这些属性计算出区块的哈希值。计算出符合标准的区块哈希值应该是一个复杂困难的过程,即使在高速电脑中,也会人为的提升阀值,让区块的产生不那么快速。这个在随后的章节会介绍,这里只是使用最基本的计算方法。根据结构体中的区块描述字符,创建时间以及上个区块的哈希值等元素计算出哈希值。 区块描述字符和创建时间是让哈希的计算有随机性,而添加上个区块的哈希值是让所有区块都具有关联性,用来提升篡改区块信息的难度。代码中使用的sha256函数来自来自Zedwood的C++ sha256函数,具体介绍可以查看前面两个章节
1 void Block::SetHash() {
2     stringstream ss;
3     ss << _tTime << _data << _prevHash;
4     _hash = sha256(ss.str());
5 }

区块类的创建函数很简单就是填写各类信息,计算该区块的哈希值

Block::Block( const string& dataIn, const string&    prevHash) {
    _tTime = time(nullptr);
    _nNonce = -1;
    _data = dataIn;
    _prevHash = prevHash;
    SetHash();
}

区块链Blockchain

区块链就是一个个区块的集合。使用vector<Block*> blocks 来存储区块的指针.

与go语言不同的是 所有的内存分配,我们需要自行在退出前归还内存。所以在析构函数中依次遍历容器内的指针并且进行删除内存。结构体如下

class Blockchain {
public:
    Blockchain(Block* p);
    vector<Block*>    blocks;
    void AddBlock(string datain);
    ~Blockchain() {
        for (int i = 0; i < blocks.size(); i++) {
            if (blocks[i] != NULL) {
                delete blocks[i];
                blocks[i] = NULL;
            }
        }
    }
private:

};

所有的区块链创建时候会添加一个Genesis Block创世区块。 这个区块与其他区块的区别在于该区块没有上一个区块信息,它是第一个区块。

to be continue......


参考博文:

https://blog.csdn.net/simple_the_best/article/details/78073844

https://jeiwan.cc/posts/building-blockchain-in-go-part-1/

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

时间: 2024-10-05 03:02:25

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

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

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

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

关于Xcode6-beta2 新学者使用 工程的建立

1.点开Xcode的选择第二项创建一个新工程 2.选择第三个singie view Application 3.第一项为工程名 第二项(随便取) 4.选择工程保存路径 工程就新建好的 关于Xcode6-beta2 新学者使用 工程的建立

在EOSIO平台上开发区块链dapp(三、webapp)

这是一步步的用EOSIO开发区块链DApp的第三部分,上一部分中,我为EOSIO平台开发了一个模拟选举的智能合约.这部分我将开发一个webapp,允许访问者投票给候选人. 以下是webapp的快速预览: 源代码说明 首先,请参阅下面的概述图: 前端 前端由HTML,CSS和Javascript组成.我使用Semantic-UI作为CSS框架以获得漂亮的外观.JQuery在Javascript中被大量使用以便于开发. 此webapp只有一个页面(主页HTML).主页分为四个部分. 以下是部分的屏幕

区块链公司谈区块链技术定义的新数字信任协议

数学上值得信赖的协议,有三个主要的限制. 首先,这个虚拟计算机非常慢:在某些情况下,每个网络消息只能进行一次算术计算.目前,它最多只能用于作为更有效的计算和协议的附件或组件的小型逻辑或算术计算. 第二,在隐私.公平和容错之间存在权衡问题.公平意味着每个人都以这样一种方式学习结果,没有人可以通过先学习获得优势.容错可以提供对少数人的鲁棒性(鲁棒是Robust的音译,也就是健壮和强壮的意思.它是在异常和危险情况下系统生存的关键.),因此需要大多数人退出才能停止协议,容错可以是非鲁棒的,或是故障停止,

区块链对人工智能的变革:去中心化将带来数据新范式

区块链对人工智能的变革:去中心化将带来数据新范式 2017-01-03 14:59:27  来源:网络大数据  CIO时代抢沙发 摘要:本文基于我个人在人工智能和区块链研究方面的经验,描述了区块链技术可以如何辅助人工智能.二者结合一处即发!区块链技术--尤其是行星尺度的--可以帮助实现人工智能和数据团体长期以来的一些梦想,并打开一些机会.关键词: 区块链 人工智能 近年,从围棋到人类水平的语音识别,人工智能(AI)研究者终于在他们几十年一直努力探索的领域取得了突破.取得突破进展的关键一点是研究者

区块链技术研发_区块链技术实体结合解决方案_汇新云

区块链技术研发_区块链技术实体结合解决方案_汇新云区块链技术实体结合解决方案--汇新云,区块链的底层逻辑是以共同竞争记账方式存储信息,每一页加密账本相当于"区块",而交易审核结果盖上了不可篡改的时间戳,遍布存储于整个网络.这种"分布式总账技术"带来了权益归属和陌生人的互信,为资产自由交易带来了曙光.区块链是一个公共的分布式总账,任何发生在此区块链网络上的交易会被约定的算法记录到区块链上,且满足以下条件:1.存储基于分布式数据库2.数据库是区块链的数据载体,区块链是交

区块链:定义未来金融与经济新格局

区块链:定义未来金融与经济新格局 1 区块链是什么 区块链的本质 区块链的本质是一种去中心化的记账系统,区块链与比特币之间的关系就是凯恩斯所说的记账货币与货币之间的关系,区块链是一套由信用记录以及信用记录的清算构成的体系. 共识机制与价值载体 共识机制是区块链技术的核心,它使得区块链这样一个去中心化的账本系统成为可能;而价值载体是区块链技术的潜力所在,它使得区块链技术的应用领域远不止数字货币.这两个核心因素是区块链内生能力得以扩展的关键. 价值载体共识机制的建立使得区块链这样一个去中心化的记账系

什么是POC(容量证明)硬盘挖矿机,未来区块链应用新趋势?

PoW是工作量证明,PoS是权益证明,DPoS是委托权权益证明,但PoC是一种怎么样的共识机制? PoC是Proof of Capacity的缩写,称之为容量证明机制,它是POW 共识机制的一种,它是以硬盘作为共识参与者,它的特点是牺牲性能获得安全可信,相对POW 减少了非常多的安全和信任成本,更低成本解决了全局信任和安全,几乎不耗电力资源,并且可共享和复用的信任生态. 目前大部分数字货币挖矿采用的是POW(工作量证明).仅有BHD.Burst使用POC挖矿模式(Yottachain主网并未上线