深入学习 Go-Ethereum : 011. CMD 模块 - Geth -dbcmd.go
July 21st, 2022

⬇️以下是 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.go

dbcmd 主要功能是操作levelDB(一个本地的 Key-Value 数据库),代码主要包含了 db 命令和 13 个子命令及实现相应功能的函数。

dbcmd.go 代码结构
dbcmd.go 代码结构

geth db --help 查看子命令列表及简介

⬇️ removeDB 方法:

查看 db 统计信息

删除数据库中数据 geth removedb

再次查看数据库,不存在数据库文件

代码主逻辑⬇️:

removedb 命令对应的方法
removedb 命令对应的方法

提醒用户确认并删除数据文件⬇️

内部方法,提醒用户确认并删除文件
内部方法,提醒用户确认并删除文件

⬇️ inspect 方法:

主要作用是检查当前数据库中的数据分布,代码如下图⬇️,主要逻辑处理 rawdb.InspectDatabase()

inspect 命令对应的方法
inspect 命令对应的方法

对比参数查询结果:左侧是有前缀参数右侧无参数(全数据库)

使用效果对比
使用效果对比

⬇️ dbStats 方法:

主要作用查询数据库存储状态,其中最重要的代码逻辑是

  1. db.Stat()
  2. ethdb/leveldb/leveldb.go 代码中的 db.db.GetProperty()
  3. leveldb/db.go 代码中的 GetProperty(),获取levelDB的统计数据
dbStates方法代码截图
dbStates方法代码截图

⬇️ dbCompact 方法:

Compact 主要作用「压缩」数据,对指定范围 start ,limit 两个参数范围内的数据进行处理,本质上是对 删除的 数据和不再使用的版本数据 进行重排序。(⚠️:此方法会花费较长时间。同时对数据进行加锁)

  1. db.Compact()
  2. ethdb/leveldb/leveldb.go 代码中的 db.db.CompactRange()
  3. leveldb/db_write.go 代码中的 CompactRange(),进行数据压缩处理
dbCompact方法代码截图
dbCompact方法代码截图

⬇️ dbGet、dbDelete、dbPut 方法:

主要是使用 levelDB 的 db.go 进行操作。

⬇️ dbDumpTrie 方法:

指定根节点进行数据导出操作。

dbDumpTrie方法代码截图
dbDumpTrie方法代码截图

⬇️ freezerInspect 方法:

导出”冷数据“,指定导出的数据类型,开始数据 index,和结束数据 index。

数据类型参数范围是[bodies diffs hashes headers receipts]

通过下面命令进行 “凉凉“ 数据进行 dump 操作。

操作示例
操作示例

⬇️ importLDBdata 方法:

导入指定文件(以RLP格式进行快照)数据到 eth.Database ,如果是 gz 文件会通过 gzip 进行文件操作。

// ImportLDBData imports a batch of snapshot data into the database 可以查看 utils.ImportLDBData() 具体实现

⬇️ exportChaindata 方法:

与 import 对应的方法就是数据的导出。导出需要指定数据是preimage还是snapshot,此外需要指定导出文件名及文件后缀名,如果是gz格式,程序会使用gzip进行文件压缩。

调用ExportChaindata()进行数据文件生成

exportChaindata方法
exportChaindata方法

⬇️ showMetaData 方法:

显示levelDB相关元数据信息,比如数据库版本、头信息、快照信息等

showMetaData方法
showMetaData方法

⬇️ freezerMigrate 方法:

迁移”冷数据“,到指定表中「receipts」

以上是dbcmd中代码的主要功能。底层依赖ethdb进行操作KV数据库leveldb。

Subscribe to OutOfToken
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from OutOfToken

Skeleton

Skeleton

Skeleton