区块链

Tendermint源码阅读(一)

2018-09-19  本文已影响199人  印随2018
关注点:默认配置是怎么来的

一、最基础的默认配置

源码文件:
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

结果生成两个配置文件:

  1. private validator
  2. genesis file
  3. 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,找不到就会自动生成一个。

到这儿,问题解决了。

上一篇下一篇

猜你喜欢

热点阅读