Go语言学习(二)go语言实现一个简单的比特币系统

//block.go
package main

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

//定义区块
type Block struct{
	Timestamp int64      //时间线,1970年1月1日00.00.00
	Data []byte    //交易数据
	PrevBlockHash []byte  //上一块数据的哈希
	Hash []byte   //当前块数据的哈希
}

//设定结构体对象哈希
func (block *Block)SetHash(){
	//处理当前的时间,转化为10进制的字符串,再转化为字节集合
	timestamp:=[]byte(strconv.FormatInt(block.Timestamp,10))
	//叠加要哈希的数据
	headers:=bytes.Join([][]byte{block.PrevBlockHash,block.Data,timestamp},[]byte{})
	//计算出哈希地址
	hash:=sha256.Sum256(headers)
	block.Hash=hash[:]//设置哈希
}
//创建一个区块
func NewBlock(data string, prevBlockHash []byte) *Block{
	//block是一个指针,取得一个对象初始化之后的地址
	block:=&Block{time.Now().Unix(),[]byte(data),prevBlockHash,[]byte{}}
	block.SetHash()//设置当前哈希
	return block
}
//创建创世区块,
func NewGenesisBlock() *Block{
	return NewBlock("hello, welcome to my second BlockChain",[]byte{})

}
//blockchain.go
package main

type BlockChain struct{
	blocks []*Block    //一个数组,每个元素都是指针,存储block区块的地址
}
//增加一个区块
func (blocks *BlockChain)AddBlock(data string ){
	prevBlock:=blocks.blocks[len(blocks.blocks)-1]    //取出最后一个区块
	newBlock:=NewBlock(data,prevBlock.Hash)       //创建一个区块
	blocks.blocks=append(blocks.blocks,newBlock)    //区块链插入新的区块
}
//创建一个区块链
func NewBlockchain ()*BlockChain{
	return &BlockChain{[]*Block{NewGenesisBlock()}}
}
//main.go
package main

import "fmt"

func main(){
	fmt.Println("hello game start")
	bc:=NewBlockchain()   //创建区块链
	bc.AddBlock("小明1 pay 小红 10")
	bc.AddBlock("小明2 pay 小红 20")
	bc.AddBlock("小明3 pay 小红 30")

	for _,block:=range bc.blocks{
		fmt.Printf("上一块哈希%x\n",block.PrevBlockHash)
		fmt.Printf("数据: %s\n",block.Data)
		fmt.Printf("当前哈希%x\n",block.Hash)
		fmt.Println()
	}


}

猜你喜欢

转载自blog.csdn.net/weixin_39359584/article/details/82928924