Skip to content

Commit

Permalink
[rpc] Remove the addresses field from the getaddressinfo return object
Browse files Browse the repository at this point in the history
The "addresses" field was confusing because it refered to public keys
using their P2PKH address.  It was included in the return object when
needed for backward compatibility. Remove that compatibility now that
the -deprecatedrpc=validateaddress option has been removed.

New applications should use the 'embedded'->'address' field for P2SH or
P2WSH wrapped addresses, and 'pubkeys' for inspecting multisig
participants.
  • Loading branch information
jnewbery committed Apr 11, 2019
1 parent 0e9cb2d commit b4338c1
Showing 1 changed file with 2 additions and 11 deletions.
13 changes: 2 additions & 11 deletions src/wallet/rpcwallet.cpp
Expand Up @@ -3408,7 +3408,7 @@ class DescribeWalletAddressVisitor : public boost::static_visitor<UniValue>
public:
CWallet * const pwallet;

void ProcessSubScript(const CScript& subscript, UniValue& obj, bool include_addresses = false) const
void ProcessSubScript(const CScript& subscript, UniValue& obj) const
{
// Always present: script type and redeemscript
std::vector<std::vector<unsigned char>> solutions_data;
Expand All @@ -3417,7 +3417,6 @@ class DescribeWalletAddressVisitor : public boost::static_visitor<UniValue>
obj.pushKV("hex", HexStr(subscript.begin(), subscript.end()));

CTxDestination embedded;
UniValue a(UniValue::VARR);
if (ExtractDestination(subscript, embedded)) {
// Only when the script corresponds to an address.
UniValue subobj(UniValue::VOBJ);
Expand All @@ -3430,25 +3429,17 @@ class DescribeWalletAddressVisitor : public boost::static_visitor<UniValue>
// Always report the pubkey at the top level, so that `getnewaddress()['pubkey']` always works.
if (subobj.exists("pubkey")) obj.pushKV("pubkey", subobj["pubkey"]);
obj.pushKV("embedded", std::move(subobj));
if (include_addresses) a.push_back(EncodeDestination(embedded));
} else if (which_type == TX_MULTISIG) {
// Also report some information on multisig scripts (which do not have a corresponding address).
// TODO: abstract out the common functionality between this logic and ExtractDestinations.
obj.pushKV("sigsrequired", solutions_data[0][0]);
UniValue pubkeys(UniValue::VARR);
for (size_t i = 1; i < solutions_data.size() - 1; ++i) {
CPubKey key(solutions_data[i].begin(), solutions_data[i].end());
if (include_addresses) a.push_back(EncodeDestination(key.GetID()));
pubkeys.push_back(HexStr(key.begin(), key.end()));
}
obj.pushKV("pubkeys", std::move(pubkeys));
}

// The "addresses" field is confusing because it refers to public keys using their P2PKH address.
// For that reason, only add the 'addresses' field when needed for backward compatibility. New applications
// can use the 'embedded'->'address' field for P2SH or P2WSH wrapped addresses, and 'pubkeys' for
// inspecting multisig participants.
if (include_addresses) obj.pushKV("addresses", std::move(a));
}

explicit DescribeWalletAddressVisitor(CWallet* _pwallet) : pwallet(_pwallet) {}
Expand All @@ -3471,7 +3462,7 @@ class DescribeWalletAddressVisitor : public boost::static_visitor<UniValue>
UniValue obj(UniValue::VOBJ);
CScript subscript;
if (pwallet && pwallet->GetCScript(scriptID, subscript)) {
ProcessSubScript(subscript, obj, pwallet->chain().rpcEnableDeprecated("validateaddress"));
ProcessSubScript(subscript, obj);
}
return obj;
}
Expand Down

0 comments on commit b4338c1

Please sign in to comment.