Golang制作一个简单的区块链
区块链是一种数据存储的结构,通过GO语言可以方便的创建一个区块链
直接上代码
1:区块接口和方法package core import ( "crypto/sha256" "encoding/hex" "time" ) type Block struct { Index int //区块链编号索引 Times int64 //区块链创建时间戳 PrevHash string //上一个区块链hash Hash string //当前区块的hash Data string //交易数据 } //创建创世区块 func FirstBlock() Block { var bk Block bk.Index = 0 bk.Times = time.Now().Unix() bk.PrevHash = "" bk.Data = "创世区块" bk.Hash = getHash(bk) return bk } //创建一个区块 func CreateBlock(oldBlock Block, data string) Block { var bk Block bk.Index = oldBlock.Index + 1 bk.Times = time.Now().Unix() bk.PrevHash = oldBlock.Hash bk.Data = data bk.Hash = getHash(bk) return bk } func getHash(b Block) string { str := string(b.Index) + string(b.Times) + b.PrevHash + b.Data hash := sha256.New() hash.Write([]byte(str)) bytes := hash.Sum(nil) hashCode := hex.EncodeToString(bytes) //返回哈希值 return hashCode }
2:创建区块链类和方法 //添加区块到区块链 type BlockChain struct { list []Block } //加入区块链 func (bc *BlockChain) Add(data string) { num := len(bc.list) if num == 0 { //还没有任何区块 添加创世区块 block := FirstBlock() bc.list = append(bc.list, block) } else { oldBlock := bc.list[len(bc.list)-1] var newBlock = CreateBlock(oldBlock, data) if bc.verifyBlock(newBlock, oldBlock) { bc.list = append(bc.list, newBlock) } else { fmt.Println("验证区块错误") } } } //交易记录 func (bc *BlockChain) GetList() { for _, v := range bc.list { fmt.Println("index:", v.Index) fmt.Println("times:", v.Times) fmt.Println("PrevHash:", v.PrevHash) fmt.Println("Hash:", v.Hash) fmt.Println("data:", v.Data) fmt.Println("-----------------------------------") } } //验证区块 验证索引 验证hash func (bc *BlockChain) verifyBlock(newBlock Block, oldBlock Block) bool { //验证索引 if newBlock.Index != oldBlock.Index+1 { return false } //验证hash if newBlock.PrevHash != oldBlock.Hash { return false } newHash := getHash(newBlock) if newBlock.Hash != newHash { return false } /*这里为了增加生成难度判断后缀 code := newHash[len(newHash)-1] if code == 1 { return true } else { fmt.Println("验证hash后缀错误:", newHash) return false } */ return true }
最后测试方法:
func main() { blockchain := core.BlockChain{} for i := 0; i < 10; i++ { blockchain.Add("交易记录:" + strconv.Itoa(i)) time.Sleep(time.Second * 1) } blockchain.GetList() }
测试结果:
PS F:goblock> go run main.go
index: 0
times: 1640488480
PrevHash:
Hash: a91a1da064bd40523be90634584c7c6a23bef44390f855ce8ff671d48b8d9e06
data: 创世区块
-----------------------------------
index: 1
times: 1640488481
PrevHash: a91a1da064bd40523be90634584c7c6a23bef44390f855ce8ff671d48b8d9e06
Hash: 28b659f29d8c8564adc23861e2fa2291dd23d14d672f080fa80ab70dcde7c059
data: 交易记录:1
-----------------------------------
index: 2
times: 1640488482
PrevHash: 28b659f29d8c8564adc23861e2fa2291dd23d14d672f080fa80ab70dcde7c059
Hash: 12b668c4d98cade9d12d651598d302663bcf64435a4e6ed1987cd1d730f324ea
data: 交易记录:2
-----------------------------------
index: 3
times: 1640488483
PrevHash: 12b668c4d98cade9d12d651598d302663bcf64435a4e6ed1987cd1d730f324ea
Hash: c420f63c9a8f73672f23b353f5fd752dee644e0f764740d090319dacccfa7be6
data: 交易记录:3
-----------------------------------
index: 4
times: 1640488484
PrevHash: c420f63c9a8f73672f23b353f5fd752dee644e0f764740d090319dacccfa7be6
Hash: ff37f186a13a4871c398869a259f288e4f504c7adcb613172fc7fbfba6488a45
data: 交易记录:4
-----------------------------------
index: 5
times: 1640488485
PrevHash: ff37f186a13a4871c398869a259f288e4f504c7adcb613172fc7fbfba6488a45
Hash: 0911b845ed602ab4f9c726b3d5dacea6c388c9e0c28db60a4aad62d94720f860
data: 交易记录:5
-----------------------------------
index: 6
times: 1640488486
PrevHash: 0911b845ed602ab4f9c726b3d5dacea6c388c9e0c28db60a4aad62d94720f860
Hash: 8f0f744d190bf204b4441900df2412d99d613bc030ab607b736c99bf1da451b5
data: 交易记录:6
-----------------------------------
index: 7
times: 1640488487
PrevHash: 8f0f744d190bf204b4441900df2412d99d613bc030ab607b736c99bf1da451b5
Hash: 3f8181b0570d615bfd0cae38f38813a46413d2ef8f40fc0bd312b7ff93fa57c5
data: 交易记录:7
-----------------------------------
index: 8
times: 1640488488
PrevHash: 3f8181b0570d615bfd0cae38f38813a46413d2ef8f40fc0bd312b7ff93fa57c5
Hash: 17ca30a31359c73ecd9b7e43319e0736d0d3043f94e541e7b9e19914f192b8ea
data: 交易记录:8
-----------------------------------
index: 9
times: 1640488489
PrevHash: 17ca30a31359c73ecd9b7e43319e0736d0d3043f94e541e7b9e19914f192b8ea
Hash: becffe7bb98f299739f6205bf16996e73315b5b752765d36ba7fc050de4abe1c
data: 交易记录:9
-----------------------------------
电脑大厂,为什么连个手机都做不好呢?(上)各位喜小伙伴,你知道我说的是哪个牌子嘛,没错,就是联想那个举世闻名的的电脑大场在电脑领域的造化真的不只一点点,我们今天就来聊聊这几年的联想手机吧。2018年联想发布了一款滑盖手机联
红米又来搞事了。前不久联发科发布一款新的中端处理器,天机820,不知道这个名字是不是随便改的,还是为狙击友商,红米宣布就要搭载此处理,5月20号,荣耀x10发布,5月26号红米x10发布,而且最重
2020全球最具价值Top100品牌,科技公司占37,中国17家资本实验室王进6月30日,WPP与Kantar联合发布了BrandZ2020全球最具价值Top100品牌名单。根据报告数据,尽管受到新冠疫情对经济社会与个人活动的影响,Top100
小米10青春版正式发布小米10青春版正式发布,价格如下6G64G2099元6G128G2299元8G128G2499元8G256G2799元配置6。57英寸FHD三星AMOLED水滴屏,180Hz触控采
3299起iPhoneSE2正式发布!你们心心念念的iPhonese2它终于来了就在4月15号晚上。外观上,iPhoneSE2采用4。7英寸视网膜高清显示LCD屏,1334750像素分辨率,326ppi,评质量度525
荣耀X10系列疑被曝光?昨天上午,荣耀正式宣布荣耀X10系列的发布时间5月20日,官方宣传语还采用了荣耀X10将颠覆X过往,5G风暴,全民5X等字样,据了解荣耀X10系列正是早前大家期待的荣耀10X系列荣
荣耀30系列视觉盛宴?不知道各位小伙伴是否在观看发布会呢,没看也不要紧,小编带你们走进发布会现场,对于荣耀30系列小编已经不知道说什么了,因为在前面的文章里都已经说过了,所以小编在此就不说第二遍了,咱们
魅族17正式预热,你心动了吗?魅族17将搭载骁龙865处理器UFS3。1闪存,魅族17电池容量为4500mAh,标准版支持30W快充,Pro版本最高支持40W快充在小编之前的文章里也有过魅族17的相关爆料,不过
拨慢老去的时钟值得关注的10大长寿科技公司资本实验室今日创新观察聚焦前沿科技创新与传统产业升级未来10年,最大的投资机会之一将是那些致力于延缓人类死亡的公司。美国银行分析师表示,专注于永生和长寿的公司,也就是那些尽可能延长
从智能垃圾桶到智能路灯,物联网公司如何推动智慧城市建设?资本实验室今日创新观察聚焦前沿科技创新与传统产业升级目前,全球许多城市都面临着人口膨胀交通拥堵环境污染居住空间不足等各种问题。在探索问题解决方案的道路上,数字化与物联网(IOT)为
坦途与波折我们需要什么样的人工智能?资本实验室今日创新观察聚焦前沿科技创新与传统产业升级作者冉伟资本实验室创始人(根据作者在BigAI创新大学活动上的演讲整理)历史车轮滚滚向前,如今我们正在进入人工智能时代。其中的坦