use callback to handle blocks so number of blocks to look back isn't limited by memory