Some comments from @sipa in #12702.

___

Yes, I think `importmulti` is superior in every way, except:
* Slightly less convenient to use (it requires redundant information, as you have to explicitly state what you want to import, and then give the keys/... to enable that).
* ~Doesn't support P2SH-P2WPKH yet~. Added in #14454

The latter can be fixed by just adding support for that case. The former can be improved by adding 'default' cases (e.g. if you prove a WIF private key, it can permit omitting the address, ...).

if (pwallet->HaveKey(keyid)) {
                    pwallet->WalletLogPrintf("Skipping import of %s (key already present)\n", EncodeDestination(keyid));
                    continue;
                }
                int64_t nTime = DecodeDumpTime(vstr[1]);
                std::string strLabel;
                bool fLabel = true;
                for (unsigned int nStr = 2; nStr < vstr.size(); nStr++) {
                    if (vstr[nStr].front() == '#')
                        break;
                    if (vstr[nStr] == "change=1")
                        fLabel = false;
                    if (vstr[nStr] == "reserve=1")
                        fLabel = false;
                    if (vstr[nStr].substr(0,6) == "label=") {
                        strLabel = DecodeDumpString(vstr[nStr].substr(6));
                        fLabel = true;
                    }
                }
                pwallet->WalletLogPrintf("Importing %s...\n", EncodeDestination(keyid));
                if (!pwallet->AddKeyPubKey(key, pubkey)) {
                    fGood = false;
                    continue;
                }
                pwallet->mapKeyMetadata[keyid].nCreateTime = nTime;
                if (fLabel)
                    pwallet->SetAddressBook(keyid, strLabel, "receive");
                nTimeBegin = std::min(nTimeBegin, nTime);
            } else if(IsHex(vstr[0])) {
               std::vector<unsigned char> vData(ParseHex(vstr[0]));