⑤:检查区块哈希的当前状态,并确保链中没有任何坏块
for hash := range BadHashes { if header := bc.GetHeaderByHash(hash); header != nil { headerByNumber := bc.GetHeaderByNumber(header.Number.Uint64()) if headerByNumber != nil && headerByNumber.Hash() == header.Hash() { log.Error("Found bad hash, rewinding chain", "number", header.Number, "hash", header.ParentHash) bc.SetHead(header.Number.Uint64() - 1) log.Error("Chain rewind was successful, resuming normal operation") } } }⑥:定时处理future block
go bc.update() ->procFutureBlocks ->InsertChain总的来说做了以下几件事:
配置cacheConfig,创建各种lru缓存
初始化triegc
初始化stateDb:state.NewDatabase(db)
初始化区块和状态验证:NewBlockValidator()
初始化状态处理器:NewStateProcessor()
初始化区块头部链:NewHeaderChain()
查找创世区块:bc.genesisBlock = bc.GetBlockByNumber(0)
加载最新的状态数据:bc.loadLastState()
检查区块哈希的当前状态,并确保链中没有任何坏块
go bc.update() 定时处理future block
加载区块链状态