使用 C++ 建立區塊鏈應用程式的貼文首先出現在 Coinpedia 金融科技新聞上

介紹

區塊鏈技術透過提供去中心化、透明和安全的機制來消除對中介機構的需求,從根本上改變了金融和供應鏈管理。

為什麼要建立區塊鏈應用程式?

區塊鏈應用程式提供增強的資料完整性和安全性,並為共享資訊提供無需信任的環境。透過區塊鏈,人們可以實現智慧合約,並創建數位代幣,從而打開去中心化金融(DeFi)和代幣化資產等新經濟模式的大門 

本文用 10 分鐘快速介紹了透過 C++ 進行區塊鏈開發的世界。 

區塊鏈基礎知識

區塊鏈是由單一安全且防篡改的單元(稱為「區塊」)組成的數位鏈。每個區塊包含其元資料和交易的指定資訊。到目前為止,我們剛剛創建了單獨的區塊,對嗎?您將如何嘗試以有意義的方式在每個區塊之間建立連接?答案是藉助稱為哈希的獨特隨機加密函數將每個區塊連結到其前一個區塊。每個區塊都有自己的雜湊值,即主鍵,您可以透過雜湊值按時間順序將所有區塊連結起來,形成一條鏈,代表網路內交易的整個歷史記錄。

區塊鏈中的 C++

由於其速度、靈活性和控制力,C++ 是區塊鏈中使用的最強大的語言之一。它在處理複雜系統、遊戲開發和金融應用程式時能產生奇蹟。毫無疑問,它是最通用的語言!

C++ 在區塊鏈中大放異彩有多種原因。由於其低階記憶體管理提供精確控制,它允許開發人員建立高效的區塊鏈系統。想像一下它的核心有多複雜,因為它需要處理無數的交易。因此,為了完成這項艱鉅的任務,我們選擇了 C++。有一些使用 C++ 開發的重要應用程序,例如比特幣、Lifecoin、Ripple、Monero 和 EOS。

為什麼C++是區塊鏈開發的理想語言?

  • 計算速度更快

  • 高效能

  • 高效率的記憶體管理

  • 面向對象的特點

  • 支援多執行緒

  • 控制系統資源 

無論您是區塊鏈新手還是想要突破可能的極限,C++ 都是建立持久應用程式的可靠選擇。

使用 C++ 理解區塊鏈概念

交易:在區塊鏈中,交易是本質,驅動整個系統。各個區塊就像安全金庫,保存著與參與者一起的著名的交換資訊和交易價值。這些交易是講述誰、與誰、何時交換什麼內容的基本紀錄。

您應該了解的區塊鏈支柱

去中心化:去中心化是區塊鏈在整個技術領域中脫穎而出的原因。什麼是去中心化?它是區塊鏈的屬性,沒有任何一個實體可以控制整個資料庫。這使得系統對故障具有穩健性並抑制任何類型的偏差。  每個參與者設備(節點)都維護區塊鏈的副本,確保透明度並防止集中故障或操縱。

不變性:一旦將任何資料寫入區塊鏈,您就無法在不更改後續區塊的情況下更改它。這是在加密哈希的幫助下完成的。因此,一旦完成的所有更改都無法撤消,使其成為不可變的。

共識機制:一組管理區塊鏈所有必需品的協議。網路中的所有節點需要就這些方法達成一致。共識機制用於簡化節點並確保網路中的所有節點都在同一頁上。

到現在為止,你一定已經了解了區塊鏈的所有基礎知識吧?理論已經夠多了!現在讓我們深入實踐部分。準備好動手了嗎?

在本節中,我們將引導您完成一個簡單的區塊鏈應用程式開發的整個過程。從設定環境到測試和部署。

1.搭建C++開發環境

在開始開發之前,具備所有先決條件至關重要。在本章中,我們將了解如何擁有合適的開發環境。

安裝C++編譯器

讓我們先了解什麼是編譯器。

 編譯器是軟體開發中的重要工具,可作為您編寫的人類可讀程式碼與電腦處理器可以理解和執行的機器碼之間的橋樑。在使用 C++ 開發區塊鏈應用程式時,第一步是為自己配備可靠的 C++ 編譯器。該工具會將您的 C++ 程式碼轉換為可執行的機器碼,使您的區塊鏈應用程式能夠在各種系統上高效運行。

因此,要開始開發,請先安裝與您的系統相容的 C++ 編譯器。以下是您可以選擇的流行 C++ 編譯器:

GCC(GNU編譯器集合):

Linux/MacOS:

打開終端機並分別輸入下面給出的命令

a)Ubuntu/Debian:sudo apt updatesudo apt install build-essentialb)Fedora sudo dnf install gcc gcc-c++c)MacOS(命令列工具)xcode-select –install

 Windows:對於 Windows 使用者來說,MinGW-w64 專案是一個很好的選擇,因為它提供了 GCC(GNU 編譯器集合)的 Windows 端口,在 Windows 環境中提供了 GCC 的強大功能。

安裝步驟:

  • 請造訪 MinGW-w64 官方網站下載安裝程式。

  • 下載後運行安裝程序

  • 根據您的需求選擇合適的架構

  • 依照嚮導步驟完成

  • 更新系統(這是可選步驟,但建議)。

  鐺:

Linux/MacOS:sudo apt install clang(MacOS 中也已安裝 clang)Fedora:sudo dnf install clangWindows:可以使用 MinGW 或透過 LLVM 專案安裝程式安裝 Clang

MSVC(微軟視覺C++): 

MSVC (Microsoft Visual C++) 是 Visual Studio 的一個組成部分,Visual Studio 是 Microsoft 開發的強大的整合開發環境 (IDE)。 Visual Studio 提供了一整套用於開發、測試和部署應用程式的工具,安裝它後會自動在您的系統上設定 MSVC。

在終端機或命令提示字元中使用以下命令驗證安裝:

g++ –version # 對於 GCCclang –version # 對於 Clangcl # 對於 MSVC

選擇 IDE

整合開發環境 (IDE) 透過在統一介面中提供程式碼完成、偵錯和專案管理等工具來提高生產力。以下是一些廣泛使用的 C++ 開發 IDE:

Visual Studio:從官方網站下載Visual Studio。

並依照下表所述執行以下步驟:

CLion:安裝與設定:

CLion 是一種流行的 IDE,由 JetBrains 提供支持,但需要訂閱,但提供免費試用。

提供免費試用。

Visual Studio Code:安裝並設定 C++ 開發的擴充功能。

安裝所需的庫

使用套件管理器安裝必要的庫,例如用於加密功能的 OpenSSL。以下是不同作業系統及其命令的步驟和各種函式庫。

是的,您已經成功設定了開發環境,您可以直接開始在您選擇的 IDE 中執行程式碼。

2.用C++建構一個簡單的區塊鏈

在開始編寫程式碼之前,讓我們先了解塊類別的元件。

Blockclass 的組成部分

  • 索引是一個整數,它按時間順序儲存和維護區塊的排序順序。

  • 時間戳:時間戳以字串形式儲存區塊建立的實例。 

  • 交易:交易儲存參與者之間的交換資訊以及當時區塊鏈的狀態。

  • 前哈希和哈希:前哈希存儲前一個區塊的密碼哈希,而哈希是一串混亂或哈希的密碼資訊。

  • Nonce:工作量證明 (PoW) 共識演算法中使用的整數。隨機數對於 PoW 中的挖礦過程至關重要,礦工們競相尋找一個隨機數來產生具有特定數量的前導零的哈希值。

現在讓我們用程式碼實現所有功能:

類別區塊 {public:    int index;    std::字串時間戳記;    std::vector<Transaction> 交易;    std::string previousHash;    std::字串哈希;    整數隨機數; // 對於 PoW    // 建構子    Block(int idx, std::string time, std::vector<Transaction> txs, std::string prevHash) {              時間戳=時間;        交易 = 交易;        前一個哈希 = 前一個哈希;        隨機數=0;        哈希 = 計算哈希(); // 目前區塊的哈希值    }    // 計算區塊哈希值的方法    std::stringcalculateHash() {        std::stringstreamss;        ss <<索引<<時間戳<< previousHash <<隨機數;        // 將交易資料和任何其他詳細資料加入哈希計算        return sha256(ss.str()); // 實際雜湊函數的佔位符    }    // 挖掘區塊的方法    void mineBlock(intdifficulty) {        std::string target(difficulty, ‘0’); // 建立目標雜湊字串         while (hash.substr(0,difficulty) != target) {            nonce++++;            哈希 = 計算哈希();         }     }};

完成定義區塊類別及其屬性後,您可以進一步建立創世區塊。創世區塊是區塊鏈中第一個需要初始化的區塊,其索引為零。定義創世區塊後,您可以進一步使用 addblock() 方法將新區塊新增到您的區塊鏈中。 

區塊鏈類別 {public:    std::vector<Block> 鏈;    Blockchain() {        chain.push_back(createGenesisBlock());    }    Block createGenesisBlock() {        return Block(0, “01/01/2024”, “創世區塊》, “0”);    }    區塊 getLatestBlock() {        return chain.back();    }    void addBlock(Block newBlock) {        newBlock.previousHash = getLatestBlock().hash;        newBlock.hash = newBlock.calculateHash();        chain.push_back(newBlock);     }};

建立並驗證交易。每筆交易都有自己的 ID、預先定義的建構子、傳送者和接收者資訊以及金額。建立交易後,您需要使用 validateTransaction() 方法對其進行驗證。

類別交易 {public:    std::string sender;    std::字串接收者;    雙倍金額;    std::string 交易ID;    // 建構子    交易(std::string snd, std::string rcp, double amt, std::string txID) {        sender = snd;        收件人= rcp;        金額 = 金額;        交易ID = 交易ID;    }    // 驗證交易的方法    bool validateTransaction() {        // 邏輯的實作        return true; // 佔位符     }};

3.在C++中實現共識機制

 到目前為止,您已經完成了 25% 的建造過程。現在,您繼續前進並為您的區塊實施共識機制,這是整個應用程式的支柱。

工作量證明

工作量證明 (PoW) 是一種共識機制,區塊鏈網路成員/礦工必須找到解決困難的計算數學問題的方法,然後才能將新區塊添加到鏈中。 ,稱為隨機數,它與區塊的資料、雜湊值和其他詳細資料相結合,產生以一定數量的前導零開頭的雜湊值。這使得該過程變得高效並保護網路免受惡意攻擊。

在 C++ 中,您可以透過在 Block 類別中新增證明屬性和工作證明方法來實現工作量證明。操作方法如下:

#include <iostream>#include <sstream>#include <ctime>#include <string>#include <vector>#include <openssl/sha.h>using namespace std;string sha256(const string str) {   SHA256_DIGEST_LENGTH];    SHA256_CTX sha256;    SHA256_Init(&sha256);    SHA256_Update(&sha256, str.c_str(), str.length());    SHA256_Final(雜湊值, &sha256);    字串流 ss;    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) {        ss << hex << setw(2) << setfill(‘0’) << (int)hash[i];    }    return ss.str();}class Block {public:    int index;    字串資料;    字串前一個哈希值;    字串哈希;    長證明;    time_t 時間戳記;    塊(int idx,字串d,字串prevHash){        index = idx;        數據=d;        前一個哈希 = 前一個哈希;        時間戳=時間(nullptr);        證明=0;        哈希 = 計算哈希();    }    字串calculateHash() const {        stringstream ss;        ss <<索引<<時間戳<<資料<< previousHash <<證明;        返回 sha256(ss.str());    }    voidproofOfWork(intdifficulty){        string target(difficulty, ‘0’);        做{            證明++;            哈希 = 計算哈希();        while (hash.substr(0, 難度) != 目標);     }};class Blockchain {public:    vector<Block> chain;    難度;    區塊鏈(int diff) {        難度 = diff;        chain.emplace_back(Block(0, “創世區塊”, “0”));   }    void addBlock(string data) {        Block newBlock(chain.size(), data, chain.back().hash);        newBlock.proofOfWork(難度);        if (isValidProof(newBlock)) {            chain.push_back(newBlock);         }    }    bool isValidProof(const Block& block) const {        return block.hash.substr(0, 難度) == string(難度, ‘0’);     }};

在上面的程式碼片段中,我們可以看到,首先,我們需要向區塊添加證明和哈希。然後,確定證明的難度並進行挖掘。之後,您可以驗證證明。

4.使用 C++ 創建簡單的區塊鏈 API

 API-應用程式介面是一種允許不同軟體應用程式相互交互的工具。而無需了解網路的整個底層結構。 API 有助於將區塊鏈與其他平台(例如 Web 或行動應用程式)整合。因此,API 對於實現高效的開發和整合是必要的。

設定API環境

安裝並配置使用 C++ 建立 API 所需的工具,如下表所示:

建構 API

#include <cpprest/http_listener.h>#include <cpprest/json.h>#include “blockchain.h”using 命名空間web;using 命名空間http;using 命名空間實用程式;using 命名空間http::experimental:: listener;區塊鏈區塊鏈( 4); // 難度等級 4void handleGet(http_request request) {    json::value response = json::value::array();    整數 i = 0;    for (auto& block : Blockchain.chain) {        json::value block_json;        block_json[U(“index”)] = json::value::number(block.index);        block_json[U(“資料”)] = json::value::string(block.data);        block_json[U(“previousHash”)] = json::value::string(block.previousHash);        block_json[U(“哈希”)] = json::value::string(block.hash);        block_json[U(“proof”)] = json::value::number(block.proof);        block_json[U(“時間戳記”)] = json::value::number(block.timestamp);        回應[i++] = block_json;    }    request.reply(status_codes::OK,response);}void handlePost(http_request request) {    request.extract_json().then([&](jsonvalue requestData) { )].as_string();blockchain.addBlock(data);request.reply(status_codes::OK, U(“區塊新增成功”));}).wait();}int main() {http_listener 監聽器(U (“http://localhost:8080”));listener.support(methods::GET,handleGet);listener.support(methods::POST,handlePost);嘗試{listener.open().wait() ;cout << “監聽 http://localhost:8080” << endl;while (true);} catch (exception const& e) {cerr << e.what() << endl;   }返回0;}

handleGet 以 JSON 格式檢索整個區塊鏈。

handlePost 使用 POST 請求中的資料向區塊鏈添加一個新區塊。

運行和測試應用程式

運行應用程式

在根據軟體開發週期完成程式碼的核心功能後,您需要跳到編譯和測試整個應用程式的最關鍵和不可避免的步驟。這對於確認應用程式中的元件是否如預期運作最為重要。

編譯程式碼:g++ -o Blockchain_api Blockchain_api.cpp -lboost_system -lcrypto -lssl -lcpprest執行執行檔:./blockchain_api

上面的程式碼在 http://localhost:8080 上啟動 API 伺服器。

使用郵差測試

  • 使用 Postman 或curl 測試 API 端點:

  • 新增一個區塊:

  • 方法:郵寄

  • 網址:http://localhost:8080

  • 正文:JSON 格式

{  「數據」:「這是一個新區塊」}

查看區塊鏈:

  • 方法:獲取

  • 網址:http://localhost:8080

使用 C++ 創建的 API 新增區塊並查看區塊鏈的範例。

void handleGet(http_request request) {    json::value 回應 = json::value::array();    整數 i = 0;    for (auto& block : Blockchain.chain) {        json::value block_json;        block_json[U(“index”)] = json::value::number(block.index);        block_json[U(“資料”)] = json::value::string(block.data);        block_json[U(“previousHash”)] = json::value::string(block.previousHash);        block_json[U(“哈希”)] = json::value::string(block.hash);        block_json[U(“proof”)] = json::value::number(block.proof);        block_json[U(“時間戳記”)] = json::value::number(block.timestamp);        回應[i++] = block_json;    }    request.reply(status_codes::好的,回應); }void handlePost(http_request request) {    request.extract_json().then([&](json::value requestData) {        auto data = requestData[U(“data”)].as_string(plock); ;request.reply(status_codes::OK, U(“阻止新增成功”)) }).wait();}

handlePost 函數透過從 JSON 主體中提取資料並將新區塊新增至區塊鏈來處理區塊新增。

handleGet 函數檢索整個區塊鏈並將其作為 JSON 回應發送回。

6.使用 C++ 建立區塊鏈應用程式的實例

 逐步執行

步驟 1:使用 C++ 語法建立具有必要屬性的 Block 類別。

#include <iostream>#include <ctime>#include <string>#include <sstream>#include <vector>#include <openssl/sha.h>using namespace std;class Block {public:    int index;    字串資料;    字串前一個哈希值;    字串哈希;    長證明;    time_t 時間戳記;    區塊(int idx,const string&data,const string&prevHash)        :索引(idx),資料(資料),prevHash(prevHash),證明(0),時間戳(時間(nullptr)){     }    字串calculateHash() const {        stringstream ss;        ss <<索引<<時間戳<<資料<< previousHash <<證明;        返回 sha256(ss.str());    }    voidproofOfWork(intdifficulty){        string target(difficulty, ‘0’);        做{            證明++;            哈希 = 計算哈希();        while (hash.substr(0, 難度) != 目標);    }private:    string sha256(const string& input) const {        無符號字元哈希[SHA256_DIGEST_LENGTH];        SHA256_CTX sha256;        SHA256_Init(&sha256);        SHA256_Update(&sha256, input.c_str(), input.size());        SHA256_Final(雜湊值, &sha256); 字串流 ss;        for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {            ss << hex << setw(2) << setfill(‘0’) << (int)hex << setw(2) << setfill(‘0’) << (int)hash[i];        }        return ss.str();     }};

步驟2:實作calculateHash方法。

#include <iostream>#include <sstream>#include <iomanip>#include <openssl/sha.h>class Block {public:    int index;    std::字串資料;    std::string previousHash;    std::字串哈希;    長證明;    time_t 時間戳記;    區塊(int idx, const std::string& data, const std::string& prevHash)        : 索引(idx), 資料(資料), previousHash(prevHash), 證明(0), 時間戳(time(nullp) =計算哈希值();    } std::stringcalculateHash() const {        std::stringstream ss;        ss <<索引<<時間戳<<資料<< previousHash <<證明;        返回 sha256(ss.str());    }private:    std::string sha256(const std::string& input) const {        無符號字元哈希[SHA256_DIGEST_LENGTH];        SHA256_CTX sha256;        SHA256_Init(&sha256);        SHA256_Update(&sha256, input.c_str(), input.size());        SHA256_Final(雜湊值, &sha256);        std::stringstream ss;        for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {            ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i] ;        }        return ss.str();     }};

步驟 3:定義區塊鏈類別並使用創世區塊進行初始化。

class Blockchain {public:    區塊鏈(int 難度)        : 難度(難度) {            }    void addBlock(const string& data) {        Block newBlock(chain.size(), data, chain.back().hash);        newBlock.proofOfWork(難度);        chain.push_back(newBlock);    }    const Block&latestBlock() const {        return chain.back();    }    vector<Block> chain;private:    int 難度;};

步驟4:實作calculateHash方法。

#include <iostream>#include <sstream>#include <iomanip>#include <openssl/sha.h>class Block {public:    int index;    std::字串資料;    std::string previousHash;    std::字串哈希;    長證明;    time_t 時間戳記;    區塊(int idx, const std::string& data, const std::string& prevHash)        : 索引(idx), 資料(資料), previousHash(prevHash), 證明(0), 時間戳(time(nullp) =計算哈希值();    }    std::stringcalculateHash() const {        std::stringstream ss;        ss <<索引<<時間戳<<資料<< previousHash <<證明;        返回 sha256(ss.str());    }private:    std::string sha256(const std::string& input) const {        無符號字元哈希[SHA256_DIGEST_LENGTH];        SHA256_CTX sha256;        SHA256_Init(&sha256);        SHA256_Update(&sha256, input.c_str(), input.size());        SHA256_Final(雜湊值, &sha256);        std::stringstream ss;        for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {            ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i] ;        }        return ss.str();     }};

步驟 5:定義區塊鏈類別並使用創世區塊對其進行初始化。

class Blockchain {public:    區塊鏈(int 難度)        : 難度(難度) {            }    void addBlock(const string& data) {        Block newBlock(chain.size(), data, chain.back().hash);        newBlock.proofOfWork(難度);        chain.push_back(newBlock);    }    const Block&latestBlock() const {        return chain.back();    }    vector<Block> chain;private:    int 難度;};

步驟 6:使用適當的 C++ 函式庫設定 API 環境來處理請求。

#include <cpprest/http_listener.h>#include <cpprest/json.h>using 命名空間web;using 命名空間web::http;using 命名空間web::http::experimental::listener;class BlockchainAPI {public: BlockchainAPI(const字串&地址,區塊鏈&區塊鏈)     :監聽器(http_listener(U(位址))),區塊鏈(區塊鏈) {        listener.support(methods::GET, std:: bind(&BlockchainAPI::handleGet, this, std::placeholders:: _1));listener.support(methods::POST, std::bind(&BlockchainAPI::handlePost, this, std::placeholders::_1)); void start() {listener.open().wait();        cout <<“區塊鏈API正在運行…”<< endl;     }私有:http_listener監聽器;    Blockchain& Blockchain;void handleGet(http_request request) {json::value response = json::value::array();int i = 0;for (const auto& block : Blockchain.chain) {json::value block_json;block_json[ U(“index”)] = json::value::number(block.index);block_json[U(“data”)] = json::value::string(block.data);block_json[U(“previousHash ” ”)] = json::value::string(block.previousHash);block_json[U(“hash”)] = json::value::string(block.hash);block_json[U(“proof”)] = json::value::number(block.proof);block_json[U(“timestamp”)] = json::value::number(block.timestamp);response[i++] = block_json; }        request.reply(status_codes::好的,回應);    }void handlePost(http_request request) {request.extract_json().then([&](json::value requestData) {string data = requestData[U(“data”)].as_string();blockchain.addBlock(data) ;request.reply(status_codes::OK, U(“阻止新增成功”));}) .等待 () ; }};

步驟 7:透過挖掘新區塊並使用 Postman 或curl 驗證區塊鏈來測試應用程式。

Main:int main() {    區塊鏈區塊鏈(4);  // 難度等級    BlockchainAPI api(“http://localhost:8080”, Blockchain);    api.start();    return 0;}測試:curl -X POST http://localhost:8080 -H “Content-Type: application/json” -d ‘{“data”:”這是一個新區塊”}’

使用 C++ 進行區塊鏈開發不僅僅是編碼;它是關於建立去中心化系統的基本要素,這些系統有可能徹底改變各個產業。

總而言之,我們涵蓋了從區塊鏈 C++ 程式設計基礎知識到應用程式的部署和測試的所有內容。

完成本模組後,您可以進一步探索優化的概念,例如可擴展性、安全實踐、高級共識機制和智能合約。 

保持好奇心,擁抱持續學習,持續編碼。