前言
区块链技术现在也是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 core type 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() } }
作者:embedsky
链接:https://www.jianshu.com/p/e7a40b7db52c