C 语言实现简易区块链

C 语言实现简易区块链,第1张

C 语言实现简易区块链

总结:C 语言真不是我这种菜鸡所能驾驭的…

无奈哈希函数太麻烦,就采用 base64 替代下哈希函数吧,其他符合区块链理论

#include 
#include 
#include 
#include 

// base64 编码
static const char *ALPHA_BASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
void Base64(const char *buf, const long size, char *base64Char) {
    int a = 0;
    int i = 0;
    while (i < size) {
        char b0 = buf[i++];
        char b1 = (i < size) ? buf[i++] : 0;
        char b2 = (i < size) ? buf[i++] : 0;

        int int63 = 0x3F;
        int int255 = 0xFF;
        base64Char[a++] = ALPHA_BASE[(b0 >> 2) & int63];
        base64Char[a++] = ALPHA_BASE[((b0 << 4) | ((b1 & int255) >> 4)) & int63];
        base64Char[a++] = ALPHA_BASE[((b1 << 2) | ((b2 & int255) >> 6)) & int63];
        base64Char[a++] = ALPHA_BASE[b2 & int63];
    }
    switch (size % 3) {
        case 1:
            base64Char[--a] = '=';
        case 2:
            base64Char[--a] = '=';
    }
}
// 获取当前时间戳
void timeStamp(char *timeStamp) {
    time_t t = time(NULL);
    int _timeStamp_ = time(&t);
    while (_timeStamp_ != 0) {
        timeStamp[strlen(timeStamp)] = (_timeStamp_ % 10) + '0';
        _timeStamp_ /= 10;
    }
}

typedef struct block {
    char prevHash[256];
    char hash[256];
    char timeStamp[20];
    char data[1024];
} Block;

void setBlockHash(Block *block) {
    char str[2048];
    strcat(str, block->prevHash);
    strcat(str, block->hash);
    timeStamp(block->timeStamp);
    strcat(str, block->data);
    Base64(str, strlen(str), block->hash);
}

char* getBlockHash(Block block) {
    char *res = block.hash;
    return res;
}

// 创建区块
Block createBlock(char prevHash[1024], char data[1024]) {
    Block block;
    strcpy(block.prevHash, prevHash);
    strcpy(block.data, data);
    timeStamp((&block)->timeStamp);

    char _hash_[2048];
    strcpy(_hash_, prevHash);
    strcat(_hash_, block.timeStamp);
    strcat(_hash_, data);
    Base64(_hash_, strlen(_hash_), block.hash);
    return block;
}

typedef struct blockChain {
    Block block;
} BlockChain;
BlockChain blockChain[1024];
int blockChainPosition = 0;
// 创世区块
void Init_BlockChain() {
    char headHash[16];
    char headMsg[] = "Genesis Block";
    Base64(headMsg, strlen(headMsg), headHash);
    blockChain[blockChainPosition++].block = createBlock(headHash, "Genesis Block");
}

void addBlock(char *data) {
    blockChain[blockChainPosition].block = createBlock(blockChain[blockChainPosition - 1].block.prevHash, data);
    char _block_[2048];
    strcat(_block_, blockChain[blockChainPosition].block.prevHash);
    strcat(_block_, blockChain[blockChainPosition].block.hash);
    strcat(_block_, blockChain[blockChainPosition].block.timeStamp);
    Base64(_block_, strlen(_block_), blockChain[blockChainPosition].block.prevHash);
    blockChainPosition++;
}

int main() {
    Init_BlockChain();

    addBlock("this is block A");
    addBlock("this is block B");

    for (int i = 1; i < blockChainPosition; i++) {
        printf("PrevHash: %s\n", blockChain[i].block.prevHash);
        printf("PrevHash: %s\n", blockChain[i].block.hash);
        printf("PrevHash: %s\n", blockChain[i].block.data);
        printf("\n");
    }
    return 0;
}

运行结果

PrevHash: UjJWdVpYTnBjeUJDYkc5amF3PT1VakpXZFZwWVRuQmplVUpEWWtjNWFtRjNQVDAyTWpNNU9URTRNell4ZEdocGN5QnBjeUJpYkc5amF5QkI2MjM5OTE4MzYx
PrevHash: UjJWdVpYTnBjeUJDYkc5amF3PT02MjM5OTE4MzYxdGhpcyBpcyBibG9jayBB
PrevHash: this is block A

PrevHash: UjJWdVpYTnBjeUJDYkc5amF3PT1VakpXZFZwWVRuQmplVUpEWWtjNWFtRjNQVDAyTWpNNU9URTRNell4ZEdocGN5QnBjeUJpYkc5amF5QkI2MjM5OTE4MzYxVWpKV2RWcFlUbkJqZVVKRFlrYzVhbUYzUFQxVmFrcFhaRlp3V1ZSdVFtcGxWVXBFV1d0ak5XRnRSak5RVkRBeVRXcE5OVTlVUlRSTmVsbDRaRWRvY0dONVFuQmplVUpwWWtjNWFtRjVRa0kyTWpNNU9URTRNell4VldwS1YyUldjRmxVYmtKcVpWVktSRmxyWXpWaGJVWXpVRlF4Vm1GcmNGaGFSbHAzVjFaU2RWRnRjR3hXVlhCRlYxZDBhazVYUm5SU2FrNVJWa1JCZVZSWGNFNU9WVGxWVWxSU1RtVnNiRFJhUldSdlkwZE9OVkZ1UW1wbFZVcHdXV3RqTldGdFJqVlJhMGt5VFdwTk5VOVVSVFJOZWxsNE5qSXpPVGt4T0RNMk1UWXlNems1TVRnek5qRjBhR2x6SUdseklHSnNiMk5ySUVKMGFHbHpJR2x6SUdKc2IyTnJJRUk9NjIzOTkxODM2MTYyMzk5MTgzNjF0aGlzIGlzIGJsb2NrIEI=pH|

PrevHash: RjVRa0kyTWpNNU9URTRNell4VldwS1YyUldjRmxVYmtKcVpWVktSRmxyWXpWaGJVWXpVRlF4Vm1GcmNGaGFSbHAzVjFaU2RWRnRjR3hXVlhCRlYxZDBhazVYUm5SU2FrNVJWa1JCZVZSWGNFNU9WVGxWVWxSU1RtVnNiRFJhUldSdlkwZE9OVkZ1UW1wbFZVcHdXV3RqTldGdFJqVlJhMGt5VFdwTk5VOVVSVFJOZWxsNE5qSXpPVGt4T0RNMk1UWXlNems1TVRnek5qRjBhR2x6SUdseklHSnNiMk5ySUVKMGFHbHpJR2x6SUdKc2IyTnJJRUk9NjIzOTkxODM2MTYyMzk5MTgzNjF0aGlzIGlzIGJsb2NrIEI=pH|

PrevHash: R2x6SUdseklHSnNiMk5ySUVKMGFHbHpJR2x6SUdKc2IyTnJJRUk9NjIzOTkxODM2MTYyMzk5MTgzNjF0aGlzIGlzIGJsb2NrIEI=pH|

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/1298616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存