C 语言实现简易区块链

C 语言实现简易区块链

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

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

    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #include <stdlib.h>
    
    // 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: %sn", blockChain[i].block.prevHash);
            printf("PrevHash: %sn", blockChain[i].block.hash);
            printf("PrevHash: %sn", 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|
    
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>