总结: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|
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)