一歩一歩シロにC++を使ってブロックチェーンを構築するように教える


最近、ブロックチェーンに関するニュースをたくさん聞いたことがあるかもしれませんが、みんなが何を話しているのか知りたいです.ブロックチェーンは分類帳簿であり、その実現原理はそれに含まれるデータを変えることが難しい.ブロックチェーンは変えられないと言われていますが、その目的は正しいことを維持することであり、不変性は永久性を意味します.しかし、ハードディスク(HDD)には永久的に変わらないと思われるものはありません.私たちはこれらの哲学的な議論を非技術者に残した.私が今しなければならないのは、C++を使用してブロックチェーンを作成する方法を示すことです.
  • ブロック構造
  • ブロックヘッダ構造
  • 掘削プロセス-作業量証明
  • ブロックHASH計算
  • 創世ブロックの発生
  • 追加ブロック
  • 主関数
  • ソースコードダウンロード
  • 免責声明
  • このチュートリアルはSavjeeを参照してNodeJSを使用して文章を作成します.
  • はしばらくC++コードを記述していないので、コードが少し疎かになる可能性があります.(注:このC++プログラムを実行すると、ブロックを生成してブロックチェーンを構成し、ワークロード証明POW機能も備える)
  • まず、JetBrainsのCLionを使用している新しいC++プロジェクトを開きますが、どのC++IDEでもテキストエディタでも可能です(翻訳者注:翻訳者はVIMを使用しています).TestChainプロジェクトを作成し、次のプロジェクトの作成に進みます.CLionを使用するとmainが表示されます.cppファイルが作成され、開きました.このメイン関数ファイルはしばらく使用しません.メインプロジェクトフォルダにBlockという名前を作成します.hのファイルは、プロジェクトツールウィンドウのTestChainディレクトリを右クリックし、「New>C/C++Header File」を選択して新規作成できます.ファイル内で、次のコードを追加します(CLionを使用してすべてのコードを#define TESTCHAIN_BLOCK_Hと#endifの行の間に配置する場合).
     
      
    1. #include
    2. #include

    上面语句的意思是告诉编译器包含cstdint和iostream库。在它下面添加这一行:

     
      
    1. using namespace std;

    上面语句是为std命名空间创建了一个快捷方式。其作用是不需要通过其使用全名引用std命名空间中的声明,例如,如果有上面语句则书写string就可以使用字符串,否则需要使用全名访问字符串,如std::string。

    到现在为止感觉还挺好; 让我们进一步完善充实。

    区块链由一系列包含数据的区块组成,每个区块都包含前一区块的加密HASH,这就表示很难改变某一个区块的内容,而后面的区块内容也同样发生改变(译者注:如果改变中间某个区块的内容,则这个区块之后的所有区块的内容都需要被改变才有效); 因此区块链被赋予了不变的特性。

    区块头结构

    接下来我们创建我们的块类,将以下几行添加到Block.h头文件中:

     
      
    1. class Block {
    2. public:
    3. string sPrevHash;
    4. Block(uint32_t nIndexIn, const string &sDataIn);
    5. string GetHash();
    6. void MineBlock(uint32_t nDifficulty);
    7. private:
    8. uint32_t _nIndex;
    9. int64_t _nNonce;
    10. string _sData;
    11. string _sHash;
    12. time_t _tTime;
    13. string _CalculateHash() const;
    14. };

    , 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 )

     
      
    1. #include
    2. #include
    3. #include "Block.h"
    4. using namespace std;

    cstdint vector , Block.h , std namespace 。

    , Blockchain.h :

     
      
    1. class Blockchain {
    2. public:
    3. Blockchain();
    4. void AddBlock(Block bNew);
    5. private:
    6. uint32_t _nDifficulty;
    7. vector<Block> _vChain;
    8. Block _GetLastBlock() const;
    9. };

    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 。

     
      
    1. #include "Block.h"
    2. #include "sha256.h"

     
      
    1. Block::Block(uint32_t nIndexIn, const string &sDataIn) : _nIndex(nIndexIn), _sData(sDataIn) {
    2. _nNonce = -1;
    3. _tTime = time(nullptr);
    4. }

    1 _nIndex _sData 。 2 _nNonce -1。 3 _tTime 。

    HASH :

     
      
    1. string Block::GetHash() {
    2. return _sHash;
    3. }

    2 _sHash

    , , ; , , 。 ( P2P, ); “ ”, , 。

    , HASH 。 HASH HASH ; , , ; 。 (Proof of Work,PoW)。

    -

    , MineBlock

     
      
    1. void Block::MineBlock(uint32_t nDifficulty) {
    2. char cstr[nDifficulty + 1];
    3. for (uint32_t i = 0; i < nDifficulty; ++i) {
    4. cstr[i] = '0';
    5. }
    6. cstr[nDifficulty] = '\0';
    7. string str(cstr);
    8. do {
    9. _nNonce++;
    10. _sHash = _CalculateHash();
    11. } while (_sHash.substr(0, nDifficulty) != str);
    12. cout << "Block mined: " << _sHash << endl;
    13. }

    1 MineBlock block.h , nDifficulty 2 nDifficulty 3-6 0 , \0 8 string 10-13 , HASH _sHash 。 HASH , , HASH 15 , HASH , 。

    HASH

    , _CalculateHash :

     
      
    1. inline string Block::_CalculateHash() const {
    2. stringstream ss;
    3. ss << _nIndex << _tTime << _sData << _nNonce << sPrevHash;
    4. return sha256(ss.str());
    5. }

    1 Block.h ,inline , , ( :inline )
    2 ss。
    3 _nIndex,_tTime,_sData,_nNonce sPrevHash ss 。
    5 ss sha256

    Blockchain.cpp 。

    Blockchain.h 。

     
      
    1. #include "Blockchain.h"

     
      
    1. Blockchain::Blockchain() {
    2. _vChain.emplace_back(Block(0, "Genesis Block"));
    3. _nDifficulty = 3;
    4. }

    1 , “ ”。
    , HASH , , “ ”。
    2 _vChain 。
    emplace_back() , _vChain , , 。
    3 POW ( HASH )

     
      
    1. void Blockchain::AddBlock(Block bNew) {
    2. bNew.sPrevHash = _GetLastBlock().GetHash();
    3. bNew.MineBlock(_nDifficulty);
    4. _vChain.push_back(bNew);
    5. }

    1 Blockchain.h , 2 hash (_vChain HASH ) sPrevHash 3 , _nDifficulty 4 _vChain

     
      
    1. Block Blockchain::_GetLastBlock() const {
    2. return _vChain.back();
    3. }

    1 Blockchain.h
    2 _vChain

    main.cpp( )

     
      
    1. #include "Blockchain.h"
    2. int main() {
    3. Blockchain bChain = Blockchain();
    4. cout << "Mining block 1..." << endl;
    5. bChain.AddBlock(Block(1, "Block 1 Data"));
    6. cout << "Mining block 2..." << endl;
    7. bChain.AddBlock(Block(2, "Block 2 Data"));
    8. cout << "Mining block 3..." << endl;
    9. bChain.AddBlock(Block(3, "Block 3 Data"));
    10. return 0;
    11. }




    《 C++ 》

    :davenash
    :http://davenash.com/2017/10/build-a-blockchain-with-c/
    : 。 , B 。 ,