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: %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 语言实现简易区块链相关推荐
- 简易区块链C语言实现
简易区块链C语言实现 在CSDN的第四个任务:实现一个最简单的区块链,不带区块链网络.时间戳.merkle tree等 除了 SHA256 的加密部分,其余的代码都是自己实现的,写的不好还望见谅... ...
- 使用Java语言从零开始创建区块链
使用Java语言从零开始创建区块链 2018年04月01日 17:08:12 大侠区块链 阅读数:1312 标签: java区块链java区块链 更多 个人分类: 区块链 Java区块链开发与交流群: ...
- 我们为什么用GO语言来做区块链?
作者:思想的苇草 在区块链公链的开发圈子里,我们找到了一些流行的编程语言,有C++.Golang.Python和最近新起的Rust等等. 我们稍微对比较有名的项目采用的编程语言做个统计,如下图: 老一 ...
- 从0到1简易区块链开发手册V0.3-数据持久化与创世区块
Author: brucefeng Email: brucefeng@brucefeng.com 编程语言:Golang 1.BoltDB简介 Bolt是一个纯粹Key/Value模型的程序.该项目的 ...
- 挖矿区块链_使用Java语言从零开始创建区块链
目前网络上关于区块链入门.科普的文章不少,本文就不再赘述区块链的基本概念了,如果对区块链不是很了解的话,可以看一下我之前收集的一些入门学习资源:http://blog.51cto.com/zero01 ...
- 我为什么用GO语言来做区块链?
Go语言现在常常被用来做去中心化系统(decentralised system).其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地. 我们在决定做Karachain的时 ...
- java开发区块链_使用Java语言从零开始创建区块链
目前网络上关于区块链入门.科普的文章不少,本文就不再赘述区块链的基本概念了,如果对区块链不是很了解的话,可以看一下我之前收集的一些入门学习资源: 对区块链技术感到新奇的我们,都想知道区块链在代码上是怎 ...
- go语言实现最小区块链教程5-地址
1 介绍 Introduction 在 上一篇文章中,我们开始实现了交易记录.大家也了解到了交易记录的内在本质:没有用户账户数据,不需要你的个人信息(比如姓名.护照号.身份证号码等)存储在比特币系统当 ...
- 【区块链Go语言实现】区块链基本原型
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 0x00 介绍 区块链(Blockchain)是21世纪最具革命性的技术之一,目前它仍处于逐渐成熟阶段,且其发展潜力尚未 ...
最新文章
- 逻辑回归损失函数(cost function)
- Python2和Python3关于reload()用法的区别
- 每日英语:Would We Be Healthier With A Vegan Diet?
- Spark详解(十):SparkShuffle机制原理分析
- 移动硬盘加密方法赏析
- ad19电气规则检查_PROTEL DXP电气规则检查
- docker 容器启动顺序_Docker容器启动时初始化Mysql数据库
- 新版微软Edge浏览器:支持安装Chrome扩展
- 微服务升级_SpringCloud Alibaba工作笔记0019---Nacos之服务配置中心
- “产品助理最重要的工作是 Android 版本的设计与测试”
- SDR WiFi平台 gr-ieee802-11 软件无线电实现802.11协议
- php中 不等运算符是,PHP中,不等运算符是
- 底层网工、0基础、记性差,学习CCIE/HCIE,到底是啥体验?
- mysql中文排序(按照中文拼音顺序排序)
- 强化学习--蒙特卡洛法
- 用matlab画脑图,思维导图怎么画,画出一副好看的流程图方法是什么
- Richard 外推法求梯度
- vscode新手注意事项(字体间隔,报错提示波浪线,头文件路径,opencv头文件路径)
- 数值分析——追赶法求解线性方程组的python实现
- Glide加载圆角图片不显示问题
热门文章
- SparkSteaming使用
- 怎么获取微信公众号的音频视频
- js 使用tel标签实现拨打电话
- 数据防泄密工作企业该如何开展
- plc无法跟计算机通信,无法与PLC通信
- linux jnlp显示异常,Web启动异常 JNLP
- 【计科快速入门】 三、布尔逻辑和逻辑门
- 江苏省学业水平测试信息技术软件,江苏2019年普通高中信息技术学业水平测试工作顺利结束...
- 7.7 Introduce Foreign Method 引入外部方法
- was compiled with optimization - stepping may behave oddly; variables may not be available