最近懶到不想寫字
package block
import (
"strconv"
"bytes"
"crypto/sha256"
"time"
)
// 區(qū)塊結構
type Block struct {
Timestamp int64 // 時間戳
Data []byte // 當前區(qū)塊 存放的信息
PrevBlockHash []byte // 上一個區(qū)塊的 加密hash
Hash []byte // 當前區(qū)塊的Hash
}
// 計算hash值
func (self *Block) SetHash() {
// 將本區(qū)塊的timestamp, data, preBlockHash -----> hash
timestamp := []byte(strconv.FormatInt(self.Timestamp, 10))
// 拼接
headers := bytes.Join([][]byte{self.PrevBlockHash, self.Data, timestamp}, []byte{})
// SHA256加密
hash := sha256.Sum256(headers)
self.Hash = hash[:]
}
// 新建區(qū)塊API
func NewBlock(data string, prevBlockHash []byte) *Block {
// 生成一個區(qū)塊
block := Block{}
block.Timestamp = time.Now().Unix()
block.Data = []byte(data)
block.PrevBlockHash = prevBlockHash
block.SetHash()
return &block
}
// 創(chuàng)建區(qū)塊鏈結構體
type BlockChain struct {
Blocks []*Block // 有序的區(qū)塊鏈
}
// 將區(qū)塊添加到區(qū)塊鏈中
func (self *BlockChain) AddBlock(data string) {
// 獲得當前 前驅區(qū)塊
prevBlock := self.Blocks[len(self.Blocks)-1]
// 創(chuàng)建新區(qū)塊
newBlock := NewBlock(data, prevBlock.Hash)
// 添加到blocks
self.Blocks = append(self.Blocks, newBlock)
}
// 區(qū)塊鏈=創(chuàng)世塊+區(qū)塊。。。。。+區(qū)塊
// 創(chuàng)建創(chuàng)世塊
func NewGenesisBlock() *Block {
genesisBlock := Block{}
genesisBlock.Data = []byte("GenesisBlock")
genesisBlock.PrevBlockHash = []byte{}
return &genesisBlock
}
// 新建區(qū)塊鏈
func NewBlockChain() *BlockChain {
blockChain := BlockChain{}
blockChain.Blocks = append(blockChain.Blocks, NewGenesisBlock())
return &blockChain
}
package main
import (
"block"
"fmt"
"os"
)
func main() {
// 創(chuàng)建區(qū)塊鏈
bc := block.NewBlockChain()
var cmd string
for {
fmt.Println("1: 添加")
fmt.Println("2: 遍歷")
fmt.Println("3: 退出")
fmt.Scanf("%s", &cmd)
switch cmd {
case "1":
// 添加
fmt.Println("輸入數據")
input := make([]byte, 1024)
os.Stdin.Read(input)
bc.AddBlock(string(input))
case "2":
// 遍歷
for i, value := range bc.Blocks {
fmt.Println("+++++++++++++++++++")
fmt.Println("第 ", i, "個 區(qū)塊信息:")
fmt.Printf("prevBlockHash: %x\n", value.PrevBlockHash)
fmt.Printf("Data: %s\n", value.Data)
fmt.Printf("Hash %x\n", value.Hash)
fmt.Println("+++++++++++++++++++")
}
default:
// 退出
return
}
}
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。