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 class Block { 2 public: 3 string _hash; //當前區塊的哈希 4 string _data; //區塊描述字符 5 string _prevHash; //記錄上個塊的哈希值 6 Block(const string& prevHash, conststring& 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 來存儲區塊的指針.
與go語言不同的是 所有的內存分配,我們需要自行在退出前歸還內存。所以在析構函數中依次遍歷容器內的指針並且進行刪除內存。結構體如下
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創世區塊。 這個區塊與其他區塊的區別在於該區塊沒有上一個區塊信息,它是第一個區塊。
to be continue......
參考博文:
https://blog.csdn.net/simple_the_best/article/details/78073844
https://jeiwan.cc/posts/building-blockchain-in-go-part-1/
cpp 區塊鏈模擬示例(三)新基本原形工程的建立