C++實現(xiàn)區(qū)塊鏈的源碼
看了上面的算法,相信大家基本可以猜到,相對于比特幣的限量的性質(zhì),對于本算法來說,難解程度的根本原因即為向量環(huán)路的迭代次數(shù)。迭代次數(shù)越多,則算法越難解,從而導(dǎo)致解題需要花費更多的時候,再基于這點,在數(shù)學(xué)上,當解題次數(shù)足夠大時,效率會無限小,從而導(dǎo)致了解題時間無限長最后導(dǎo)致加密貨幣的發(fā)放無限小。
創(chuàng)世區(qū)塊創(chuàng)建(部分大媽在前面有實現(xiàn),而區(qū)塊這一部分將會詳細解答)
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); }
由于在區(qū)塊鏈中,本區(qū)快的數(shù)字簽名是基于上一區(qū)塊的數(shù)字簽名和區(qū)塊本身的DATA決定, 所以,在這里我們采用了上一區(qū)塊的數(shù)字簽名加上難解的PublicKey乘上長軸和短軸的和實現(xiàn)本區(qū)塊的數(shù)字簽名的算法。
添加區(qū)塊(當當前區(qū)塊被算出時,添加新區(qū)塊,檢查簽名正確性。)
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存儲了上一個區(qū)塊的信息。而本區(qū)塊的信息則存儲在Blo中。只有當用戶解出當前區(qū)塊后,才可以得到新區(qū)塊。而data參數(shù),為了方便僅存儲了當前區(qū)塊所在的位置。
區(qū)塊的計算(用類實現(xiàn))
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++ <<“個區(qū)塊信息為:” << 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; //假定向量環(huán)路為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]; //存儲由向量矩陣得到的轉(zhuǎn)置矩陣 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: /作為私鑰,發(fā)送方保存內(nèi)容/ 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++ <<“個區(qū)塊信息為:” << 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; }
不得不說第一個區(qū)塊的挖掘永遠是最快的。第二個區(qū)塊確實要等好久才可以得出。以上即為C/C++實現(xiàn)區(qū)塊鏈的全部源碼。僅用于學(xué)習交流,不得用于商業(yè)用途,轉(zhuǎn)載必究。
作者:程序小黑
來源:CSDN
原文:https://blog.csdn.net/qq_27180763/article/details/82588305
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
到此這篇關(guān)于C++實現(xiàn)區(qū)塊鏈的源碼的文章就介紹到這了,更多相關(guān)c++區(qū)塊鏈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實戰(zhàn)開發(fā)為單片機的按鍵加一個鎖防止多次觸發(fā)的細節(jié)
今天小編就為大家分享一篇關(guān)于實戰(zhàn)開發(fā)為單片機的按鍵加一個鎖防止多次觸發(fā)的細節(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12C語言實現(xiàn)將彩色bmp圖像轉(zhuǎn)化為灰圖、灰度圖像反色
這篇文章主要為大家詳細介紹了C語言實現(xiàn)將彩色bmp圖像轉(zhuǎn)化為灰圖、灰度圖像反色,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10C++中priority_queue模擬實現(xiàn)的代碼示例
在c++語言中數(shù)據(jù)結(jié)構(gòu)中的堆結(jié)構(gòu)可以通過STL庫中的priority_queue 優(yōu)先隊列來實現(xiàn),這樣做極大地簡化了我們的工作量,這篇文章主要給大家介紹了關(guān)于C++中priority_queue模擬實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2021-08-08C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和
這篇文章主要介紹了C語言如何求整數(shù)的位數(shù)及各位數(shù)字之和,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11Qt中正則表達式的常見用法(QRegularExpression類)
正則表達式即一個文本匹配字符串的一種模式,Qt中使用QRegExp類進行模式匹配,下面這篇文章主要給大家介紹了關(guān)于Qt中正則表達式的常見用法,文中介紹的是QRegularExpression類的相關(guān)資料,需要的朋友可以參考下2024-05-05C++編程中__if_exists與__if_not_exists語句的用法
這篇文章主要介紹了C++編程中__if_exists與__if_not_exists語句的用法,是C++中用于判斷指定的標識符是否存在的基礎(chǔ)的條件判斷語句,需要的朋友可以參考下2016-01-01