Golang区块链开发001-初始化区块链

一. 代码结构


Block.go :定义区块结构与方法

BlockChain.go :定义区块链结构与方法

help.go :将常用代码块进行封装,形成帮助库

main.go:测试代码


二.定义区块结构与方法


package BLC

import (
   "time"
   "strconv"
   "bytes"
   "crypto/sha256"
)

//定义区块
type Block struct {
   //1.区块高度,也就是区块的编号,第几个区块
   Height int64
   //2.上一个区块的Hash值
   PreBlockHash []byte
   //3.交易数据(最终都属于transaction 事务)
   Data []byte
   //4.创建时间的时间戳
   TimeStamp int64
   //5.当前区块的Hash值
   Hash []byte
   //6.Nonce 随机数,用于验证工作量证明
   Nonce int64
}

//定义区块生成Hash的方法
func (block *Block) SetHash() {
   //1.将Height 转换为字节数组 []byte
   heightBytes := IntToHex(block.Height)

   //2.将TimeStamp 转换为字节数组 []byte
   //2.1 将Int64的TimeStamp 转换成二进制
   timeString := strconv.FormatInt(block.TimeStamp, 2)
   //2.2 将二进制字符串转成字节数组
   timeBytes := []byte(timeString)

   //3.拼接所有属性,形成一个二维的byte数组
   blockBytes := bytes.Join([][]byte{heightBytes, block.PreBlockHash, block.Data, timeBytes, block.Hash}, []byte{})
   //4.生成Hash
   hash := sha256.Sum256(blockBytes)
   block.Hash = hash[:]
}

//1. 创建新的区块
func NewBlock(data string, height int64, PreBlockHash []byte) *Block {
   //创建区块
   block := &Block{
      height,
      PreBlockHash,
      []byte(data),
      time.Now().Unix(),
      nil,
      0,
   }
   //设置Hash
   block.SetHash()
   return block

}

//2.生成创世区块
func CreateGenesisBlock(data string) *Block {

   return NewBlock(data, 1, []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})

}



三.定义区块链与方法

package BLC

type BlockChain struct {
   Blocks []*Block //存储有序的区块
}


func (blc *BlockChain)AddBlockChain(data string,height int64,preHash []byte){
   //创建新区块
   newBlock := NewBlock(data,height,preHash)
   //往链中添加区块
   blc.Blocks=append(blc.Blocks,newBlock)

}


//1.创建带有创世区块的区块链
func CreateBlockChainWithGenesisBlock() *BlockChain {

   //创建创世区块
   genesisBlock := CreateGenesisBlock("Genesis Data..")
   //返回区块链对象
   return &BlockChain{[]*Block{genesisBlock}}

}


四.帮助代码库

package BLC

import (
   "bytes"
   "encoding/binary"
   "log"
)

//将int64转换为字节数组
func IntToHex(num int64) []byte {
   buff := new(bytes.Buffer)
   err := binary.Write(buff, binary.BigEndian, num)
   if err != nil {
      log.Panic(err)
   }
   return buff.Bytes()
}


五.测试代码

package main

import (
   "publicChain/BLC"
   "fmt"
)

func main() {

   //创建创世区块
   blockChain := BLC.CreateBlockChainWithGenesisBlock()

   //创建新的区块
   blockChain.AddBlockChain("Send $100 to Bruce", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)
   blockChain.AddBlockChain("Send $200 to Apple", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)
   blockChain.AddBlockChain("Send $300 to Alice", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)
   blockChain.AddBlockChain("Send $400 to Bob", blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, blockChain.Blocks[len(blockChain.Blocks)-1].Hash)

   fmt.Printf("创建的区块链为:\t%v\n", blockChain)
   fmt.Printf("区块链存储的区块为:\t%v\n", blockChain.Blocks)
   fmt.Printf("第二个区块的数据信息(交易信息)为:\t%v\n", string(blockChain.Blocks[1].Data))

}


六.结果显示


猜你喜欢

转载自blog.51cto.com/clovemfong/2149932