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: %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 APrevHash: UjJWdVpYTnBjeUJDYkc5amF3PT1VakpXZFZwWVRuQmplVUpEWWtjNWFtRjNQVDAyTWpNNU9URTRNell4ZEdocGN5QnBjeUJpYkc5amF5QkI2MjM5OTE4MzYxVWpKV2RWcFlUbkJqZVVKRFlrYzVhbUYzUFQxVmFrcFhaRlp3V1ZSdVFtcGxWVXBFV1d0ak5XRnRSak5RVkRBeVRXcE5OVTlVUlRSTmVsbDRaRWRvY0dONVFuQmplVUpwWWtjNWFtRjVRa0kyTWpNNU9URTRNell4VldwS1YyUldjRmxVYmtKcVpWVktSRmxyWXpWaGJVWXpVRlF4Vm1GcmNGaGFSbHAzVjFaU2RWRnRjR3hXVlhCRlYxZDBhazVYUm5SU2FrNVJWa1JCZVZSWGNFNU9WVGxWVWxSU1RtVnNiRFJhUldSdlkwZE9OVkZ1UW1wbFZVcHdXV3RqTldGdFJqVlJhMGt5VFdwTk5VOVVSVFJOZWxsNE5qSXpPVGt4T0RNMk1UWXlNems1TVRnek5qRjBhR2x6SUdseklHSnNiMk5ySUVKMGFHbHpJR2x6SUdKc2IyTnJJRUk9NjIzOTkxODM2MTYyMzk5MTgzNjF0aGlzIGlzIGJsb2NrIEI=pH|PrevHash: RjVRa0kyTWpNNU9URTRNell4VldwS1YyUldjRmxVYmtKcVpWVktSRmxyWXpWaGJVWXpVRlF4Vm1GcmNGaGFSbHAzVjFaU2RWRnRjR3hXVlhCRlYxZDBhazVYUm5SU2FrNVJWa1JCZVZSWGNFNU9WVGxWVWxSU1RtVnNiRFJhUldSdlkwZE9OVkZ1UW1wbFZVcHdXV3RqTldGdFJqVlJhMGt5VFdwTk5VOVVSVFJOZWxsNE5qSXpPVGt4T0RNMk1UWXlNems1TVRnek5qRjBhR2x6SUdseklHSnNiMk5ySUVKMGFHbHpJR2x6SUdKc2IyTnJJRUk9NjIzOTkxODM2MTYyMzk5MTgzNjF0aGlzIGlzIGJsb2NrIEI=pH|PrevHash: R2x6SUdseklHSnNiMk5ySUVKMGFHbHpJR2x6SUdKc2IyTnJJRUk9NjIzOTkxODM2MTYyMzk5MTgzNjF0aGlzIGlzIGJsb2NrIEI=pH|
    

C 语言实现简易区块链相关推荐

  1. 简易区块链C语言实现

    简易区块链C语言实现 在CSDN的第四个任务:实现一个最简单的区块链,不带区块链网络.时间戳.merkle tree等 除了 SHA256 的加密部分,其余的代码都是自己实现的,写的不好还望见谅... ...

  2. 使用Java语言从零开始创建区块链

    使用Java语言从零开始创建区块链 2018年04月01日 17:08:12 大侠区块链 阅读数:1312 标签: java区块链java区块链 更多 个人分类: 区块链 Java区块链开发与交流群: ...

  3. 我们为什么用GO语言来做区块链?

    作者:思想的苇草 在区块链公链的开发圈子里,我们找到了一些流行的编程语言,有C++.Golang.Python和最近新起的Rust等等. 我们稍微对比较有名的项目采用的编程语言做个统计,如下图: 老一 ...

  4. 从0到1简易区块链开发手册V0.3-数据持久化与创世区块

    Author: brucefeng Email: brucefeng@brucefeng.com 编程语言:Golang 1.BoltDB简介 Bolt是一个纯粹Key/Value模型的程序.该项目的 ...

  5. 挖矿区块链_使用Java语言从零开始创建区块链

    目前网络上关于区块链入门.科普的文章不少,本文就不再赘述区块链的基本概念了,如果对区块链不是很了解的话,可以看一下我之前收集的一些入门学习资源:http://blog.51cto.com/zero01 ...

  6. 我为什么用GO语言来做区块链?

    Go语言现在常常被用来做去中心化系统(decentralised system).其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地. 我们在决定做Karachain的时 ...

  7. java开发区块链_使用Java语言从零开始创建区块链

    目前网络上关于区块链入门.科普的文章不少,本文就不再赘述区块链的基本概念了,如果对区块链不是很了解的话,可以看一下我之前收集的一些入门学习资源: 对区块链技术感到新奇的我们,都想知道区块链在代码上是怎 ...

  8. go语言实现最小区块链教程5-地址

    1 介绍 Introduction 在 上一篇文章中,我们开始实现了交易记录.大家也了解到了交易记录的内在本质:没有用户账户数据,不需要你的个人信息(比如姓名.护照号.身份证号码等)存储在比特币系统当 ...

  9. 【区块链Go语言实现】区块链基本原型

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 0x00 介绍 区块链(Blockchain)是21世纪最具革命性的技术之一,目前它仍处于逐渐成熟阶段,且其发展潜力尚未 ...

最新文章

  1. 逻辑回归损失函数(cost function)
  2. Python2和Python3关于reload()用法的区别
  3. 每日英语:Would We Be Healthier With A Vegan Diet?
  4. Spark详解(十):SparkShuffle机制原理分析
  5. 移动硬盘加密方法赏析
  6. ad19电气规则检查_PROTEL DXP电气规则检查
  7. docker 容器启动顺序_Docker容器启动时初始化Mysql数据库
  8. 新版微软Edge浏览器:支持安装Chrome扩展
  9. 微服务升级_SpringCloud Alibaba工作笔记0019---Nacos之服务配置中心
  10. “产品助理最重要的工作是 Android 版本的设计与测试”
  11. SDR WiFi平台 gr-ieee802-11 软件无线电实现802.11协议
  12. php中 不等运算符是,PHP中,不等运算符是
  13. 底层网工、0基础、记性差,学习CCIE/HCIE,到底是啥体验?
  14. mysql中文排序(按照中文拼音顺序排序)
  15. 强化学习--蒙特卡洛法
  16. 用matlab画脑图,思维导图怎么画,画出一副好看的流程图方法是什么
  17. Richard 外推法求梯度
  18. vscode新手注意事项(字体间隔,报错提示波浪线,头文件路径,opencv头文件路径)
  19. 数值分析——追赶法求解线性方程组的python实现
  20. Glide加载圆角图片不显示问题

热门文章

  1. SparkSteaming使用
  2. 怎么获取微信公众号的音频视频
  3. js 使用tel标签实现拨打电话
  4. 数据防泄密工作企业该如何开展
  5. plc无法跟计算机通信,无法与PLC通信
  6. linux jnlp显示异常,Web启动异常 JNLP
  7. 【计科快速入门】 三、布尔逻辑和逻辑门
  8. 江苏省学业水平测试信息技术软件,江苏2019年普通高中信息技术学业水平测试工作顺利结束...
  9. 7.7 Introduce Foreign Method 引入外部方法
  10. was compiled with optimization - stepping may behave oddly; variables may not be available