Bài viết Xây dựng ứng dụng Blockchain bằng C++ xuất hiện đầu tiên trên Coinpedia Fintech News
Giới thiệu
Công nghệ chuỗi khối đã chuyển đổi cơ bản hoạt động tài chính và quản lý chuỗi cung ứng bằng cách cung cấp các cơ chế phi tập trung, minh bạch và an toàn, giúp loại bỏ nhu cầu sử dụng trung gian.
Tại sao nên xây dựng ứng dụng blockchain?
Các ứng dụng Blockchain cung cấp tính toàn vẹn và bảo mật dữ liệu được nâng cao và cung cấp môi trường không cần tin cậy để chia sẻ thông tin. Với Blockchain, người ta có thể triển khai các hợp đồng thông minh và tạo ra các mã thông báo kỹ thuật số mở ra cánh cửa cho các mô hình kinh tế mới như Tài chính phi tập trung (DeFi) và tài sản được mã hóa, v.v.
Bài viết này là chuyến tham quan nhanh trong 10 phút vào thế giới phát triển Blockchain thông qua C++.
Cơ bản về Blockchain
Blockchain là một chuỗi kỹ thuật số được tạo thành từ các đơn vị an toàn và chống giả mạo duy nhất được gọi là khối. Mỗi khối chứa siêu dữ liệu và thông tin được chỉ định của giao dịch. Cho đến nay, chúng ta chỉ tạo ra các khối riêng lẻ phải không?! Bạn sẽ cố gắng thiết lập kết nối giữa từng khối theo cách có ý nghĩa như thế nào? Câu trả lời là bằng cách liên kết từng khối với khối trước đó với sự trợ giúp của các hàm mật mã ngẫu nhiên duy nhất được gọi là hàm băm. Mỗi khối có hàm băm riêng, đây là khóa chính và bạn có thể liên kết tất cả các khối thông qua hàm băm theo thứ tự thời gian, tạo thành một chuỗi đại diện cho toàn bộ lịch sử giao dịch trong mạng.
C++ trong Blockchain
C++ là một trong những ngôn ngữ mạnh mẽ nhất được sử dụng trong blockchain do tốc độ, tính linh hoạt và khả năng kiểm soát của nó. Nó hoạt động rất tốt khi xử lý các hệ thống phức tạp, phát triển trò chơi và các ứng dụng tài chính. Không còn nghi ngờ gì nữa, đây là ngôn ngữ linh hoạt nhất!
C++ tỏa sáng trong blockchain vì nhiều lý do. Nó cho phép các nhà phát triển xây dựng các hệ thống blockchain hiệu quả nhờ khả năng quản lý bộ nhớ cấp thấp cung cấp khả năng kiểm soát chính xác. Chúng ta đều biết mạng lưới Bitcoin lớn và an toàn như thế nào. Hãy tưởng tượng lõi của nó phức tạp như thế nào, vì nó cần xử lý vô số giao dịch. Do đó, để quản lý nhiệm vụ khó khăn này, C++ đã được chọn. Có một số ứng dụng quan trọng được phát triển bằng C++ như Bitcoin, Lifecoin, Ripple, Monero và EOS.
Tại sao C++ là ngôn ngữ lý tưởng để phát triển blockchain?
Tính toán nhanh hơn
Hiệu suất cao
Quản lý bộ nhớ hiệu quả
Tính năng hướng đối tượng
Hỗ trợ đa luồng
Kiểm soát tài nguyên hệ thống
Cho dù bạn là người mới làm quen với blockchain hay đang muốn mở rộng giới hạn khả thi, C++ là lựa chọn phù hợp để xây dựng các ứng dụng lâu dài.
Hiểu các khái niệm về Blockchain với C++
Giao dịch: Trong blockchain, giao dịch là cốt lõi, điều khiển toàn bộ hệ thống. Các khối riêng lẻ giống như két an toàn lưu giữ thông tin uy tín về trao đổi và giá trị của các giao dịch cùng với những người tham gia. Các giao dịch này là những hồ sơ cơ bản kể câu chuyện về việc ai đã trao đổi cái gì, với ai và khi nào.
Những trụ cột của Blockchain bạn nên biết
Phi tập trung: Phi tập trung là lý do tại sao blockchain nổi bật trong toàn bộ lĩnh vực công nghệ. Phi tập trung là gì? Đây là một đặc tính của blockchain mà không có một thực thể nào nắm quyền kiểm soát toàn bộ cơ sở dữ liệu. Điều này làm cho hệ thống mạnh mẽ trước các lỗi và ngăn chặn mọi loại thiên vị. Mỗi thiết bị tham gia (nút) duy trì một bản sao của blockchain, đảm bảo tính minh bạch và ngăn chặn lỗi hoặc thao túng tập trung.
Tính bất biến: Khi bạn ghi bất kỳ dữ liệu nào vào blockchain, bạn không thể thay đổi nó mà không thay đổi các khối tiếp theo. Điều này được thực hiện với sự trợ giúp của băm mật mã. Do đó, tất cả các thay đổi đã thực hiện một lần không thể hoàn tác khiến nó không thể thay đổi.
Cơ chế đồng thuận: Một tập hợp các giao thức quản lý mọi nhu cầu cần thiết của blockchain. Tất cả các nút trong mạng cần phải đồng ý về các phương pháp. Cơ chế đồng thuận được sử dụng để sắp xếp hợp lý các nút và đảm bảo tất cả các nút trong mạng đều ở cùng một trang.
Cho đến bây giờ, bạn hẳn đã hiểu tất cả những điều cơ bản về blockchain rồi phải không? Đủ lý thuyết rồi! Hãy cùng đi sâu vào phần thực hành ngay bây giờ. Sẵn sàng để bắt tay vào làm chưa?
Trong phần này, chúng tôi sẽ hướng dẫn bạn toàn bộ quy trình phát triển ứng dụng blockchain đơn giản. Ngay từ thiết lập môi trường đến thử nghiệm và triển khai.
1. Thiết lập môi trường phát triển C++
Trước khi bắt đầu phát triển, việc có tất cả các điều kiện tiên quyết là điều cần thiết. Trong chương này, chúng ta sẽ xem xét cách bạn có thể có môi trường phát triển phù hợp.
Cài đặt trình biên dịch C++
Chúng ta hãy bắt đầu bằng cách tìm hiểu trình biên dịch là gì.
Trình biên dịch là một công cụ quan trọng trong phát triển phần mềm, đóng vai trò là cầu nối giữa mã mà con người có thể đọc được mà bạn viết và mã máy mà bộ xử lý máy tính của bạn có thể hiểu và thực thi. Trong bối cảnh phát triển các ứng dụng blockchain bằng C++, bước đầu tiên của bạn là trang bị cho mình một trình biên dịch C++ đáng tin cậy. Công cụ này sẽ dịch mã C++ của bạn thành mã máy có thể thực thi, cho phép ứng dụng blockchain của bạn chạy hiệu quả trên nhiều hệ thống khác nhau.
Do đó, để bắt đầu phát triển, trước tiên hãy cài đặt Trình biên dịch C++ tương thích với hệ thống của bạn. Dưới đây là các trình biên dịch C++ phổ biến mà bạn có thể lựa chọn:
GCC (Bộ sưu tập trình biên dịch GNU):
Linux/MacOS:
Mở terminal và nhập các lệnh được đưa ra bên dưới tương ứng
a)Ubuntu/Debian:sudo apt updatesudo apt install build-essentialb)Fedora sudo dnf install gcc gcc-c++c)MacOS(công cụ dòng lệnh)xcode-select –install
Windows: Đối với người dùng Windows, dự án MinGW-w64 là lựa chọn tuyệt vời vì nó cung cấp cổng Windows của GCC (Bộ sưu tập trình biên dịch GNU), mang đến sức mạnh của GCC trong môi trường Windows.
Các bước cài đặt:
Tải xuống trình cài đặt bằng cách truy cập trang web chính thức của MinGW-w64.
Chạy trình cài đặt sau khi tải xuống
Chọn kiến trúc phù hợp theo nhu cầu của bạn
Thực hiện theo các bước của trình hướng dẫn để hoàn tất
Cập nhật hệ thống (Đây là bước tùy chọn nhưng được khuyến nghị).
Tiếng leng keng:
Linux/MacOS: sudo apt install clang (clang cũng đã được cài đặt trong MacOS)Fedora: sudo dnf install clangWindows: Clang có thể được cài đặt bằng MinGW hoặc thông qua trình cài đặt dự án LLVM
MSVC (Microsoft Visual C++):
MSVC (Microsoft Visual C++) là một thành phần không thể thiếu của Visual Studio, một Môi trường phát triển tích hợp (IDE) mạnh mẽ do Microsoft phát triển. Visual Studio cung cấp một bộ công cụ toàn diện để phát triển, thử nghiệm và triển khai các ứng dụng, và khi cài đặt, nó sẽ tự động thiết lập MSVC trên hệ thống của bạn.
Xác minh cài đặt bằng các lệnh sau trong terminal hoặc dấu nhắc lệnh:
g++ –version # Dành cho GCCclang –version # Dành cho Clangcl # Dành cho MSVC
Chọn một IDE
Môi trường phát triển tích hợp (IDE) tăng năng suất bằng cách cung cấp các công cụ như hoàn thiện mã, gỡ lỗi và quản lý dự án trong một giao diện thống nhất. Dưới đây là một số IDE được sử dụng rộng rãi để phát triển C++:
Visual Studio: Tải xuống Visual Studio từ trang web chính thức.
Và thực hiện theo các bước sau đây như được đề cập trong bảng bên dưới:
CLion: Cài đặt và thiết lập:
CLion là một IDE phổ biến và được hỗ trợ bởi JetBrains nhưng yêu cầu phải đăng ký nhưng vẫn cung cấp bản dùng thử miễn phí.
cung cấp bản dùng thử miễn phí.
Visual Studio Code: Cài đặt và thiết lập tiện ích mở rộng cho phát triển C++.
Cài đặt các thư viện cần thiết
Sử dụng trình quản lý gói để cài đặt các thư viện thiết yếu như OpenSSL cho các chức năng mã hóa. Dưới đây là các bước và các thư viện khác nhau cho các Hệ điều hành khác nhau và các lệnh của chúng.
Tuyệt, bạn đã thiết lập thành công môi trường phát triển của mình, bạn có thể trực tiếp bắt đầu thực thi mã trong IDE mà bạn chọn.
2. Xây dựng một Blockchain đơn giản với C++
Trước khi bắt đầu viết code, chúng ta hãy tìm hiểu các thành phần của lớp khối.
Các thành phần của Blockclass
Chỉ mục là một số nguyên lưu trữ và duy trì thứ tự được sắp xếp của các khối theo thời gian.
Dấu thời gian: Dấu thời gian lưu trữ trường hợp khối được tạo dưới dạng chuỗi.
Giao dịch: Giao dịch lưu trữ thông tin trao đổi giữa những người tham gia và trạng thái của chuỗi khối tại thời điểm đó.
Băm trước và Hash: Băm trước lưu trữ băm mật mã của khối trước trong khi băm là chuỗi thông tin mật mã được trộn lẫn hoặc băm.
Nonce: Một số nguyên được sử dụng trong thuật toán đồng thuận Proof of Work (PoW). Hoạt động như một bộ đếm được tăng dần để tìm ra một hàm băm hợp lệ đáp ứng mục tiêu độ khó. Nonce rất quan trọng đối với quá trình khai thác trong PoW, nơi các thợ đào cạnh tranh để tìm ra một nonce tạo ra một hàm băm với một số lượng cụ thể các số 0 đứng đầu.
Bây giờ chúng ta hãy triển khai tất cả các tính năng trong mã:
lớp Block {public: int index; std::string timestamp; std::vector<Transaction> transactions; std::string previousHash; std::string hash; int nonce; // Đối với PoW // Hàm tạo Block(int idx, std::string time, std::vector<Transaction> txs, std::string prevHash) { index = idx; timestamp = time; transactions = txs; previousHash = prevHash; nonce = 0; hash = calculateHash(); // Băm của khối hiện tại} // Phương thức tính toán băm của khối std::string calculateHash() { std::stringstream ss; ss << index << timestamp << previousHash << nonce; // Thêm dữ liệu giao dịch và bất kỳ chi tiết bổ sung nào vào phép tính băm return sha256(ss.str()); // Trình giữ chỗ cho hàm băm thực tế } // Phương pháp khai thác khối void mineBlock(int difficulty) { std::string target(difficulty, ‘0’); // Tạo chuỗi băm mục tiêu while (hash.substr(0, difficulty) != target) { nonce++; hash = calculateHash(); } }};
Sau khi hoàn tất việc định nghĩa blockclass và các thuộc tính của nó, bạn có thể tiếp tục và tạo khối genesis. Khối genesis là khối đầu tiên trong blockchain cần được khởi tạo và có chỉ số bằng 0. Sau khi định nghĩa khối genesis, bạn có thể tiếp tục và thêm các khối mới vào blockchain của mình bằng cách sử dụng phương thức addblock(). Dưới đây là mã:
lớp Blockchain {public: std::vector<Block> chuỗi; Blockchain() { chain.push_back(createGenesisBlock()); } Khối createGenesisBlock() { return Block(0, “01/01/2024”, “Khối Genesis”, “0”); } Khối getLatestBlock() { return chain.back(); } void addBlock(Block newBlock) { newBlock.previousHash = getLatestBlock().hash; newBlock.hash = newBlock.calculateHash(); chain.push_back(newBlock); }};
Tạo và xác minh giao dịch. Mỗi giao dịch có ID riêng, một hàm tạo được xác định trước và thông tin người gửi và người nhận cùng với số tiền. Sau khi tạo giao dịch, bạn cần xác minh giao dịch đó bằng phương thức validateTransaction().
lớp Giao dịch {public: std::string người gửi; std::string người nhận; double amount; std::string transactionID; // Hàm tạo Giao dịch(std::string snd, std::string rcp, double amt, std::string txID) { người gửi = snd; người nhận = rcp; amount = amt; transactionID = txID; } // Phương thức xác thực giao dịch bool validateTransaction() { // Triển khai logic xác thực return true; // Trình giữ chỗ }};
3. Triển khai cơ chế đồng thuận trong C++
Cho đến nay, bạn đã hoàn thành 25% quá trình xây dựng. Bây giờ, bạn tiến lên và triển khai các cơ chế đồng thuận cho khối của mình, đây là xương sống của toàn bộ ứng dụng.
Bằng chứng công việc
Bằng chứng công việc (PoW) là một cơ chế đồng thuận mà theo đó các thành viên của mạng lưới blockchain/thợ đào phải tìm ra giải pháp cho bài toán tính toán khó trước khi họ có thể thêm một khối mới vào chuỗi. Về cơ bản, đây là quá trình tìm một số cụ thể, được gọi là nonce, được kết hợp với dữ liệu của khối, hàm băm của nó và các chi tiết khác để tạo ra giá trị băm bắt đầu bằng một số lượng số không đứng đầu nhất định. Điều này làm cho quá trình này hiệu quả và bảo vệ mạng khỏi các cuộc tấn công độc hại.
Trong C++, bạn có thể triển khai Proof of Work bằng cách thêm thuộc tính proof và phương thức proof of work vào lớp Block. Sau đây là cách bạn có thể thực hiện:
#include <iostream>#include <sstream>#include <ctime>#include <string>#include <vector>#include <openssl/sha.h>sử dụng không gian tên std;chuỗi sha256(const chuỗi str) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, str.c_str(), str.length()); SHA256_Final(băm, &sha256); stringstream ss; đối với (int i = 0; i < SHA256_DIGEST_LENGTH; i++) { ss << hex << setw(2) << setfill(‘0’) << (int)hash[i]; } return ss.str();}lớp Khối {công khai: int index; chuỗi dữ liệu; chuỗi previousHash; chuỗi băm; bằng chứng dài; time_t dấu thời gian; Khối (int idx, chuỗi d, chuỗi prevHash) { index = idx; dữ liệu = d; previousHash = prevHash; dấu thời gian = thời gian(nullptr); proof = 0; hash = calculateHash(); } string calculateHash() const { stringstream ss; ss << index << dấu thời gian << dữ liệu << previousHash << proof; return sha256(ss.str()); } void proofOfWork(int difficulty) { string target(difficulty, ‘0’); do { proof++; hash = calculateHash(); } while (hash.substr(0, difficulty) != target); }};class Blockchain {public: vector<Block> chain; int difficulty; Blockchain(int diff) { độ khó = diff; chain.emplace_back(Block(0, “Khối Genesis”, “0”)); } void addBlock(string data) { Khối newBlock(chain.size(), data, chain.back().hash); newBlock.proofOfWork(độ khó); if (isValidProof(newBlock)) { chain.push_back(newBlock); } } bool isValidProof(const Block& block) const { trả về block.hash.substr(0, độ khó) == string(độ khó, ‘0’); }};
Trong đoạn mã trên, chúng ta có thể thấy rằng trước tiên, chúng ta cần thêm một bằng chứng và một hàm băm vào khối. Sau đó, quyết định độ khó của bằng chứng và khai thác nó. Sau đó, bạn có thể xác thực bằng chứng.
4. Tạo một API Blockchain đơn giản bằng C++
API- Giao diện lập trình ứng dụng là một công cụ cho phép các ứng dụng phần mềm khác nhau tương tác với nhau. Trong blockchain, API giúp tương tác dễ dàng hơn với dữ liệu blockchain được xác định trước, do đó các nhà phát triển có thể nhanh chóng xây dựng các ứng dụng mà không cần biết toàn bộ cấu trúc cơ bản của mạng. API giúp tích hợp blockchain với các nền tảng khác, như ứng dụng web hoặc ứng dụng di động. Do đó, API là cần thiết để cho phép phát triển và tích hợp hiệu quả.
Thiết lập môi trường API
Cài đặt và cấu hình các công cụ cần thiết để tạo API bằng C++ như được đề cập trong bảng dưới đây:
Xây dựng API
#include <cpprest/http_listener.h>#include <cpprest/json.h>#include “blockchain.h”sử dụng không gian tên web;sử dụng không gian tên http;sử dụng tiện ích không gian tên;sử dụng không gian tên http::experimental::listener;Blockchain blockchain(4); // mức độ khó 4void handleGet(http_request request) { json::value response = json::value::array(); int i = 0; for (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(“previousBăm”)] = json::value::string(block.previousBăm); block_json[U(“băm”)] = json::value::string(block.băm); 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::OK, response);}void handlePost(http_request request) { request.extract_json().then([&](json::value requestData) { auto data = requestData[U(“data”)].as_string();blockchain.addBlock(data);request.reply(status_codes::OK, U(“Block added successfully”));}).wait();}int main() {http_listener listener(U(“http://localhost:8080”));listener.support(methods::GET, handleGet);listener.support(methods::POST, handlePost);try {listener.open().wait();cout << “Đang lắng nghe trên http://localhost:8080” << endl;while (true);} catch (ngoại lệ const& e) {cerr << e.what() << endl; }return 0;}
handleGet lấy toàn bộ chuỗi khối ở định dạng JSON.
handlePost thêm một khối mới vào blockchain bằng cách sử dụng dữ liệu từ yêu cầu POST.
Chạy và kiểm tra ứng dụng
Chạy ứng dụng
Sau khi hoàn thành các chức năng cốt lõi của mã theo chu kỳ phát triển phần mềm, bạn cần phải thực hiện bước quan trọng nhất và không thể tránh khỏi là biên dịch và thử nghiệm toàn bộ ứng dụng. Điều này quan trọng nhất để xác nhận rằng các thành phần trong ứng dụng chạy như mong đợi.
Biên dịch mã: g++ -o blockchain_api blockchain_api.cpp -lboost_system -lcrypto -lssl -lcpprestChạy tệp thực thi:./blockchain_api
Đoạn mã trên khởi động máy chủ API tại http://localhost:8080.
Kiểm tra với Postman
Kiểm tra điểm cuối API bằng Postman hoặc curl:
Thêm một khối:
Phương pháp: POST
Địa chỉ: http://localhost:8080
Nội dung: Định dạng JSON
{ “data”: “Đây là một khối mới”}
Xem Blockchain:
Phương pháp: GET
Địa chỉ: http://localhost:8080
Ví dụ về cách thêm khối và xem chuỗi khối bằng API được tạo bằng C++.
void handleGet(http_request request) { json::value response = json::value::array(); int i = 0; for (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.data); block_json[U(“previousHash”)] = json::value::string(block.previousHash); block_json[U(“băm”)] = json::value::string(block.băm); block_json[U(“bằng chứng”)] = json::value::number(block.proof); block_json[U(“dấu thời gian”)] = json::value::number(block.timestamp); response[i++] = block_json; } request.reply(status_codes::OK, response); }void handlePost(http_request request) { request.extract_json().then([&](json::value requestData) { auto data = requestData[U(“data”)].as_string();blockchain.addBlock(data);request.reply(status_codes::OK, U(“Đã thêm khối thành công”)) }).wait();}
Hàm handlePost xử lý việc thêm khối bằng cách trích xuất dữ liệu từ phần thân JSON và thêm khối mới vào chuỗi khối.
Hàm handleGet sẽ truy xuất toàn bộ chuỗi khối và gửi lại dưới dạng phản hồi JSON.
6. Ví dụ thực tế về việc xây dựng ứng dụng Blockchain bằng C++
Thực hiện từng bước
Bước 1: Tạo lớp Block với các thuộc tính cần thiết bằng cú pháp C++.
#include <iostream>#include <ctime>#include <string>#include <sstream>#include <vector>#include <openssl/sha.h>sử dụng không gian tên std;lớp Khối {public: int index; chuỗi dữ liệu; chuỗi previousHash; chuỗi băm; bằng chứng dài; time_t dấu thời gian; Khối (int idx, const chuỗi & dữ liệu, const chuỗi & prevHash) : index (idx), dữ liệu (dữ liệu), previousHash (prevHash), bằng chứng (0), dấu thời gian (thời gian (nullptr)) { hash = calculateHash(); } string calculateHash() const { stringstream ss; ss << index << timestamp << data << previousHash << proof; return sha256(ss.str()); } void proofOfWork(int difficulty) { string target(difficulty, ‘0’); do { proof++; băm = calculateHash(); } while (hash.substr(0, difficulty) != target); }private: string sha256(const string& input) const { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, input.c_str(), input.size()); SHA256_Final(băm, &sha256); stringstream ss; for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) { ss << hex << setw(2) << setfill(‘0’) << (int)hash[i]; } return ss.str(); }};
Bước 2: Triển khai phương thức calculateHash.
#include <iostream>#include <sstream>#include <iomanip>#include <openssl/sha.h>class Block {public: int index; std::string data; std::string previousHash; std::string hash; long proof; time_t timestamp; Block(int idx, const std::string& data, const std::string& prevHash) : index(idx), data(data), previousHash(prevHash), proof(0), timestamp(time(nullptr)) { hash = calculateHash(); } std::string calculateHash() const { std::stringstream ss; ss << index << timestamp << data << previousHash << proof; return sha256(ss.str()); }private: std::string sha256(const std::string& input) const { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, input.c_str(), input.size()); SHA256_Final(băm, &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]; } trả về ss.str(); }};
Bước 3: Xác định lớp Blockchain và khởi tạo nó bằng khối genesis.
lớp Blockchain {public: Blockchain(int difficulty) : difficulty(độ khó) { chain.emplace_back(Block(0, “Genesis Block”, “0”)); } void addBlock(const string& data) { Block newBlock(chain.size(), data, chain.back().hash); newBlock.proofOfWork(độ khó); chain.push_back(newBlock); } const Block& latestBlock() const { return chain.back(); } vector<Block> chain;private: int difficulty;};
Bước 4: Triển khai phương thức calculateHash.
#include <iostream>#include <sstream>#include <iomanip>#include <openssl/sha.h>class Block {public: int index; std::string data; std::string previousHash; std::string hash; long proof; time_t timestamp; Block(int idx, const std::string& data, const std::string& prevHash) : index(idx), data(data), previousHash(prevHash), proof(0), timestamp(time(nullptr)) { hash = calculateHash(); } std::string calculateHash() const { std::stringstream ss; ss << index << timestamp << data << previousHash << proof; return sha256(ss.str()); }private: std::string sha256(const std::string& input) const { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, input.c_str(), input.size()); SHA256_Final(băm, &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]; } trả về ss.str(); }};
Bước 5: Xác định lớp Blockchain và khởi tạo nó bằng khối genesis.
lớp Blockchain {public: Blockchain(int difficulty) : difficulty(độ khó) { chain.emplace_back(Block(0, “Genesis Block”, “0”)); } void addBlock(const string& data) { Block newBlock(chain.size(), data, chain.back().hash); newBlock.proofOfWork(độ khó); chain.push_back(newBlock); } const Block& latestBlock() const { return chain.back(); } vector<Block> chain;private: int difficulty;};
Bước 6: Thiết lập môi trường API để xử lý các yêu cầu bằng thư viện C++ phù hợp.
#include <cpprest/http_listener.h>#include <cpprest/json.h>sử dụng không gian tên web;sử dụng không gian tên web::http;sử dụng không gian tên web::http::experimental::listener;lớp BlockchainAPI {public: BlockchainAPI(const string& address, Blockchain& blockchain) : listener(http_listener(U(address))), blockchain(blockchain) { 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 << “Blockchain API đang chạy…” << endl; }Private:http_listener 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(“previousBăm”)] = json::value::string(block.previousBăm);block_json[U(“băm”)] = 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::OK, response); }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(“Đã thêm khối thành công”));}) .wait() ; }} ;
Bước 7: Kiểm tra ứng dụng bằng cách khai thác khối mới và xác minh chuỗi khối bằng Postman hoặc curl.
Main:int main() { Blockchain blockchain(4); // Mức độ khó BlockchainAPI api(“http://localhost:8080”, blockchain); api.start(); return 0;}Kiểm tra:curl -X POST http://localhost:8080 -H “Content-Type: application/json” -d ‘{“data”:”Đây là một khối mới”}’
Bắt tay vào phát triển blockchain bằng C++ không chỉ đơn thuần là viết mã; mà còn là xây dựng các yếu tố nền tảng của hệ thống phi tập trung có tiềm năng cách mạng hóa nhiều ngành công nghiệp.
Tóm lại, chúng tôi đã đề cập đến mọi thứ từ kiến thức cơ bản về lập trình C++ cho blockchain cho đến việc triển khai và thử nghiệm ứng dụng.
Khi bạn hoàn thành mô-đun này, bạn có thể khám phá thêm các khái niệm về tối ưu hóa như Khả năng mở rộng, Thực hành bảo mật, Cơ chế đồng thuận nâng cao và hợp đồng thông minh.
Hãy luôn tò mò, học hỏi liên tục và tiếp tục lập trình. Mong rằng những đóng góp của bạn sẽ thúc đẩy tương lai của công nghệ!