New creates a block fetcher to retrieve blocks based on hash announcements.
(getBlock blockRetrievalFn, verifyHeader headerVerifierFn, broadcastBlock blockBroadcasterFn, chainHeight chainHeightFn, insertChain chainInsertFn, dropPeer peerDropFn)
| 146 | |
| 147 | // New creates a block fetcher to retrieve blocks based on hash announcements. |
| 148 | func New(getBlock blockRetrievalFn, verifyHeader headerVerifierFn, broadcastBlock blockBroadcasterFn, chainHeight chainHeightFn, insertChain chainInsertFn, dropPeer peerDropFn) *Fetcher { |
| 149 | return &Fetcher{ |
| 150 | notify: make(chan *announce), |
| 151 | inject: make(chan *inject), |
| 152 | blockFilter: make(chan chan []*types.Block), |
| 153 | headerFilter: make(chan chan *headerFilterTask), |
| 154 | bodyFilter: make(chan chan *bodyFilterTask), |
| 155 | done: make(chan common.Hash), |
| 156 | quit: make(chan struct{}), |
| 157 | announces: make(map[string]int), |
| 158 | announced: make(map[common.Hash][]*announce), |
| 159 | fetching: make(map[common.Hash]*announce), |
| 160 | fetched: make(map[common.Hash][]*announce), |
| 161 | completing: make(map[common.Hash]*announce), |
| 162 | queue: prque.New(), |
| 163 | queues: make(map[string]int), |
| 164 | queued: make(map[common.Hash]*inject), |
| 165 | getBlock: getBlock, |
| 166 | verifyHeader: verifyHeader, |
| 167 | broadcastBlock: broadcastBlock, |
| 168 | chainHeight: chainHeight, |
| 169 | insertChain: insertChain, |
| 170 | dropPeer: dropPeer, |
| 171 | } |
| 172 | } |
| 173 | |
| 174 | // Start boots up the announcement based synchroniser, accepting and processing |
| 175 | // hash notifications and block fetches until termination requested. |