当前位置:首页 > C > 正文

用C语言从零构建简易区块链(小白也能看懂的C语言区块链算法实现教程)

在本教程中,我们将使用C语言一步步实现一个最基础的区块链结构。即使你是编程新手,只要具备基本的C语言知识,也能轻松理解并动手实践。我们将重点讲解区块链算法的核心概念,包括区块结构、哈希计算、链式连接等。

用C语言从零构建简易区块链(小白也能看懂的C语言区块链算法实现教程) C语言区块链  区块链算法实现 C语言加密哈希 简易区块链教程 第1张

什么是区块链?

区块链本质上是一个按时间顺序链接的数据块链表。每个“区块”包含三部分核心信息:

  • 数据:如交易记录
  • 前一个区块的哈希值:用于链接到上一个区块
  • 当前区块的哈希值:由本区块内容生成,确保不可篡改

所需工具与依赖

我们将使用标准C库,并借助 OpenSSL 库中的 SHA256 函数来实现C语言加密哈希功能。如果你尚未安装 OpenSSL,请先在系统中安装它(Linux/macOS 可通过包管理器安装,Windows 用户可使用 vcpkg 或 MinGW-w64 配置)。

第1步:定义区块结构

首先,我们定义一个区块(Block)的结构体:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <openssl/sha.h>typedef struct Block {    int index;                // 区块索引    char data[256];           // 存储数据(例如交易信息)    char previous_hash[65];   // 前一个区块的哈希(SHA256为64字符+1个\0)    char hash[65];            // 当前区块的哈希    time_t timestamp;         // 时间戳    struct Block* next;       // 指向下一个区块的指针} Block;

第2步:实现哈希函数

我们需要一个函数,将区块内容转换为唯一的 SHA256 哈希值:

void calculate_hash(Block* block, char* hash_output) {    unsigned char hash[SHA256_DIGEST_LENGTH];    char input[512];    // 将区块关键信息拼接成字符串    snprintf(input, sizeof(input), "%d%s%s%ld",             block->index,             block->data,             block->previous_hash,             block->timestamp);    // 计算 SHA256    SHA256((unsigned char*)input, strlen(input), hash);    // 转换为十六进制字符串    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {        sprintf(&hash_output[i * 2], "%02x", hash[i]);    }    hash_output[64] = '\0';}

第3步:创建创世区块

区块链的第一个区块称为“创世区块”(Genesis Block),它没有前驱:

Block* create_genesis_block() {    Block* genesis = (Block*)malloc(sizeof(Block));    genesis->index = 0;    strcpy(genesis->data, "Genesis Block");    strcpy(genesis->previous_hash, "0");    genesis->timestamp = time(NULL);    calculate_hash(genesis, genesis->hash);    genesis->next = NULL;    return genesis;}

第4步:添加新区块

每次添加新区块时,都要引用前一个区块的哈希:

Block* add_block(Block* last_block, const char* data) {    Block* new_block = (Block*)malloc(sizeof(Block));    new_block->index = last_block->index + 1;    strncpy(new_block->data, data, sizeof(new_block->data) - 1);    strcpy(new_block->previous_hash, last_block->hash);    new_block->timestamp = time(NULL);    calculate_hash(new_block, new_block->hash);    new_block->next = NULL;    last_block->next = new_block;    return new_block;}

第5步:验证区块链完整性

通过比对每个区块的哈希是否与其内容一致,以及是否与前一个区块的哈希匹配,可以验证链是否被篡改:

int is_chain_valid(Block* genesis) {    Block* current = genesis;    while (current->next != NULL) {        Block* next = current->next;        // 检查当前区块的哈希是否正确        char recalculated_hash[65];        calculate_hash(current, recalculated_hash);        if (strcmp(recalculated_hash, current->hash) != 0) {            return 0; // 哈希不匹配        }        // 检查下一个区块的 previous_hash 是否等于当前区块的 hash        if (strcmp(current->hash, next->previous_hash) != 0) {            return 0; // 链接断裂        }        current = next;    }    return 1; // 链有效}

完整示例与运行

将上述代码整合后,编写 main 函数测试整个流程:

int main() {    Block* blockchain = create_genesis_block();    printf("创世区块已创建!哈希: %s\n", blockchain->hash);    add_block(blockchain, "Alice 向 Bob 转账 5 BTC");    add_block(blockchain->next, "Bob 向 Charlie 转账 2 BTC");    // 打印所有区块    Block* current = blockchain;    while (current != NULL) {        printf("\n--- 区块 #%d ---\n", current->index);        printf("数据: %s\n", current->data);        printf("时间: %s", ctime(&current->timestamp));        printf("哈希: %s\n", current->hash);        printf("前一哈希: %s\n", current->previous_hash);        current = current->next;    }    if (is_chain_valid(blockchain)) {        printf("\n✅ 区块链验证通过!未被篡改。\n");    } else {        printf("\n❌ 区块链已被篡改!\n");    }    // 释放内存(略)    return 0;}

编译与运行

保存代码为 blockchain.c,然后使用以下命令编译(需链接 OpenSSL):

gcc -o blockchain blockchain.c -lssl -lcrypto

运行程序即可看到你亲手构建的简易区块链!

总结

通过这个简易区块链教程,你已经掌握了使用C语言区块链技术实现基本链式结构的方法。虽然这只是一个教学模型,但它涵盖了真实区块链的核心思想:不可篡改性、链式链接和哈希验证。后续你可以尝试加入工作量证明(PoW)、持久化存储等功能,进一步深入区块链算法实现的世界。

关键词回顾:C语言区块链区块链算法实现C语言加密哈希简易区块链教程