一歩一歩シロにC++を使ってブロックチェーンを構築するように教える
#include
#include
上面语句的意思是告诉编译器包含cstdint和iostream库。在它下面添加这一行:
using namespace std;
上面语句是为std命名空间创建了一个快捷方式。其作用是不需要通过其使用全名引用std命名空间中的声明,例如,如果有上面语句则书写string就可以使用字符串,否则需要使用全名访问字符串,如std::string。
到现在为止感觉还挺好; 让我们进一步完善充实。
区块链由一系列包含数据的区块组成,每个区块都包含前一区块的加密HASH,这就表示很难改变某一个区块的内容,而后面的区块内容也同样发生改变(译者注:如果改变中间某个区块的内容,则这个区块之后的所有区块的内容都需要被改变才有效); 因此区块链被赋予了不变的特性。
区块头结构
接下来我们创建我们的块类,将以下几行添加到Block.h头文件中:
class Block {
public:
string sPrevHash;
Block(uint32_t nIndexIn, const string &sDataIn);
string GetHash();
void MineBlock(uint32_t nDifficulty);
private:
uint32_t _nIndex;
int64_t _nNonce;
string _sData;
string _sHash;
time_t _tTime;
string _CalculateHash() const;
};
, 1 Block 2 public 3 sPrevHash, 5 , nIndexIn sDataInconst & , , , 7 GetHash() , HASH 9 MineBlock() , , nDifficulty 11 private, , 12-16
- _nIndex , , 0 ,
- _nNonce ,
- _sData
- _sHash HASH
- _tTime
18 _CalculateHash(), HASH 。 const , , 。
Blockchain.h 。 ( CLion #define TESTCHAIN_BLOCKCHAIN_H #endif )
#include
#include
#include "Block.h"
using namespace std;
cstdint vector , Block.h , std namespace 。
, Blockchain.h :
class Blockchain {
public:
Blockchain();
void AddBlock(Block bNew);
private:
uint32_t _nDifficulty;
vector<Block> _vChain;
Block _GetLastBlock() const;
};
1 2 public 3 5 AddBlock() , Block bNew 7 private , 8-9
- _nDifficulty
- _vChain 11 _GetLastBlock() , const ,
, 。 SHA256 ,( SHA256 , ), , Zedwood C++ sha256 , sha256.h,sha256.cpp LICENSE.txt , 。( : centos )
,
Block.cpp , Block.h sha256.h 。
#include "Block.h"
#include "sha256.h"
:
Block::Block(uint32_t nIndexIn, const string &sDataIn) : _nIndex(nIndexIn), _sData(sDataIn) {
_nNonce = -1;
_tTime = time(nullptr);
}
1 _nIndex _sData 。 2 _nNonce -1。 3 _tTime 。
HASH :
string Block::GetHash() {
return _sHash;
}
2 _sHash
, , ; , , 。 ( P2P, ); “ ”, , 。
, HASH 。 HASH HASH ; , , ; 。 (Proof of Work,PoW)。
-
, MineBlock
void Block::MineBlock(uint32_t nDifficulty) {
char cstr[nDifficulty + 1];
for (uint32_t i = 0; i < nDifficulty; ++i) {
cstr[i] = '0';
}
cstr[nDifficulty] = '\0';
string str(cstr);
do {
_nNonce++;
_sHash = _CalculateHash();
} while (_sHash.substr(0, nDifficulty) != str);
cout << "Block mined: " << _sHash << endl;
}
1 MineBlock block.h , nDifficulty 2 nDifficulty 3-6 0 , \0 8 string 10-13 , HASH _sHash 。 HASH , , HASH 15 , HASH , 。
HASH
, _CalculateHash :
inline string Block::_CalculateHash() const {
stringstream ss;
ss << _nIndex << _tTime << _sData << _nNonce << sPrevHash;
return sha256(ss.str());
}
1 Block.h ,inline , , ( :inline )
2 ss。
3 _nIndex,_tTime,_sData,_nNonce sPrevHash ss 。
5 ss sha256Blockchain.cpp 。
Blockchain.h 。
#include "Blockchain.h"
,
Blockchain::Blockchain() {
_vChain.emplace_back(Block(0, "Genesis Block"));
_nDifficulty = 3;
}
1 , “ ”。
, HASH , , “ ”。
2 _vChain 。
emplace_back() , _vChain , , 。
3 POW ( HASH )
,
void Blockchain::AddBlock(Block bNew) {
bNew.sPrevHash = _GetLastBlock().GetHash();
bNew.MineBlock(_nDifficulty);
_vChain.push_back(bNew);
}
1 Blockchain.h , 2 hash (_vChain HASH ) sPrevHash 3 , _nDifficulty 4 _vChain
Block Blockchain::_GetLastBlock() const {
return _vChain.back();
}
1 Blockchain.h
2 _vChain
main.cpp( )
#include "Blockchain.h"
int main() {
Blockchain bChain = Blockchain();
cout << "Mining block 1..." << endl;
bChain.AddBlock(Block(1, "Block 1 Data"));
cout << "Mining block 2..." << endl;
bChain.AddBlock(Block(2, "Block 2 Data"));
cout << "Mining block 3..." << endl;
bChain.AddBlock(Block(3, "Block 3 Data"));
return 0;
}
《 C++ 》
:davenash
:http://davenash.com/2017/10/build-a-blockchain-with-c/
: 。 , B 。 ,