dir : eth/backend.go
db를 생성 or load
// ..중략
chainDb, err := stack.OpenDatabaseWithFreezer("chaindata", config.DatabaseCache, config.DatabaseHandles, config.DatabaseFreezer, "eth/db/chaindata/", false)
// > dir : node/node.go
이전에 prune 도중 중단되었다면 이를 재개해 prune을 마무리
if err := pruner.RecoverPruning(stack.ResolvePath(""), chainDb, stack.ResolvePath(config.TrieCleanCacheJournal)); err != nil {
log.Error("Failed to recover state", "error", err)
}
consensus config를 가져와 합의 엔진 생성
ethashConfig := config.Ethash
ethashConfig.NotifyFull = config.Miner.NotifyFull
cliqueConfig, err := core.LoadCliqueConfig(chainDb, config.Genesis)
// 일단 ethash, clique 둘 다 가져오고 clique가 있다면 clique를 사용, vice versa
engine := ethconfig.CreateConsensusEngine(stack, ðashConfig, cliqueConfig, config.Miner.Notify, config.Miner.Noverify, chainDb)
// dir : eth/ethconfig/config.go
생성한 db, engine, config등을 사용해 eth 인스턴스 생성
eth := &Ethereum{
config : config,
...
chainDb : chainDb,
...
}
...
생성한 blockchain 인스턴스 생성
eth.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, config.Genesis, &overrides, eth.engine, vmConfig, eth.shouldPreserve, &config.TxLookupLimit)
// dir : core/blockchain.go
chain head evt를 feed 하기 위한 고루틴 생성
eth.bloomIndexer.Start(eth.blockchain)
// dir : core/chain_indexer.go