持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
区块链数据如何持久化
使用pow挖矿,但是数据都是保存在内存中的,它们会随着进程的终止而消失,因此我们需要使用一个数据库来记录区块数据,使得区块数据持久化存储。
GP语言与blotDB
为什么要选择blotDB数据库? 因为对我们的需求而言,我们需要不需要安装且移植方便的一款数据库,而bolt数据库是一款纯GO语言编写、内嵌型的数据库,它的API非常小巧简洁,主要有文件和bucket(桶)两层结构,kev/val键值对存储在bucket中。
1、打开数据库
//导入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两种方法,分别对应更新和查看。
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方法插入一组键值对。 代码如下
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
})
}