简易区块链demo
  Ld1ydcUEqbSi 2023年11月02日 49 0


由于在跟着做实验室的区块链项目,大概是共识锁相关,需要学习区块链相关的开发,自己学习go语言,并实现了一个非常简单的区块链demo。

golang的语法有点意思。

大概是将用户个人信息和会议信息,上一个链节点的hash码等结合并用sha256加密形成一个hash码,用以确认身份/加密。并有相关信息的安全性验证。还有很多功能没有实现,比如工作量证明(PoW),放到web等等。

慢慢来吧。

package main;

import(
"fmt"
"crypto/sha256"
"encoding/hex"
"math/rand"
"time"
"strconv"
)

type Block struct{
block_num int;
PoW string;
time_stamp string;
meeting_time string;
phone_number string;
lock_number string;
meeting_name string;
room_number string;
hash_code string;
pre_hash_code string;
}

func calculate_hash_code(b Block) (string){
data := b.PoW + b.meeting_time + b.phone_number + b.lock_number + b.meeting_name + b.room_number + b.pre_hash_code;
h := sha256.New();
h.Write([]byte(data));
hashed := h.Sum(nil);
return hex.EncodeToString(hashed);
}

func genesisBlock() ([10]Block){
var bc [10]Block;
bc[0].pre_hash_code = "0000";
bc[0].hash_code = "";
return bc;
}

func setBlock(oldBlock Block, mt string, pn string, ln string, mn string, rn string) (Block){
var newBlock Block;
t := time.Now();
newBlock.block_num = oldBlock.block_num + 1;
newBlock.time_stamp = t.String();
newBlock.PoW = proof_of_work(t.UnixNano());
newBlock.meeting_time = mt;
newBlock.phone_number = pn;
newBlock.lock_number = ln;
newBlock.meeting_name = mn;
newBlock.room_number = rn;
if (len(oldBlock.hash_code) != 0){
newBlock.pre_hash_code = oldBlock.hash_code;
}
newBlock.hash_code = calculate_hash_code(newBlock);
return newBlock;
}

func proof_of_work(seed int64) (string){
rand.Seed(seed);
var rand_num [8]int;
var ret string = "";
var i int;
for i = 0; i < 8; i++ {
rand_num[i] = rand.Intn(10);
ret += strconv.Itoa(rand_num[i]);
}
return ret;
}

func checkBlock(newBlock, oldBlock Block) (bool){
if (oldBlock.block_num != newBlock.block_num - 1){
return false;
}
if (oldBlock.hash_code != newBlock.pre_hash_code){
return false;
}
if (calculate_hash_code(newBlock) != newBlock.hash_code){
return false;
}
if (newBlock.time_stamp > "2018-10-08"){
return false;
}
return true;
}

func main(){
var bc [10]Block = genesisBlock();
var mt = [10]string{"001", "002", "003", "004", "005", "006", "007", "008", "009", "010"};
var pn = [10]string{"18888888888", "18888788888", "18858888888", "18488888888", "18818888888", "18838888888", "18888888488", "18888888088", "18888818888", "18888888882"};
var ln = [10]string{"001", "002", "003", "004", "005", "006", "007", "008", "009", "010"};
var mn = [10]string{"meeting001", "meeting002", "meeting003", "meeting004", "meeting005", "meeting006", "meeting007", "meeting008", "meeting009", "meeting010"};
var rn = [10]string{"201", "202", "203", "204", "205", "206", "207", "208", "209", "210"};
var i int;
bc[0] = setBlock(bc[0], mt[0], pn[0], ln[0], mn[0], rn[0]);
fmt.Println("{");
fmt.Println(" block:", bc[0].block_num);
fmt.Println(" prehash:", bc[0].pre_hash_code);
fmt.Println(" hash:", bc[0].hash_code);
fmt.Println("}");
for i = 1; i < 10; i++ {
bc[i] = setBlock(bc[i - 1], mt[i], pn[i], ln[i], mn[i], rn[i]);
fmt.Println("{");
fmt.Println(" block:", bc[i].block_num);
fmt.Println(" timestamp:", bc[i].time_stamp);
fmt.Println(" proof of work:", bc[i].PoW);
fmt.Println(" meeting time:", bc[i].meeting_time);
fmt.Println(" phone number:", bc[i].phone_number);
fmt.Println(" lock number:", bc[i].lock_number);
fmt.Println(" meeting name:", bc[i].meeting_name);
fmt.Println(" room number:", bc[i].room_number);
fmt.Println(" prehash:", bc[i].pre_hash_code);
fmt.Println(" hash:", bc[i].hash_code);
fmt.Println(" is safe:", checkBlock(bc[i], bc[i - 1]));
fmt.Println("}");
}
}

运行结果:

{
block: 1
prehash:
hash: 674dbded8e26a61445a776294ddf4d778b67560981ca8065bd1d60faed166848
}
{
block: 2
timestamp: 2018-09-17 19:40:11.7381493 +0800 CST m=+0.036977201
proof of work: 12207796
meeting time: 002
phone number: 18888788888
lock number: 002
meeting name: meeting002
room number: 202
prehash: 674dbded8e26a61445a776294ddf4d778b67560981ca8065bd1d60faed166848
hash: 0af95460a7df3be7794e18506a578477954808add3bd4b78d36fb36fa013ec97
is safe: true
}
{
block: 3
timestamp: 2018-09-17 19:40:11.7381493 +0800 CST m=+0.036977201
proof of work: 12207796
meeting time: 003
phone number: 18858888888
lock number: 003
meeting name: meeting003
room number: 203
prehash: 0af95460a7df3be7794e18506a578477954808add3bd4b78d36fb36fa013ec97
hash: 2371fb1166798b102eee5d1a28b4cc0b1b06c813c747d628c19679798c93d6cd
is safe: true
}
{
block: 4
timestamp: 2018-09-17 19:40:11.7381493 +0800 CST m=+0.036977201
proof of work: 12207796
meeting time: 004
phone number: 18488888888
lock number: 004
meeting name: meeting004
room number: 204
prehash: 2371fb1166798b102eee5d1a28b4cc0b1b06c813c747d628c19679798c93d6cd
hash: 182f7d63c55c548cbf1892ebba750bdda783b9d13cdc00beb6bf22df3b08858a
is safe: true
}
{
block: 5
timestamp: 2018-09-17 19:40:11.7391488 +0800 CST m=+0.037976701
proof of work: 72828858
meeting time: 005
phone number: 18818888888
lock number: 005
meeting name: meeting005
room number: 205
prehash: 182f7d63c55c548cbf1892ebba750bdda783b9d13cdc00beb6bf22df3b08858a
hash: 144118a2070e36e3408b23c19a19ed3e97098ac0b242ab94b21669a913f1adc6
is safe: true
}
{
block: 6
timestamp: 2018-09-17 19:40:11.742147 +0800 CST m=+0.040974901
proof of work: 68573901
meeting time: 006
phone number: 18838888888
lock number: 006
meeting name: meeting006
room number: 206
prehash: 144118a2070e36e3408b23c19a19ed3e97098ac0b242ab94b21669a913f1adc6
hash: 08cc2fa7ffe1f69df4f28541cc974d57cf15c4736014e704d90558333d4834a0
is safe: true
}
{
block: 7
timestamp: 2018-09-17 19:40:11.7461444 +0800 CST m=+0.044972301
proof of work: 96622780
meeting time: 007
phone number: 18888888488
lock number: 007
meeting name: meeting007
room number: 207
prehash: 08cc2fa7ffe1f69df4f28541cc974d57cf15c4736014e704d90558333d4834a0
hash: 31c4abe22e8a67fdf02bc0ae3fd11239fd94c36f6e80202ecc16e0cb02b00328
is safe: true
}
{
block: 8
timestamp: 2018-09-17 19:40:11.757138 +0800 CST m=+0.055965901
proof of work: 69328118
meeting time: 008
phone number: 18888888088
lock number: 008
meeting name: meeting008
room number: 208
prehash: 31c4abe22e8a67fdf02bc0ae3fd11239fd94c36f6e80202ecc16e0cb02b00328
hash: 8e0e2aa828c24719bc438cd03862e8c0de397a9246e5f675126480cfa8be9e38
is safe: true
}
{
block: 9
timestamp: 2018-09-17 19:40:11.7631337 +0800 CST m=+0.061961601
proof of work: 38904603
meeting time: 009
phone number: 18888818888
lock number: 009
meeting name: meeting009
room number: 209
prehash: 8e0e2aa828c24719bc438cd03862e8c0de397a9246e5f675126480cfa8be9e38
hash: 2e13b0553023d8cfb488019b288b616b210198795afa9f40330c0576dbb6006e
is safe: true
}
{
block: 10
timestamp: 2018-09-17 19:40:11.7671318 +0800 CST m=+0.065959601
proof of work: 33867600
meeting time: 010
phone number: 18888888882
lock number: 010
meeting name: meeting010
room number: 210
prehash: 2e13b0553023d8cfb488019b288b616b210198795afa9f40330c0576dbb6006e
hash: 34dfd1cf43c04e2204e90896950f1ab0869de48646c62b118f91e85c6b36832e
is safe: true
}

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
Ld1ydcUEqbSi