c++区块链实例_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 classBlock {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 voidBlock::SetHash() {2 stringstream ss;3 ss << _tTime << _data <<_prevhash _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 blocks 来存储区块的指针.

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

classBlockchain {public:

Blockchain(Block*p);

vectorblocks;void AddBlock(stringdatain);~Blockchain() {for (int i = 0; i < blocks.size(); i++) {if (blocks[i] !=NULL) {

delete blocks[i];

blocks[i]=NULL;

}

}

}private:

};

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

static Block*NewGenesisBlock() {return NewBlock("Genesis Block", "");

}static Blockchain*NewBlockchain() {//创建一个创世块 创世块没有prevhash 它是第一个块

Block* pblock =NewGenesisBlock();

Blockchain* p = newBlockchain(pblock);returnp;

}static Block* NewBlock(string datain, stringprevBlockHash) {

Block* p = newBlock( datain, prevBlockHash);returnp;

}

Blockchain::Blockchain(Block*p) {

blocks.clear();

blocks.push_back(p);

}

下面开始在main函数检测我们的函数是否工作正常

#include "Blockchain.h"#include"util.h"#include#include

using namespacestd;intmain()

{

Blockchain* bc =TOOLS::NewBlockchain();

bc->AddBlock("Send 1 BTC to Ivan");

bc->AddBlock("Send 2 more BTC to Ivan");for (int i = 0; i < bc->blocks.size(); i++) {

std::cout<< "Prev hash =" << bc->blocks[i]->_prevHash <<:endl>

std::cout<< "data =" << bc->blocks[i]->_data <<:endl>

std::cout<< "hash =" << bc->blocks[i]->_hash << std::endl <<:endl>

}//退出之前 删除

delete bc;return 0;

}

运行结果

下一个章节介绍工作量证明

本章节代码存储在QQ群文件中 文件名 MyBlockChainCppSample_part1

参考博文:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值