⬇️以下是 cmd/geth 包中其他代码的介绍:
├── accountcmd.go
├── chaincmd.go
├── config.go
├── consolecmd.go
├── dbcmd.go 🔫
├── misccmd.go
├── snapshot.go
├── usage.go
└── version_check.go
《深入学习 Go-Ethereum : 010. CMD 模块 - Geth - consolecmd.go》中罗列了 consolecmd
主要源码,接下来描述下关于 dbcmd.go
中的代码功能。
dbcmd 会依赖 go-ethereum 项目源码中
"github.com/ethereum/go-ethereum/cmd/utils"
、
"github.com/ethereum/go-ethereum/common"
、
"github.com/ethereum/go-ethereum/common/hexutil"
、
"github.com/ethereum/go-ethereum/console/prompt"
、
"github.com/ethereum/go-ethereum/core/rawdb"
、
"github.com/ethereum/go-ethereum/core/state/snapshot"
、
"github.com/ethereum/go-ethereum/core/types"
、
"github.com/ethereum/go-ethereum/ethdb"
、
"github.com/ethereum/go-ethereum/log"
、
"github.com/ethereum/go-ethereum/trie"
相关组件。
dbcmd 主要功能是操作levelDB(一个本地的 Key-Value 数据库),代码主要包含了 db
命令和 13 个子命令
及实现相应功能的函数。
geth db --help
查看子命令列表及简介
查看 db 统计信息
删除数据库中数据 geth removedb
再次查看数据库,不存在数据库文件
代码主逻辑⬇️:
提醒用户确认并删除数据文件⬇️
主要作用是检查当前数据库中的数据分布,代码如下图⬇️,主要逻辑处理 rawdb.InspectDatabase()
。
对比参数查询结果:左侧是有前缀参数
、右侧无参数(全数据库)
。
主要作用查询数据库存储状态,其中最重要的代码逻辑是
db.Stat()
→Compact
主要作用「压缩」数据,对指定范围 start ,limit 两个参数范围内的数据进行处理,本质上是对 删除的
数据和不再使用的版本
数据 进行重排序。(⚠️:此方法会花费较长时间。同时对数据进行加锁)
db.Compact()
→主要是使用 levelDB 的 db.go 进行操作。
指定根节点进行数据导出操作。
导出”冷数据“,指定导出的数据类型,开始数据 index,和结束数据 index。
数据类型参数范围是[bodies diffs hashes headers receipts]
通过下面命令进行 “凉凉“ 数据进行 dump 操作。
导入指定文件(以RLP格式进行快照)数据到 eth.Database
,如果是 gz
文件会通过 gzip
进行文件操作。
// ImportLDBData imports a batch of snapshot data into the database 可以查看 utils.ImportLDBData()
具体实现
与 import 对应的方法就是数据的导出。导出需要指定数据是preimage还是snapshot,此外需要指定导出文件名及文件后缀名,如果是gz格式,程序会使用gzip进行文件压缩。
调用ExportChaindata()进行数据文件生成
显示levelDB相关元数据信息,比如数据库版本、头信息、快照信息等
迁移”冷数据“,到指定表中「receipts」
以上是dbcmd中代码的主要功能。底层依赖ethdb进行操作KV数据库leveldb。