## Blockchain Reactor * coordinates the pool for syncing * coordinates the store for persistence * coordinates the playing of blocks towards the app using a sm.BlockExecutor * handles switching between fastsync and consensus * it is a p2p.BaseReactor * starts the pool.Start() and its poolRoutine() * registers all the concrete types and interfaces for serialisation ### poolRoutine * listens to these channels: * pool requests blocks from a specific peer by posting to requestsCh, block reactor then sends a &bcBlockRequestMessage for a specific height * pool signals timeout of a specific peer by posting to timeoutsCh * switchToConsensusTicker to periodically try and switch to consensus * trySyncTicker to periodically check if we have fallen behind and then catch-up sync * if there aren't any new blocks available on the pool it skips syncing * tries to sync the app by taking downloaded blocks from the pool, gives them to the app and stores them on disk * implements Receive which is called by the switch/peer * calls AddBlock on the pool when it receives a new block from a peer ## Block Pool * responsible for downloading blocks from peers * makeRequestersRoutine() * removes timeout peers * starts new requesters by calling makeNextRequester() * requestRoutine(): * picks a peer and sends the request, then blocks until: * pool is stopped by listening to pool.Quit * requester is stopped by listening to Quit * request is redone * we receive a block * gotBlockCh is strange ## Block Store * persists blocks to disk # TODO * How does the switch from bcR to conR happen? Does conR persist blocks to disk too? * What is the interaction between the consensus and blockchain reactors?