区块链学习(三)区块链实例

go语言写的案例

 

1.计算哈希,创建 区块

package core

import (
   "crypto/sha256"
   "encoding/hex"
   "time"
)

type Block struct {
   Index        int64  // 区块编号
   Timestmp     int64  // 区块时间戳
   PreBolckHash string // 上一个区块的哈希值
   Hash         string // 当前区块哈希值
   Data         string // 区块数据
}

// 计算哈希
func CalculateHash(b Block) string {
   // 数据不允许修改
   // 把 数据 包含在hash运算的数值里面, ,任何一个模块数据的修改,都会导致区块链, 链式数据结构的破坏
   blockData := string(b.Index) + string(b.Timestmp) + string(b.PreBolckHash)
   HashInBytes := sha256.Sum256([]byte(blockData))
   return hex.EncodeToString(HashInBytes[:])
}

// 生成新区块
func GenerateNewBlock(preBlock Block, data string) Block {
   newBlock := Block{}
   // 新区块的index = 父区块的index+1
   newBlock.Index = preBlock.Index + 1
   // 哈希值 = 父区块的哈希值
   newBlock.PreBolckHash = preBlock.Hash
   // 新区块的时间戳,==当前时间
   newBlock.Timestmp = time.Now().Unix()
   newBlock.Data = data
   // 新区块的哈希 是计算得来的
   newBlock.Hash = CalculateHash(newBlock)
   return newBlock
}

// 生成创始区块
func GenerateGenesisBlock() Block {
   preBlock := Block{}
   preBlock.Index = -1
   preBlock.Timestmp = time.Now().Unix()
   preBlock.Hash = CalculateHash(preBlock)
   preBlock.Data = "Genesis Block(创始区块)"
   GenerateNewBlock(preBlock, "Genesis Block")
   return preBlock
}

 

链式数据

package core

import (
   "fmt"
   "log"
)

type Blockchain struct {
   // 数组
   Blocks []*Block
}

func NewBlockchain() *Blockchain {
   genesisBlock := GenerateGenesisBlock()
   blockchain := Blockchain{}
   blockchain.ApendBlock(&genesisBlock)
   return &blockchain
}

func (bc *Blockchain) SendData(data string) {
   proBlock := bc.Blocks[len(bc.Blocks)-1]
   newBlock := GenerateNewBlock(*proBlock, data)
   bc.ApendBlock(&newBlock)
}

func (bc *Blockchain) ApendBlock(newBlock *Block) {
   // 防止越界
   if len(bc.Blocks) == 0 {
      bc.Blocks = append(bc.Blocks, newBlock)
      return
   }
   if isValid(*newBlock, *bc.Blocks[len(bc.Blocks)-1]) {
      bc.Blocks = append(bc.Blocks, newBlock)
   } else {
      log.Fatal("invalid block")
   }
}

func (bc *Blockchain) Print() {
   // 下划线表示赋值是忽略的
   for _, block := range bc.Blocks {
      fmt.Printf("Index: %d\n", block.Index)
      fmt.Printf("Prev.Hash: %s\n", block.PreBolckHash)
      fmt.Printf("Curr.Hash: %s\n", block.Hash)
      fmt.Printf("Data: %s\n", block.Data)
      fmt.Printf("Timestmp: %d\n", block.Timestmp)
      fmt.Println("")
   }
}

func isValid(newBlock Block, oldBlock Block) bool {
   if newBlock.Index-1 != oldBlock.Index {
      return false
   }
   if newBlock.PreBolckHash != oldBlock.Hash {
      return false
   }
   if CalculateHash(newBlock) != newBlock.Hash {
      return false
   }
   return true
}

 

启动类

package main

import "./core"

func main() {
   bc := core.NewBlockchain()
   bc.SendData("Send 1 BTC to jacky")
   bc.SendData("Send 1 EOS to jacky")
   bc.Print()
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是使用Go语言实现区块链的基本步骤: 1. 定义区块结构体 ```go type Block struct { Index int Timestamp string Data string PrevHash string Hash string } ``` 2. 创建区块链结构体 ```go type Blockchain struct { chain []*Block } ``` 3. 实现创建区块的方法 ```go func (bc *Blockchain) createBlock(data string) *Block { prevBlock := bc.chain[len(bc.chain)-1] newBlock := &Block{ Index: prevBlock.Index + 1, Timestamp: time.Now().String(), Data: data, PrevHash: prevBlock.Hash, } newBlock.Hash = calculateHash(newBlock) bc.chain = append(bc.chain, newBlock) return newBlock } ``` 4. 实现计算区块哈希值的方法 ```go func calculateHash(block *Block) string { record := strconv.Itoa(block.Index) + block.Timestamp + block.Data + block.PrevHash h := sha256.New() h.Write([]byte(record)) hashed := h.Sum(nil) return hex.EncodeToString(hashed) } ``` 5. 实现验证区块链的方法 ```go func (bc *Blockchain) validateChain() bool { for i := 1; i < len(bc.chain); i++ { currentBlock := bc.chain[i] prevBlock := bc.chain[i-1] if currentBlock.Hash != calculateHash(currentBlock) { return false } if currentBlock.PrevHash != prevBlock.Hash { return false } } return true } ``` 6. 创建区块链实例并添加创世块 ```go func main() { bc := Blockchain{[]*Block{createGenesisBlock()}} bc.createBlock("Data for block 2") bc.createBlock("Data for block 3") fmt.Println(bc.validateChain()) } ``` 以上是使用Go语言实现区块链的基本步骤,其中包括定义区块结构体、创建区块链结构体、实现创建区块的方法、实现计算区块哈希值的方法、实现验证区块链的方法以及创建区块链实例并添加创世块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java知路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值