当前位置:   article > 正文

区块链 原理实现 Go_blockchain-indexor

blockchain-indexor

前言:

 简单原理代码描述

core: 块、 区块实现 main: example 运行

BlockMain 执行目录:

  1. package main
  2. import "Chains/core"
  3. func main() {
  4. sc := core.NewBlockChain()
  5. sc.SendData("send 1 btc to jacky")
  6. sc.SendData("send 1 eos to jack")
  7. sc.Print()
  8. }

Block 区块:

  1. package core
  2. import (
  3. "crypto/sha256"
  4. "encoding/hex"
  5. "time"
  6. )
  7. type Block struct {
  8. Index int64 //区块编号
  9. Timestamp int64 //区块时间戳
  10. PreBlockHash string //上一个区哈希值
  11. Hash string //当前区块哈希值
  12. Data string //区块数据
  13. }
  14. func calculateHash(b Block) string{
  15. blockData := string(b.Index) + string(b.Timestamp) + b.PreBlockHash
  16. hashInBytes := sha256.Sum256([]byte(blockData))
  17. return hex.EncodeToString(hashInBytes[:])
  18. }
  19. func GenerateNewBlock(preBlock Block,data string) Block{
  20. newBlock := Block{}
  21. newBlock.Index = preBlock.Index + 1
  22. newBlock.PreBlockHash = preBlock.Hash
  23. newBlock.Timestamp = time.Now().Unix()
  24. newBlock.Hash = calculateHash(newBlock)
  25. return newBlock
  26. }
  27. func GenerateGenesisBlock() Block {
  28. preBlock := Block{}
  29. preBlock.Index = 1
  30. preBlock.Hash = ""
  31. return GenerateNewBlock(preBlock,"Genesies Block")
  32. }

BlockChain 区块链如何实现

  1. package core
  2. import (
  3. "log"
  4. "fmt"
  5. )
  6. type BlockChain struct {
  7. Blocks []*Block
  8. }
  9. func NewBlockChain() *BlockChain {
  10. genesisBlock := GenerateGenesisBlock()
  11. blockchain := BlockChain{}
  12. blockchain.ApendBlock(&genesisBlock)
  13. return &blockchain
  14. }
  15. func (bc *BlockChain) SendData(data string){
  16. preBlock := bc.Blocks[len(bc.Blocks)-1 ]
  17. newBlock := GenerateNewBlock(*preBlock,data)
  18. bc.ApendBlock(&newBlock)
  19. }
  20. func (bc *BlockChain) ApendBlock(newBlock *Block){
  21. if len(bc.Blocks) == 0{
  22. bc.Blocks = append(bc.Blocks,newBlock)
  23. return
  24. }
  25. if isValid(*newBlock,*bc.Blocks[len(bc.Blocks)-1]){
  26. bc.Blocks = append(bc.Blocks,newBlock)
  27. }else{
  28. log.Fatal("invalid block")
  29. }
  30. }
  31. func (bc *BlockChain) Print(){
  32. for _,block := range bc.Blocks{
  33. fmt.Printf("Index:%d\n",block.Index)
  34. fmt.Printf("Pre.Hash:%s\n",block.PreBlockHash)
  35. fmt.Printf("Curr.Hash:%s\n",block.Hash)
  36. fmt.Printf("Data:%s\n",block.Data)
  37. fmt.Printf("TimeStamp:%d\n",block.Timestamp)
  38. }
  39. }
  40. func isValid(newBlock Block,oldBlack Block) bool{
  41. if newBlock.Index - 1 != oldBlack.Index {
  42. return false
  43. }
  44. if newBlock.PreBlockHash != oldBlack.Hash{
  45. return false
  46. }
  47. if calculateHash(newBlock) != newBlock.Hash{
  48. return false
  49. }
  50. return true
  51. }

后续补充优化~~


 

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

闽ICP备14008679号