`banlist.dat` was introduced in https://github.com/bitcoin/bitcoin/pull/6310, storing nodes that were automatically banned (due to exceeding the misbehavior threshold) and manually banned (through the `setban` RPC).

Automatic bans were removed in https://github.com/bitcoin/bitcoin/pull/19219 and replaced with a discouragement filter. That filter is not saved to disk/persisted over shutdown/startup. The `banlist.dat` therefore now only contains addresses that have been banned through the `setban` rpc.

Since https://github.com/bitcoin/bitcoin/pull/15935, we have a specific file for configuration that is updated through the RPC and persisted over shutdown/startup, namely `settings.json`. We should therefore move the manual ban configuration from `banlist.dat` to `settings.json`. Doing so has a couple of benefits:

- `settings.json` is human readable and easily analyzable by any json parser.
- we wouldn't need to maintain custom [de]serialization code for the `banlist.dat` file.

`banlist.dat` is expected to be fairly small and infrequently updated, so disk space/performance are not huge concerns.
bool failed_verification = false;
            try {
                LOCK(cs_main);
                for (CChainState* chainstate : chainman.GetAll()) {
                    if (!is_coinsview_empty(chainstate)) {
                        uiInterface.InitMessage(_("Verifying blocks…").translated);
                        if (fHavePruned && args.GetArg("-checkblocks", DEFAULT_CHECKBLOCKS) > MIN_BLOCKS_TO_KEEP) {
                            LogPrintf("Prune: pruned datadir may not have more than %d blocks; only checking available blocks\n",
                                MIN_BLOCKS_TO_KEEP);
                        }
                        const CBlockIndex* tip = chainstate->m_chain.Tip();
                        RPCNotifyBlockChange(tip);
                        if (tip && tip->nTime > GetAdjustedTime() + 2 * 60 * 60) {
                            strLoadError = _("The block database contains a block which appears to be from the future. "
                                    "This may be due to your computer's date and time being set incorrectly. "
                                    "Only rebuild the block database if you are sure that your computer's date and time are correct");
                            failed_verification = true;
                            break;
                        }
                        if (!CVerifyDB().VerifyDB(
                                *chainstate, chainparams, chainstate->CoinsDB(),
                                args.GetArg("-checklevel", DEFAULT_CHECKLEVEL),
                                args.GetArg("-checkblocks", DEFAULT_CHECKBLOCKS))) {
                            strLoadError = _("Corrupted block database detected");
                            failed_verification = true;
                            break;
                        }
                    }
                }
            } catch (const std::exception& e) {