区块链的生成与基本操作


项目github地址 link

一、项目愿景

通过该项目,能够了解区块链的构成以及如何实现一个功能完善的区块链。

二、项目架构

在这里插入图片描述

三、项目特点

1.去中心化
2.可追溯
3.不可篡改

四、项目流程

区块的基本结构与操作

在这里插入图片描述
区块头的细节如上图所示。每一个区块由6个部分组成分别为时间戳,前一区块哈希,当前区块哈希,随机数,区块号码(区块高度),merkle根,其中为了方便代码,将merkle根表示为数据。最后的区块的代码如下:

// 实现一个基本的区块结构
type Block struct {
	TimeStamp     int64  //代表区块时间
	Hash          []byte //当前区块hash
	PrevBlockHash []byte //前一区块Hash
	Height        int64  //区块高度
	Data          []byte //存储交易数据(先不考虑merkle树)
}

创建区块

每一个区块都需要以上六个部分,其中,时间戳可以在创建时生成,当前区块哈希与随机数也是创建时生成,所以需要传参为前一区块哈希,区块高度,交易数据
具体的代码如下:

// 新建区块
func newBlock(prevBlockHash []byte, height int64, data []byte) *Block {
	var block Block
	block = Block{
		TimeStamp:     time.Now().Unix(),
		Hash:          nil,
		PrevBlockHash: prevBlockHash,
		Height:        height,
		Data:          data,
	}

	return &block
}

创建创世区块,将其的高度设为1。

// 生成创世区块
func CreateGenesisBlock(data []byte) *Block {
	return NewBlock(nil, 1, data)
}

运行截图
在这里插入图片描述

区块链的生成与基本操作

区块链的基本结构
可以采用两种方式进行存放区块,切片与结构体都可以实现。为了更方便的理解,这里采用结构体的方式进行存储。

// 区块链基本结构
type BlockChain struct {
	Blocks []*Block //区块链的切片
}

区块链的操作中,通过区块的添加,实现区块链的延长。

// 添加区块到区块链中
func (bc *BlockChain) AddBlock(prevBlockHash []byte, height int64, data []byte) {
	var newBlock *Block
	newBlock = NewBlock(prevBlockHash, height, data)
	bc.Blocks = append(bc.Blocks, newBlock)
}

但是对于第一个区块而言,由于没有前驱结点, 所以把他作为创世区块单独处理。

// 初始化区块链
func CreateBlockChainWithGenesisBlock() *BlockChain {
	//生成创世区块
	block := CreateGenesisBlock([]byte("the first block"))
	return &BlockChain{[]*Block{block}}
}

最终的加入了创世区块的区块链如下
在这里插入图片描述
最终加入了三个区块了区块链如下:
在这里插入图片描述

// 启动
func main() {
	//初始化区块链
	blockChain := BLC.CreateBlockChainWithGenesisBlock()
	//fmt.Printf("the first block :%v\n", blockChain)
	//加入第二个区块
	blockChain.AddBlock(blockChain.Blocks[len(blockChain.Blocks)-1].Hash,
		blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, []byte("Alice send 10 btc to bob"))
	//加入第三个区块
	blockChain.AddBlock(blockChain.Blocks[len(blockChain.Blocks)-1].Hash,
		blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, []byte("Bob send 5 btc to Tom"))
	//依次展示区块
	for _, d := range blockChain.Blocks {
		fmt.Printf("prevHash:%v\nnowHash:%v\n", d.PrevBlockHash, d.Hash)
	}
}

验证hash值是否成一条链
在这里插入图片描述

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值