Tendermint源码阅读(一)
关注点:默认配置是怎么来的
一、最基础的默认配置
源码文件:
tendermint/tendermint/config/config.go
// NOTE: Most of the structs & relevant comments + the
// default configuration options were used to manually
// generate the config.toml. Please reflect any changes
// made here in the defaultConfigTemplate constant in
// config/toml.go
// NOTE: tmlibs/cli must know to look in the config dir!
var (
DefaultTendermintDir = ".tendermint"
defaultConfigDir = "config"
defaultDataDir = "data"
defaultConfigFileName = "config.toml"
defaultGenesisJSONName = "genesis.json"
defaultPrivValName = "priv_validator.json"
defaultNodeKeyName = "node_key.json"
defaultAddrBookName = "addrbook.json"
defaultConfigFilePath = filepath.Join(defaultConfigDir, defaultConfigFileName)
defaultGenesisJSONPath = filepath.Join(defaultConfigDir, defaultGenesisJSONName)
defaultPrivValPath = filepath.Join(defaultConfigDir, defaultPrivValName)
defaultNodeKeyPath = filepath.Join(defaultConfigDir, defaultNodeKeyName)
defaultAddrBookPath = filepath.Join(defaultConfigDir, defaultAddrBookName)
)
先看源码,这里定义了tendermint的默认配置存放的目录和文件名,在执行tendermint的init命令时会调用。尽管可以在这更改这些默认配置,但是还是不建议修改。
二、生成默认配置文件
手动生成配置文件
[vagrant@vagrant ~]$ tenderminter init
源码文件:
tendermint/cmd/tendermint/commands/init.go
触发的函数调用关系
initFiles
-> initFilesWithConfig
结果生成两个配置文件:
- private validator
- genesis file
- node_key.json
问题来了,那config.toml是从哪儿生成的呢?
二、核心配置文件
我们执行一次tendermint init
, 发现会自动生成4个配置文件,如果不看源码的话,大家自然而然会认为config.toml是init命令生成的。
我们先做个实验,先把config.toml删除,然后再直接运行tendermint node
,这时,另外启动一个终端,打开.tendermint/config目录,你会发现config.toml又自动生成了。这样,就可以证明config.toml不是init命令生成的。
我们在源码里找找原因。
源码文件:
tendermint/cmd/tendermint/main.go
tendermint/cmd/tendermint/commands/root.go
tendermint/config/toml.go
main()
-> RootCmd
-> ParseConfig()
-> EnsureRoot()
-> writeDefaultConfigFile()
-> DefaultConfig()
下面是比较关键的代码
// Write default config file if missing.
if !cmn.FileExists(configFilePath) {
writeDefaultConfigFile(configFilePath)
}
从这儿可以看出来,tendermint每次运行时,都会检查config.toml,找不到就会自动生成一个。
到这儿,问题解决了。