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

 

/*ios

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

*/程序员

 

 

 

本章节相比前两节课程,增长了交易等处理,而在工做量证实,挖矿,建立区块,以及区块链的操做也细致了很多。windows

工程的具体创建能够参考前两章节内容,这里再也不赘述。服务器

 

区块Block

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

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

 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 来存储区块的指针. ui

与go语言不一样的是 全部的内存分配,咱们须要自行在退出前归还内存。因此在析构函数中依次遍历容器内的指针而且进行删除内存。结构体以下spa

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创世区块。 这个区块与其余区块的区别在于该区块没有上一个区块信息,它是第一个区块。

 

        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 = 0; 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 0;
}

 

运行结果

 

下一个章节介绍工做量证实
本章节代码存储在QQ群文件中 文件名 MyBlockChainCppSample_part1

 

参考博文:

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

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

相关文章
相关标签/搜索