前言
區塊鏈技術現在也是IT界的網紅了,做點技術學習,不搞點跟區塊鏈沾邊的都好意思出去跟別人打招呼了。現在學習go語言剛好也蹭一波區塊鏈的熱度。
概要
golang知識點:
1、golang結構體使用
2、常用api使用,如bytes.Join、sha256.sum256、strconv.FormatInt等等,學習數組、切片的應用
區塊鏈簡化說明:
1、簡化的區塊對象Block包含四個成員,TimeStamp(時間戳記)、PreBlockHash(上一個區塊的雜湊值)、Data(儲存的資料內容)、Hash(自己區塊的雜湊值)
2、簡化的區塊鏈對象,包含一個區塊想的數組Blocks
編碼類比區塊鏈的構造建立
1、建立一個golang工程項目,目錄結構如下:目錄結構
說明:
bin目錄存放編譯產生的可執行檔
src-coin存放main.go
src-core存放block.go與blockChian.go
2、block.go
package coreimport ( "time" "strconv" "bytes" "crypto/sha256")type Block struct { TimeStamp int64//時間戳記 Data []byte//儲存的資料資訊 PrevBlockHash []byte// 上一個區塊的hash Hash []byte//本區塊的hash}// 建立一個新的區塊func NewBlock(data string, prevBlockHash []byte) *Block { // 建立一個區塊,自己hash值為空白 block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}} // 計算自己區塊的hash值 block.SetHash() return block}func (b *Block) SetHash() { strTimeStamp := []byte(strconv.FormatInt(b.TimeStamp, 10)) headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, strTimeStamp}, []byte{}) hash := sha256.Sum256(headers) b.Hash = hash[:]}// 類比創世區塊func NewGenesisBlock() *Block { return NewBlock("Genesis Block", []byte{})}
3、blockchain.go
package coretype BlockChain struct { Blocks []*Block}// 添加區塊到鏈上func (bc *BlockChain) AddBlock(data string) { preBlock := bc.Blocks[len(bc.Blocks)-1]// 擷取前一個區塊 newBlock := NewBlock(data, preBlock.Hash)//建立新區塊 bc.Blocks = append(bc.Blocks, newBlock)// 連結新區塊到鏈上}// 建立區塊鏈func NewBlockChain() *BlockChain { return &BlockChain{[]*Block{NewGenesisBlock()}}}
4、main.go測試
package mainimport ( "core" "fmt")func main() { bc := core.NewBlockChain()//建立區塊鏈 bc.AddBlock("send 1 btc to Ivan")// 添加一個區塊到連上 bc.AddBlock("send 2 btc to Ivan")// 測試列印區塊鏈上的資訊 for _, block := range bc.Blocks { fmt.Printf("PrevBlockHash:%x\n", block.PrevBlockHash) fmt.Printf("Data:%s\n", block.Data) fmt.Printf("Hash:%x\n", block.Hash) fmt.Printf("TimeStamp:%d\n", block.TimeStamp) println() }}