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区块的功能
我们不会实现一个如同比特币技术中使用的区块链,那太复杂。我们实现一个简化版的区块链基本原形,它仅包含了一些创建时间,区块描述以及本身的哈希数值,以及上一个区块的哈希数值。
class Block {
public:
string _hash; //当前区块的哈希
string _data; //区块描述字符
string _prevHash; //记录上个块的哈希值
Block(const string& prevHash, const string& dataIn); //构造函数
void SetHash(); //设置本区块的哈希
private:
int64_t _nNonce; //区块随机数 用于哈希值的产生
time_t _tTime; //创建时间
};
SetHash()函数就是根据区块的这些属性计算出区块的哈希值。计算出符合标准的区块哈希值应该是一个复杂困难的过程,即使在高速电脑中,也会人为的提升阀值,让区块的产生不那么快速。这个在随后的章节会介绍,这里只是使用最基本的计算方法。
根据结构体中的区块描述字符,创建时间以及上个区块的哈希值等元素计算出哈希值。 区块描述字符和创建时间是让哈希的计算有随机性,而添加上个区块的哈希值是让所有区块都具有关联性,用来提升篡改区块信息的难度。
代码中使用的sha256函数来自来自Zedwood的C++ sha256函数,具体介绍可以查看前面两个章节
void Block::SetHash() {
stringstream ss;
ss << _tTime << _data << _prevHash;
_hash = sha256(ss.str());
}
区块类的创建函数很简单就是填写各类信息,计算该区块的哈希值
Block::Block( const string& dataIn, const string& prevHash) {
_tTime = time(nullptr);
_nNonce = -;
_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 = ; 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 = new Blockchain(pblock);
return p;
}
static Block* NewBlock(string datain, string prevBlockHash) {
Block* p = new Block( datain, prevBlockHash);
return p;
}
Blockchain::Blockchain(Block* p) {
blocks.clear();
blocks.push_back(p);
}
下面开始在main函数检测我们的函数是否工作正常
#include "Blockchain.h"
#include "util.h"
#include <vector>
#include <iostream> using namespace std; int main()
{
Blockchain* bc = TOOLS::NewBlockchain(); bc->AddBlock("Send 1 BTC to Ivan");
bc->AddBlock("Send 2 more BTC to Ivan"); for (int i = ; i < bc->blocks.size(); i++) {
std::cout << "Prev hash = " << bc->blocks[i]->_prevHash << std::endl;
std::cout << "data = " << bc->blocks[i]->_data << std::endl;
std::cout << "hash = " << bc->blocks[i]->_hash << std::endl << std::endl; } //退出之前 删除
delete bc; return ;
}
运行结果

下一个章节介绍工作量证明
本章节代码存储在QQ群文件中 文件名 MyBlockChainCppSample_part1
参考博文:
https://blog.csdn.net/simple_the_best/article/details/78073844
https://jeiwan.cc/posts/building-blockchain-in-go-part-1/
cpp 区块链模拟示例(三)新基本原形工程的建立的更多相关文章
- cpp 区块链模拟示例(一)工程建立
/* 作 者: itdef 欢迎转帖 请保持文本完整并注明出处 技术博客 http://www.cnblogs.com/itdef/ 技术交流群 群号码:432336863欢迎c c++ window ...
- cpp 区块链模拟示例(四) 区块链工作量证明
本文主要在之前的区块链原形上添加了工作量证明,并且为后继的交易功能做好准备. 上一个章节我们已经创建了区块链的基本原形,但是区块的哈希计算和加入太过于简单,如果按照这种速度添加区块那么区块链估计一个小 ...
- cpp 区块链模拟示例(五) 序列化
有了区块和区块链的基本结构,有了工作量证明,我们已经可以开始挖矿了.剩下就是最核心的功能-交易,但是在开始实现交易这一重大功能之前,我们还要预先做一些铺垫,比如数据的序列化和启动命令解析. 根据< ...
- cpp 区块链模拟示例(七) 补充 Merkle树
Merkle 树 完整的比特币数据库(也就是区块链)需要超过 140 Gb 的磁盘空间.因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本.随 ...
- cpp 区块链模拟示例(二)工程代码解析
/* 作 者: itdef 欢迎转帖 请保持文本完整并注明出处 技术博客 http://www.cnblogs.com/itdef/ 技术交流群 群号码:432336863欢迎c c++ window ...
- cpp 区块链模拟示例(六) 交易
交易(transaction)是比特币的核心所在,而区块链的唯一目的,也正是为了能够安全可靠地存储交易.在区块链中,交易一旦被创建,就没有任何人能够再去修改或是删除它.在今天的文章中,我们会实现交易的 ...
- 使用Geth 构建以太坊区块链并模拟挖矿过程
使用Geth 构建以太坊区块链并模拟挖矿过程 Go-ethereum 是以太坊官方的一个Golang 实现,我们可以使用Geth 工具来创建创世区块并启动区块链,使用Clef 实现以太坊钱包的功能,以 ...
- 一、Bitcoin比特币与BlockChain区块链技术
一.比特币历史 2008 年 10 月 31 日,一个网名叫中本聪(英文翻译过来滴)的家伙发布比特币唯一的白皮书:<Bitcoin:A Peer-to-PeerElectronic Cash S ...
- 001-Bitcoin比特币与BlockChain区块链技术
一.比特币历史 2008 年 10 月 31 日,一个网名叫中本聪(英文翻译过来滴)的家伙发布比特币唯一的白皮书:<Bitcoin:A Peer-to-PeerElectronic Cash S ...
随机推荐
- CentOS 7安装php
我们已经在上一篇里安装上了nginx:现在我们想要php(也许还包括mysql). (CentOS 7里使用mariadb替代了mysql) # yum install mariadb-client ...
- zabbix监控windows服务器
Zabbix agent 在windows上安装部署 1. 下载与解压 地址: http://www.zabbix.com/downloads/2.4.0/zabbix_agents_2.4.0.w ...
- Word中一条删除不掉的单或双横线的解决办法
Word中一条删除不掉的单或双横线 有时你或许会遇到这样一种情况:在word中,有一条单或双横线怎么都删除不了,并且具有这样的特点: 在上面输入文字,横线会自动下调一行,如果文章过页,每页的尾部会有一 ...
- 使用 JavaScript 将 XML 转成 JSON
function xmlToJson(xml) { // Create the return object var obj = {}; if (xml.nodeType == 1) { // elem ...
- html/css/js-横向滚动条的实现
在前端UI设计时,网页的制作很麻烦,深有感悟!碰到太多的不懂,或是第一次见,就要去网上找资料!横向滚动条就是我遇到麻烦中其中的一个,其实也 很简单,只是在几次项目中都用到了这个横向滚动条所以就拿出来说 ...
- centos6.5 yum安装redis
1.yum添加epel源 yum install epel-release 2.安装yum yum install redis 3.Redis 服务端配置——Could not connect to ...
- 异常处理,MD5
异常处理. try except raise try: 代码 except 异常类: 除了错, 如何处理异常 except 异常类: 除了错, 如何处理异常 except 异常类: 除了错, 如何处理 ...
- gentoo Cataclysm - Dark Days Ahead
gentoo 中安装 Cataclysm - Dark Days Ahead,使用web 下载稳定版的安装包,使用 tar 进行解压. 安装需要共享库:sdl2-mixer, 未完待续
- kettle数据库连接使用变量
新增db连接(密码也可以设置参数) 转换中,右键空白处,选择转换设置
- thinkphp5.0 - Redis 实现秒杀
首先,因为秒杀这个环节在商城项目中比较常见,最近写商城项目,碰到这个功能模块,于是就拿出来给大家分享一波. 难点:高并发的情况下,正常逻辑写的话数据库的库存会出现负数,对付这类问题有很多解决方案,我就 ...