当前位置:   article > 正文

Go语言学习(一)网上的实现一个简单的区块链_go语言将block.calhash()函数补全,实现对block的hash计算。其中 hash=

go语言将block.calhash()函数补全,实现对block的hash计算。其中 hash= sha256(pre
  1. package main
  2. import (
  3. "crypto/sha256"
  4. "encoding/hex"
  5. "fmt"
  6. "github.com/labstack/echo"
  7. "time"
  8. )
  9. type BlockModel struct{
  10. Id int64 //ID索引,这个块在整个链中的位置
  11. Timestamp string //区块创建的时间标识
  12. BPM int //每分钟心跳频率
  13. Hash string //区块哈希sha256
  14. PreHash string //上一块的哈希sha256
  15. }
  16. //区块链,数组
  17. var BlockChain = make([]BlockModel,0)
  18. //创建第一个区块,创世区块
  19. func init(){
  20. //创建了一个区块
  21. block:=BlockModel{Id:0,Timestamp:time.Now().String(),BPM:0,Hash:"",PreHash:""}
  22. BlockChain=append(BlockChain, block) //加入数组
  23. }
  24. //哈希处理
  25. func calcHash(block BlockModel)string{
  26. record:=string(block.Id)+block.Timestamp+string(block.BPM)+block.PreHash //字符串
  27. myhash:=sha256.New() //创建算法,sha256对象
  28. myhash.Write([]byte(record)) //加入数据
  29. hashed:=myhash.Sum(nil) //计算哈希
  30. return hex.EncodeToString(hashed) //编码为字符串
  31. }
  32. func Is_BlockValid(newBlock, lastBlock BlockModel) bool{
  33. //id不相等,不是顺序模式
  34. if lastBlock.Id+1!=newBlock.Id{
  35. return false
  36. }
  37. //前一块的哈希,不等于新区块的上一个哈希
  38. if lastBlock.Hash!=newBlock.PreHash{
  39. return false
  40. }
  41. if calcHash(newBlock)!=newBlock.Hash{ //数据被篡改
  42. return false
  43. }
  44. return true
  45. }
  46. //处理区块的创建
  47. func createBlock(ctx echo.Context) error{
  48. //处理心跳信息
  49. type message struct {
  50. BPM int
  51. }
  52. var mymessage=message{}
  53. if err:=ctx.Bind(&mymessage);err!=nil{ //绑定消息处理
  54. panic(err) //处理错误
  55. }
  56. lastblock:=BlockChain[len(BlockChain)-1] //前一个区块
  57. //使用前一个区块,创建新的区块
  58. newblock:=BlockModel{}
  59. newblock.Id=lastblock.Id+1 //序列号+1
  60. newblock.Timestamp=time.Now().String() //当前时间
  61. newblock.BPM=mymessage.BPM //心跳信息
  62. newblock.PreHash=lastblock.Hash //哈希
  63. newblock.Hash=calcHash(newblock) //计算哈希
  64. if Is_BlockValid(newblock,lastblock){
  65. BlockChain=append(BlockChain,newblock)
  66. fmt.Println("创建区块成功",BlockChain[len(BlockChain)-1].Id)
  67. }else{
  68. fmt.Println("创建区块失败")
  69. }
  70. return ctx.JSON(200,newblock)
  71. }
  72. func main(){
  73. echosever:=echo.New() //创建服务器
  74. echosever.GET("/", func(context echo.Context) error{
  75. return context.JSON(200,BlockChain)
  76. })
  77. echosever.POST("/",createBlock)
  78. echosever.Logger.Fatal(echosever.Start(":8848"))
  79. }

运行之后访问网页:127.0.0.1:8848即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/952737
推荐阅读
相关标签
  

闽ICP备14008679号