Go语言构建自己的区块链

区块:block.go 

package core

import (
	"crypto/sha256"
	"encoding/hex"
	"time"
)

//区块结构
type Block struct{
	Index int64 //区块下标,从0开始
	Timestap int64 //时间戳
	PrevBlockHash string //前一个区块的哈希值
	Hash string //该区块的哈希值

	Data string
}

//计算哈希值
func calculateHash(b Block)string{
	blockData :=string(b.Index) + string(b.Timestap) + b.PrevBlockHash +b.Data //这几个数字任何一个都是不可更改的
	hashInBytes :=sha256.Sum256([]byte(blockData))
	return hex.EncodeToString(hashInBytes[:])
}

//生成新的区块
func generateNewBlock(preBlock Block ,data string) Block{
	newBlock :=Block{}
	newBlock.Index = preBlock.Index+1
	newBlock.Timestap=time.Now().Unix()
	newBlock.PrevBlockHash=preBlock.Hash
	newBlock.Hash=calculateHash(newBlock)
	newBlock.Data=data
	return newBlock
}

//生成第一个区块
func generateGenesisBlock()  Block{
	preBlock :=Block{}
	preBlock.Index=-1
	preBlock.Hash=""
	return generateNewBlock(preBlock,"genesis block")
}

区块链:blockChain.go

package core

import "fmt"

type BlockChain struct {
	blocks []*Block
}

//新建一条区块链
func NewBlockChain() *BlockChain{
	genesisBlock :=generateGenesisBlock()
	blockChain := BlockChain{}
	blockChain.AppendBlock(&genesisBlock)
	return &blockChain
}

//发送一条数据即新增一个区块
func (bc *BlockChain)SentData(data string){
	preBlock :=bc.blocks[len(bc.blocks)-1]
	newBlock :=generateNewBlock(*preBlock,data)
	bc.AppendBlock(&newBlock)
}

//增加区块
func (bc *BlockChain)AppendBlock(block *Block){
	if len(bc.blocks)==0{
		bc.blocks=append(bc.blocks,block)
		return
	}
	if bc.isValid(*block,*bc.blocks[len(bc.blocks)-1]){
		bc.blocks=append(bc.blocks,block)
	}
}

//打印区块信息
func (bc *BlockChain)Print(){
	for _,block :=range bc.blocks{
		fmt.Printf("Index: %d\n",block.Index)
		fmt.Printf("pre.Hash: %d\n",block.PrevBlockHash)
		fmt.Printf("Hash: %d\n",block.Hash)
		fmt.Printf("data: %d\n",block.Data)
	}
}

//判断区块是否有效
func (bc *BlockChain)isValid(newblock Block,oldBlock Block)bool{
	if (oldBlock.Index+1) != newblock.Index{
		return false
	}
	if (oldBlock.Hash)!=newblock.PrevBlockHash{
		return false
	}
	fmt.Println(calculateHash(newblock))
	fmt.Println(newblock.Hash)
	/*if calculateHash(newblock)!=newblock.Hash{
		fmt.Println(333)
		return false
	}*/
	return true
}

简单测试:main

package main

import "core"

func main()  {
	bc :=core.NewBlockChain()
	bc.SentData("sent 1$ to 1")
	bc.SentData("sent 2$ to 2")
	bc.Print()
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值