区块链的生成与基本操作
Posted 一只特立独行的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链的生成与基本操作相关的知识,希望对你有一定的参考价值。
文章目录
项目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[]*Blockblock
最终的加入了创世区块的区块链如下
最终加入了三个区块了区块链如下:
// 启动
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值是否成一条链
以上是关于区块链的生成与基本操作的主要内容,如果未能解决你的问题,请参考以下文章