You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1.7 KiB

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?