第八步:开始建立索引
以下内容为系统启动过程中,每一步骤的详细分析。
第8步,建立索引(src/init.cpp::AppInitMain())
src/init.cpp::AppInitMain())如果指定了 -txindex 参数,则生成交易索引对象 g_txindex,类型为 TxIndex;然后调用其 Start 方法,开始建立索引。
if (gArgs.GetBoolArg("-txindex", DEFAULT_TXINDEX)) {
g_txindex = MakeUnique<TxIndex>(nTxIndexCache, false, fReindex);
g_txindex->Start();
}start 方法处理如下:
首先,调用
RegisterValidationInterface方法注册TxIndex为MainSignalsInstance上各种事件的信号处理器,在发送信号时会调用这些处理器。RegisterValidationInterface(this);然后,调用
Init方法升级交易索引从老的数据库到新的数据库。TxIndex子类重载了这个方法,会调用m_db->MigrateData(*pblocktree, chainActive.GetLocator())方法来升级数据库。然后,调用父类
BaseIndex的同名方法进行处理。在父类的Init方法中,首先会调用ReadBestBlock方法从数据库中读取 Key 为B的区块做为定位器(可能是所有没有分叉的区块)。然后,调用FindForkInGlobalIndex方法,找到活跃区块链上的分叉前的最后一区块索引(从这个区块产生了分叉)。如果这个索引对应的区块和活跃区块链的顶端区块是相同的,设置同步完成标志为真。启动一个线程,线程执行的真正方法为
BaseIndex::ThreadSync。线程的主要作用在于当没有同步完成时,通过读取活跃区块链的下一个区块来进行同步,并把没有分叉的区块以 Key 为B写入数据库中。
Last updated
Was this helpful?