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() }來源:http://www./content-4-180551.html |
|