C++实现区块链的源码

看了上面的算法,相信大家基本可以猜到,相对于比特币的限量的性质,对于本算法来说,难解程度的根本原因即为向量环路的迭代次数。迭代次数越多,则算法越难解,从而导致解题需要花费更多的时候,再基于这点,在数学上,当解题次数足够大时,效率会无限小,从而导致了解题时间无限长最后导致加密货币的发放无限小。
创世区块创建(部分大妈在前面有实现,而区块这一部分将会详细解答)

void Make_First_Block()
{
Getpublickey();
blo.data = circle;
blo.pre_hash = 0;
blo.this_hash = (blo.pre_hash+public_Key) * (a+b);
Block.push_back(blo);
}

由于在区块链中,本区快的数字签名是基于上一区块的数字签名和区块本身的DATA决定, 所以,在这里我们采用了上一区块的数字签名加上难解的PublicKey乘上长轴和短轴的和实现本区块的数字签名的算法。
添加区块(当当前区块被算出时,添加新区块,检查签名正确性。)

void Append_Block()
{
pre_blo = blo;
bool flag = true;
auto temp = public_Key;
circle = circle + 1;
Getpublickey();
blo.data = circle;
blo.pre_hash = blo.this_hash;
blo.this_hash = (blo.pre_hash + public_Key) * (a + b);
for(list::iterator itor = Block.begin(); itor != Block.end(); itor++)
{
if ((*itor).this_hash != (*itor).pre_hash + temp * (a + b))
{
flag = false;
break;
}
}
if (flag) { Block.push_back(blo); };
}

这个迭代其实可以不用的,因为我在外部还定义了一个block类型的全局变量Pre_block和blo。Pre_block存储了上一个区块的信息。而本区块的信息则存储在Blo中。只有当用户解出当前区块后,才可以得到新区块。而data参数,为了方便仅存储了当前区块所在的位置。
区块的计算(用类实现)

class Get_Block :Create_Block {
public:
int diffcult;
int number = 1;
Get_Block():Create_Block(“OK”){
}
void calc()
{
double start = clock();
while (true){
for (unsigned long long z = 1; z < ULLONG_MAX; z++){
for (unsigned long long j = 1; j < 65535; j = j + 1) {
for (unsigned long long i = 1; i < 65535; i = i + 1) {
Cryptography *person = new Cryptography(i,j,z);
person->Getpublickey();
block bloc;
bloc.data = circle;
bloc.pre_hash = pre_blo.this_hash;
bloc.this_hash = (blo.pre_hash + person->public_Key) * (i + j);
if (blo.data == bloc.data &&blo.pre_hash== bloc.pre_hash && blo.this_hash == bloc.this_hash)
{
double end = clock();
cout << “历时”<<end-start<<“毫秒获得的第” << number++ <<“个区块信息为:” << endl;
cout << “data:” << bloc.data << endl;
cout << “this_hash:” << bloc.this_hash << endl;
cout << “pre_hash:” << bloc.pre_hash << endl << “=======================” << endl << endl;
this->Append_Block();
start = clock();
}
delete []person;
}
}
}
}
}
};

完整代码:

#include
#include <stdio.h>
#include <windows.h>
#include
#include
#include
#include
#include <time.h>
using namespace std;

struct Moving_Point {
unsigned long long x;
unsigned long long y;
};

int circle = 1;

class Martix {
public:
static const int circle_s = 1; //假定向量环路为1;
static const int KEY =Martix::circle_s * 8;
private:
unsigned long long martix_4_2[Martix::KEY / 2][2]; //存储向量矩阵
unsigned long long martix_8_8[Martix::KEY][Martix::KEY]; //存储由向量矩阵得到的转置矩阵
unsigned long long martix_complete[KEY * 2]; //存储操作完成后的矩阵(一维)

public:
Martix(string a) {};
Martix(int a, int b,int circle)
{
int key = 8;
int cir = circle;
while (cir–)
{
martix_4_2[key / 2 - 4][0] = (-1)*b; martix_4_2[key / 2 - 4][1] = (-1)*a;
martix_4_2[key / 2 - 3][0] = b; martix_4_2[key / 2 - 3][1] = (-1)*a;
martix_4_2[key / 2 - 2][0] = b; martix_4_2[key / 2 - 2][1] = a;
martix_4_2[key / 2 - 1][0] = (-1)*b; martix_4_2[key / 2 - 1][1] = a;
key += 8;
}
}
void Change_New_Martix() {
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
martix_8_8[i][j] = 0;
}
}
for (int j = 2; j < KEY / 2 + 2; j++) {
martix_8_8[0][j] = martix_4_2[j - 2][0] * (-1);
martix_8_8[1][j] = martix_4_2[j - 2][1] * (-1);
}
for (int i = 2; i < KEY / 2 + 2; i++) {
martix_8_8[i][0] = martix_4_2[i - 2][0] * (-1);
martix_8_8[i][1] = martix_4_2[i - 2][1] * (-1);
}
for (int i = 2; i < KEY / 2 + 2; i++)
{
for (int j = 2; j < KEY / 2 + 2; j++)
{
martix_8_8[i][j] = 0;
}
}
}
public:
void Save_Martix()
{
int key = 0;
for (int i = 0; i < KEY / 2 + 2; i++)
{
for (int j = 0; j < KEY / 2 + 2; j++)
{
if (martix_8_8[i][j] != 0)
{
martix_complete[key++] = martix_8_8[i][j];
}
}
}
}
unsigned long long GetPublicKey()
{
unsigned long long public_key = martix_complete[0];
for (int i = 1; i < KEY * 2; i++)
{
if (i % 2 == 0)
{
public_key = public_key + martix_complete[i];
}
else {
public_key = public_key * martix_complete[i];
}
}
return public_key;
}
};
class Cryptography :Martix
{
public:
/作为私钥,发送方保存内容/
unsigned long long a; //椭圆长轴的半轴长度
unsigned long long b; //椭圆短轴的半轴长度
/作为公钥,接收方接受公钥/
unsigned long long public_Key; //通过椭圆矩阵算法得到的公钥G
Moving_Point p; //随机选定的在椭圆上的点

public:
Cryptography(string a) :Martix(“OK”) {};
Cryptography(unsigned long long in_a, unsigned long long in_b,int diffcult) :Martix(in_a, in_b,diffcult)
{
this->a = in_a;
this->b = in_b;
p.x = 0;
p.y = 0;
public_Key = Getpublickey();
}
unsigned long long Getpublickey()
{
Get_Public_Key();
return public_Key;
}
Moving_Point GetPoint()
{
Get_Point();
return p;
}
public:
void PrintPrivateKey() {
cout << “#############私钥:#############” << endl;
cout << “长轴:” << 2this->a << “\t\t”;
cout << “短轴:” << 2this->b << endl;
}
private:
void Get_Point()
{
if (p.x == 0 && p.y == 0)
{
while (!Is_Moving_Point())
{
Get_Moving_Point_P();
}
}
}
void Get_Public_Key()
{
this->Change_New_Martix();
this->Save_Martix();
this->public_Key = this->GetPublicKey();
}
void Get_Moving_Point_P() //得到一个随机的在椭圆上的点的坐标
{
for (int i = 0; i < this->a; i++)
{
for (int j = 0; j < this->b; j++)
{
p.x = i;
p.y = j;
}
}
}
bool Is_Moving_Point() {
if (pow(b, 2)*pow(p.y, 2) + pow(a, 2)*pow(p.x, 2) == pow(a, 2)*pow(b, 2) && p.y <= a && p.x <= b)
return true;
else
return false;
}
};
struct block {
unsigned long long this_hash;
unsigned long long pre_hash;
unsigned long long data;
};

block blo;
block pre_blo = {0,0,0};
class Create_Block:public Cryptography {
public:
list Block;
public:
Create_Block(string a):Cryptography(“OK”) {};
Create_Block(int x = rand()*2, int y = rand(), int diffcult = 1):Cryptography(x,y,diffcult){
}
void Make_First_Block()
{
Getpublickey();
blo.data = circle;
blo.pre_hash = 0;
blo.this_hash = (blo.pre_hash+public_Key) * (a+b);
Block.push_back(blo);
}
void Append_Block()
{
pre_blo = blo;
bool flag = true;
auto temp = public_Key;
circle = circle + 1;
Getpublickey();
blo.data = circle;
blo.pre_hash = blo.this_hash;
blo.this_hash = (blo.pre_hash + public_Key) * (a + b);
for(list::iterator itor = Block.begin(); itor != Block.end(); itor++)
{
if ((*itor).this_hash != (*itor).pre_hash + temp * (a + b))
{
flag = false;
break;
}
}
if (flag) { Block.push_back(blo); };
}
};

class Get_Block :Create_Block {
public:
int diffcult;
int number = 1;
Get_Block():Create_Block(“OK”){
}
void calc()
{
double start = clock();
while (true){
for (unsigned long long z = 1; z < ULLONG_MAX; z++){
for (unsigned long long j = 1; j < 65535; j = j + 1) {
for (unsigned long long i = 1; i < 65535; i = i + 1) {
Cryptography *person = new Cryptography(i,j,z);
person->Getpublickey();
block bloc;
bloc.data = circle;
bloc.pre_hash = pre_blo.this_hash;
bloc.this_hash = (blo.pre_hash + person->public_Key) * (i + j);
if (blo.data == bloc.data &&blo.pre_hash== bloc.pre_hash && blo.this_hash == bloc.this_hash)
{
double end = clock();
cout << “历时”<<end-start<<“毫秒获得的第” << number++ <<“个区块信息为:” << endl;
cout << “data:” << bloc.data << endl;
cout << “this_hash:” << bloc.this_hash << endl;
cout << “pre_hash:” << bloc.pre_hash << endl << “=======================” << endl << endl;
this->Append_Block();
start = clock();
}
delete []person;
}
}
}
}
}
};

int main()
{
Create_Block * one = new Create_Block();
one->Make_First_Block();
Get_Block* two = new Get_Block();
two->calc();
return 0;
}

不得不说第一个区块的挖掘永远是最快的。第二个区块确实要等好久才可以得出。以上即为C/C++实现区块链的全部源码。仅用于学习交流,不得用于商业用途,转载必究。

作者:程序小黑
来源:CSDN
原文:https://blog.csdn.net/qq_27180763/article/details/82588305
版权声明:本文为博主原创文章,转载请附上博文链接!

到此这篇关于C++实现区块链的源码的文章就介绍到这了,更多相关c++区块链内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++实现比特币系统的源码

    这是我最近写的一个近乎于完整的模拟比特币的代码,实际上还不够完整,不过已经能实现打包交易进入区块,然后挖矿了.这个程序是只有一个节点在挖矿,所以暂时也不涉及分布式系统的东西,还算比较简单容易理解.这个程序就是整个网络中一个节点的视角.分享出来希望对大家有所帮助. 部署过程就是把代码统统贴过去,要注意的就是代码中有两个文件的路径,要手动改一下,代码中有两个文件的路径,要手动改一下,代码中有两个文件的路径,要手动改一下,重要的事情说三遍,然后就可以运行,观察比特币挖矿过程啦!有问题欢迎提问. Blo

  • python程序实现BTC(比特币)挖矿的完整代码

    区块链的作业是比特币挖矿程序python实现,我做完了跟大家分享一波. 完整代码如下: #Author:Mr.Pan_学狂 #Finish_time:2020/11/22/22:34 import hashlib import time def find_gold():#参数D是难度系数 x = 0#算力初始值 Diffcult_number = str(input('请输入难度系数:')) print('开始挖矿!!') while True: x += 1 string = 'hello'

  • Go语言开发区块链只需180行代码(推荐)

    区块链开发用什么语言?通过本文你将使用Go语言开发自己的区块链(或者说用go语言搭建区块链).理解哈希函数是如何保持区块链的完整性.掌握如何用Go语言编程创造并添加新的块.实现多个节点通过竞争生成块.通过浏览器来查看整个链.了解所有其他关于区块链的基础知识. 但是,文章中将不会涉及工作量证明算法(PoW)以及权益证明算法(PoS)这类的共识算法,同时为了让你更清楚得查看区块链以及块的添加,我们将网络交互的过程简化了,关于 P2P 网络比如"全网广播"这个过程等内容将在后续文章中补上.

  • 使用go实现简易比特币区块链公链功能

    使用go语言实现具备以下功能的简易区块链 区块与区块链 共识机制 数据库 Cli命令行操作 交易管理 密码学 数字签名 交易缓存池 P2P网络管理 由于平时还要进行论文工作,项目不定时更新 2021.1.1实现了区块结构.区块链结构.工作量证明pow,剩下部分陆续更新 1.实现区块结构 package BLC import ( "bytes" "crypto/sha256" "time" ) //实现一个最基本的区块结构 type Block s

  • 比特币上的数独游戏合约的实现代码

    我们在 Bitcoin SV 上实现了一个数独游戏智能合约,利用之前介绍过的一种合约范式可以将游戏中寻找解题方案的过程外包上链.因为求解数独问题的计算工作量会随着其行列数快速增长,实际上它也是一个 NP-完全 问题.不过我们可以借由比特币智能合约巧妙地寻求答案,只需要验证答案提供者所给出的解答是否满足要求即可,这样即可以将复杂的求解计算过程实现链下外包. sCrypt 合约代码如下: import "util.scrypt"; import "array.scrypt&quo

  • 普通人如何在区块链行业赚钱

    区块链的世界里,没有新鲜事. 技术是技术,通证(token,以前被翻译为"代币")是通证.通证是区块链网络的必然产物.代表着背后的技术应用,落地方向,潜在价值.也被称为"数字资产". 如何在区块链行业赚钱?我认真分析整理了一下币圈链圈的信息,总结如下: 1:通过挖矿等方式获得更多数量的数字资产.可以是"挖矿",也可以是"私募"兑换,也可以是"ic-o".形式大致就这么几种,目的是为了让你手里的数字资产的数量

  • Python实现类似比特币的加密货币区块链的创建与交易实例

    虽然有些人认为区块链是一个早晚会出现问题的解决方案,但是毫无疑问,这个创新技术是一个计算机技术上的奇迹.那么,究竟什么是区块链呢? 区块链 以比特币(Bitcoin)或其它加密货币按时间顺序公开地记录交易的数字账本. 更通俗的说,它是一个公开的数据库,新的数据存储在被称之为区块(block)的容器中,并被添加到一个不可变的链(chain)中(因此被称为区块链(blockchain)),之前添加的数据也在该链中.对于比特币或其它加密货币来说,这些数据就是一组组交易,不过,也可以是其它任何类型的数据

  • JavaScript实现区块链

    几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术.在这篇文中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的.我将会称之为SavjeeCoin! 全文分为三个部分: part1:实现一个基本的区块链 part2:实现POW part3:交易与挖矿奖励 Part1:实现一个基本的区块链 区块链 区块链是由一个个任何人都可以访问的区块构成的公共数据库.这好像没什么特别的,不过它们有一个有趣的属性:它们是不可变的.一旦一个区

  • C++实现区块链的源码

    看了上面的算法,相信大家基本可以猜到,相对于比特币的限量的性质,对于本算法来说,难解程度的根本原因即为向量环路的迭代次数.迭代次数越多,则算法越难解,从而导致解题需要花费更多的时候,再基于这点,在数学上,当解题次数足够大时,效率会无限小,从而导致了解题时间无限长最后导致加密货币的发放无限小. 创世区块创建(部分大妈在前面有实现,而区块这一部分将会详细解答) void Make_First_Block() { Getpublickey(); blo.data = circle; blo.pre_h

  • 200行代码轻松实现一个简单的区块链

    英文原文:Lauri Hartikka 区块链的基础概念很简单:一个分布式数据库,存储一个不断加长的 list,list 中包含着许多有序的记录.然而,在通常情况下,当我们谈到区块链的时候也会谈起使用区块链来解决的问题,这两者很容易混淆.像流行的比特币和以太坊这样基于区块链的项目就是这样."区块链"这个术语通常和像交易.智能合约.加密货币这样的概念紧紧联系在一起. 这就令理解区块链变得不必要得复杂起来,特别是当你想理解源码的时候.下面我将通过 200 行 JS 实现的超级简单的区块链来

  • 如何用120行Java代码写一个自己的区块链

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区块链的原理! "用不到120行 Java 代码就能实现一个自己的区块链!" 听起来不可思议吧?有什么能比开发一个自己的区块链更好的学习实践方法呢?那我们就一起来实践下! 因为我们是一家从事互联网金融的科技公司,所以我们采用虚拟资产金额作为这篇文章中的示例数据.大家可以先为自己想一个数字,后

  • go语言区块链实战实现简单的区块与区块链

    目录 区块链实战 Version 1 区块相关: 区块链相关 区块链实战 字节 字段 说明 4 版本 区块版本号,表示本区块遵守的验证规则 32 父区块头哈希值 前一区块的Merkle树根的哈希值,同样采取SHA256计算 32 Merkle根 该区块中交易的Merkle树根的哈希值,同样采用SHA256计算 4 时间戳 该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11各区块的时间的中值,同时全节点也会拒接那些超过自己两个小时的时间戳的区块 4 难度目标 该区块工作量证明算法的

  • java开源区块链jdchain入门

    目录 前言 部署组件 傻瓜式部署 获取部署包 效果预览 部署遇到的问题: 网关里的异常 结语 前言 jdchain是京东数科开源的区块链平台,目标是实现一个面向企业应用场景的通用区块链框架系统,能够作为企业级基础设施,为业务创新提供高效.灵活和安全的解决方案. 之所以选择jdchain研究是因为jdchain是为数不多的底层也是采用java实现的一个区块链平台 项目地址:https://github.com/blockchain... 文档地址:https://gitee.com/jdchain

  • python区块链简易版交易实现示例

    目录 说明 引言 比特币交易 交易输出 发送币 余额查看 总结 说明 本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,但根据个人的理解进行了一些修改,大量引用了原文的内容.文章末尾有"本节完整源码实现地址". 引言 交易(transaction)是比特币的核心所在,而区块链唯一的目的,也正是为了能够安全可靠地存储交易.在区块链中,交易一旦被创建,就没有任何人能够再去修改或是删除它.今天,我们将会开始

  • python区块链基本原型简版实现示例

    目录 说明 引言 区块 区块头 区块链 总结 说明 本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,但根据个人的理解进行了一些修改,大量引用了原文的内容.文章末尾有"本节完整源码实现地址". 引言 区块链是 21 世纪最具革命性的技术之一,它仍然处于不断成长的阶段,而且还有很多潜力尚未显现. 本质上,区块链只是一个分布式数据库而已. 不过,使它独一无二的是,区块链是一个公开的数据库,而不是一个私人数

  • python区块链简易版交易完善挖矿奖励示例

    目录 说明 引言 奖励 UTXO 集 Merkle 树 P2PKH 总结 说明 本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,但根据个人的理解进行了一些修改,大量引用了原文的内容.文章末尾有"本节完整源码实现地址". 引言 在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库.不过在之前的文章中,我们选择性地跳过了“分布式”这个部分,而是将注意力都放到了“数据库”部分.到目前为止,我们几

  • python区块链持久化和命令行接口实现简版

    目录 说明 引言 选择数据库 couchdb couchdb的安装 数据库结构 序列化 持久化 区块链迭代器 CLI 测试一下 说明 本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,但根据个人的理解进行了一些修改,大量引用了原文的内容.文章末尾有"本节完整源码实现地址". 引言 到目前为止,我们已经构建了一个有工作量证明机制的区块链.有了工作量证明,挖矿也就有了着落.虽然目前距离一个有着完整功能的区

  • python区块链实现简版工作量证明

    目录 说明 回顾 工作量证明 哈希计算 Hashcash 实现 说明 本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,但根据个人的理解进行了一些修改,大量引用了原文的内容.文章末尾有"本节完整源码实现地址". 回顾 在上一节,我们构造了一个非常简单的数据结构 – 区块,它也是整个区块链数据库的核心.目前所完成的区块链原型,已经可以通过链式关系把区块相互关联起来:每个块都与前一个块相关联. 但是,当前

随机推荐