持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
区块链数据如何持久化
使用pow挖矿,但是数据都是保存在内存中的,它们会随着进程的终止而消失,因此我们需要使用一个数据库来记录区块数据,使得区块数据持久化存储。
GP语言与blotDB
为什么要选择blotDB数据库? 因为对我们的需求而言,我们需要不需要安装且移植方便的一款数据库,而bolt数据库是一款纯GO语言编写、内嵌型的数据库,它的API非常小巧简洁,主要有文件和bucket(桶)两层结构,kev/val键值对存储在bucket中。
1、打开数据库
go //导入bolt包 import "github.om/boltdb/bolt" //打开数据库 db,err:=bolt.Open("my.db",0600,nil) if err !=nil{ log.Fatal(err) } defer db.Close()
我们看看他Open的一些参数: 第一个参数 path :代表数据库文件
第二个参数 mode:代表设置文件的权限(一般是仅限本用户可读写0600)
第三个参数:options:用来设置文件权限
2、Update和View
对于DB对象,我们主要使用Update和View两种方法,分别对应更新和查看。 go func (db *DB)Update(fn func(*Tx) error)error func (db *DB)View(fn func(*Tx) error)error
这两种方法关键点在于它们内部都要传入一个函数,这个函数参数是*Tx类型,Tx是boltDB的交易结构。CreateBucker和Bucket两种关键方法,CreateBucker用来创建bucket,Bucket用来获取bucket.通过Tx可以获得Bucket对象,Bucket里我们只需关注Put和Get两种方法
总结
先通过Open获得数据库对象DB,通过DB创建一个Bucket对象,再利用Bucket对象调用Put方法插入一组键值对。 代码如下 ```go func main(){ //打开数据库 db,:=bolt.Open("my.db",0600,nil) defer db.Close() //插入数据库数据 db.Update(func(tx *bolt.Tx)error{ //创建bucket bucket,:=tx.CreateBucket([]byte("bucket1") //设置key-val bucket.Put([]byte("name"),[]byte("小明")) return nil }) //查询数据库 db.View(func(tx *bolt.Tx)error{ //获取bucket bucket :=tx.Bucket([]byte(bucket1)) //获取key-val val:=bucket.Get([]byte("name")) fmt.Println(string(val)) return nil
})
} ```