code: func (cacher *txSenderCacher) recoverFromBlocks(signer types.Signer, blocks []*types.Block) {
  	count := 0
  	for _, block := range blocks {
  		count += len(block.Transactions())
  	}
  	txs := make([]*types.Transaction, 0, count)
  	for _, block := range blocks {
  		txs = append(txs, block.Transactions()...)
  	}
  	cacher.recover(signer, txs)
  }
docs: // recoverFromBlocks recovers the senders from a batch of blocks and caches them
  // back into the same data structures. There is no validation being done, nor
  // any reaction to invalid signatures. That is up to calling code later.