区块链项目 - 3 区块存储和遍历

3.存储和遍历

现在我们想要把区块存储进数据库中并且根据需要遍历某个区块的信息

3.1区块的存储

这里我们采用Go语言自带的数据库,如果在安装Go语言时没有安装,则需要通过如下链接安装

go get github.com/boltdb/bolt

安装成功后才能实现区块的存储和遍历

我们用键值对来实现对区块的存储,key:当前区块的哈希,value:当前区块序列化后的数组。当然遍历时我们就需要进行反序列化以还原区块信息,现在我们一并构建这它们

/Users/xxx/go/src/publicChain/part15-persistence/BLC/Block.go

//SerializeBlockfunc (block *Block) Serialize() []byte {var result bytes.Bufferencoder := gob.NewEncoder(&result)err := encoder.Encode(block)if err != nil {log.Panic(err)}return result.Bytes()
}//DeserializeBlockfunc DeserializeBlock(blockBytes []byte) *Block {var block Blockdecoder := gob.NewDecoder(bytes.NewReader(blockBytes))err := decoder.Decode(&block)if err != nil {log.Panic()}return &block
}

在此之前,我们会将新产生的区块加入到链上,现在我们重新改写一下:在这里我们将会把新产生的区块存入数据库中的数据表里。事实上,只要一个区块的产生依赖于上一个区块,那这些区块自动就是一条“区块链”,所以并不需要我们再重构一条链,我们只需要通过一定的方式处理这些区块即可。前面所说的把一个个区块加入到“链”上其实就是一种处理方式,现在我们把这种方式改变一下,也就是说直接把区块装入数据库中。下面是实现代码:

/Users/xxx/go/src/publicChain/part15-persistence/BLC/Blockchain.go

const dbName = "blockChain.db"
const blockTableName = "blocks"type Blockchain struct {Tip []byte   //the hash of current blockDB  *bolt.DB //database
}
//add a new block to blockchainfunc (blc *Blockchain) AddBlockToBlockchain(data string) {err := blc.DB.Update(func(tx *bolt.Tx) error {//get a tableb := tx.Bucket([]byte(blockTableName))//crate a new blockif b != nil {//Get the latest blockblockBytes := b.Get(blc.Tip)//Deserializeblock := DeserializeBlock(blockBytes)//Serialize the block and store it in the database


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部