From 39633ecd5c18ca29cb551f701e57e8cec3e609da Mon Sep 17 00:00:00 2001 From: John Newbery Date: Mon, 4 Dec 2017 11:42:15 -0500 Subject: [rpc] split wallet and non-wallet parts of DescribeAddressVisitor --- src/rpc/misc.cpp | 89 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 26 deletions(-) diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index 3f89996e61..a1e39be64e 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -33,13 +33,62 @@ #include -#ifdef ENABLE_WALLET class DescribeAddressVisitor : public boost::static_visitor { public: - CWallet * const pwallet; + explicit DescribeAddressVisitor() {} + + UniValue operator()(const CNoDestination &dest) const { return UniValue(UniValue::VOBJ); } + + UniValue operator()(const CKeyID &keyID) const { + UniValue obj(UniValue::VOBJ); + obj.pushKV("isscript", false); + obj.pushKV("iswitness", false); + return obj; + } + + UniValue operator()(const CScriptID &scriptID) const { + UniValue obj(UniValue::VOBJ); + obj.pushKV("isscript", true); + obj.pushKV("iswitness", false); + return obj; + } + + UniValue operator()(const WitnessV0KeyHash& id) const + { + UniValue obj(UniValue::VOBJ); + obj.pushKV("isscript", false); + obj.pushKV("iswitness", true); + obj.pushKV("witness_version", 0); + obj.pushKV("witness_program", HexStr(id.begin(), id.end())); + return obj; + } + + UniValue operator()(const WitnessV0ScriptHash& id) const + { + UniValue obj(UniValue::VOBJ); + obj.pushKV("isscript", true); + obj.pushKV("iswitness", true); + obj.pushKV("witness_version", 0); + obj.pushKV("witness_program", HexStr(id.begin(), id.end())); + return obj; + } - explicit DescribeAddressVisitor(CWallet *_pwallet) : pwallet(_pwallet) {} + UniValue operator()(const WitnessUnknown& id) const + { + UniValue obj(UniValue::VOBJ); + obj.pushKV("iswitness", true); + obj.pushKV("witness_version", (int)id.version); + obj.pushKV("witness_program", HexStr(id.program, id.program + id.length)); + return obj; + } +}; + +#ifdef ENABLE_WALLET +class DescribeWalletAddressVisitor : public boost::static_visitor +{ +public: + CWallet * const pwallet; void ProcessSubScript(const CScript& subscript, UniValue& obj, bool include_addresses = false) const { @@ -54,7 +103,11 @@ public: UniValue a(UniValue::VARR); if (ExtractDestination(subscript, embedded)) { // Only when the script corresponds to an address. - UniValue subobj = boost::apply_visitor(*this, embedded); + UniValue subobj(UniValue::VOBJ); + UniValue detail = boost::apply_visitor(DescribeAddressVisitor(), embedded); + subobj.pushKVs(detail); + UniValue wallet_detail = boost::apply_visitor(*this, embedded); + subobj.pushKVs(wallet_detail); subobj.pushKV("address", EncodeDestination(embedded)); subobj.pushKV("scriptPubKey", HexStr(subscript.begin(), subscript.end())); // Always report the pubkey at the top level, so that `getnewaddress()['pubkey']` always works. @@ -81,13 +134,13 @@ public: if (include_addresses) obj.pushKV("addresses", std::move(a)); } + explicit DescribeWalletAddressVisitor(CWallet *_pwallet) : pwallet(_pwallet) {} + UniValue operator()(const CNoDestination &dest) const { return UniValue(UniValue::VOBJ); } UniValue operator()(const CKeyID &keyID) const { UniValue obj(UniValue::VOBJ); CPubKey vchPubKey; - obj.pushKV("isscript", false); - obj.pushKV("iswitness", false); if (pwallet && pwallet->GetPubKey(keyID, vchPubKey)) { obj.pushKV("pubkey", HexStr(vchPubKey)); obj.pushKV("iscompressed", vchPubKey.IsCompressed()); @@ -98,8 +151,6 @@ public: UniValue operator()(const CScriptID &scriptID) const { UniValue obj(UniValue::VOBJ); CScript subscript; - obj.pushKV("isscript", true); - obj.pushKV("iswitness", false); if (pwallet && pwallet->GetCScript(scriptID, subscript)) { ProcessSubScript(subscript, obj, true); } @@ -110,10 +161,6 @@ public: { UniValue obj(UniValue::VOBJ); CPubKey pubkey; - obj.pushKV("isscript", false); - obj.pushKV("iswitness", true); - obj.pushKV("witness_version", 0); - obj.pushKV("witness_program", HexStr(id.begin(), id.end())); if (pwallet && pwallet->GetPubKey(CKeyID(id), pubkey)) { obj.pushKV("pubkey", HexStr(pubkey)); } @@ -124,10 +171,6 @@ public: { UniValue obj(UniValue::VOBJ); CScript subscript; - obj.pushKV("isscript", true); - obj.pushKV("iswitness", true); - obj.pushKV("witness_version", 0); - obj.pushKV("witness_program", HexStr(id.begin(), id.end())); CRIPEMD160 hasher; uint160 hash; hasher.Write(id.begin(), 32).Finalize(hash.begin()); @@ -137,15 +180,7 @@ public: return obj; } - UniValue operator()(const WitnessUnknown& id) const - { - UniValue obj(UniValue::VOBJ); - CScript subscript; - obj.pushKV("iswitness", true); - obj.pushKV("witness_version", (int)id.version); - obj.pushKV("witness_program", HexStr(id.program, id.program + id.length)); - return obj; - } + UniValue operator()(const WitnessUnknown& id) const { return UniValue(UniValue::VOBJ); } }; #endif @@ -219,8 +254,10 @@ UniValue validateaddress(const JSONRPCRequest& request) isminetype mine = pwallet ? IsMine(*pwallet, dest) : ISMINE_NO; ret.pushKV("ismine", bool(mine & ISMINE_SPENDABLE)); ret.pushKV("iswatchonly", bool(mine & ISMINE_WATCH_ONLY)); - UniValue detail = boost::apply_visitor(DescribeAddressVisitor(pwallet), dest); + UniValue detail = boost::apply_visitor(DescribeAddressVisitor(), dest); ret.pushKVs(detail); + UniValue wallet_detail = boost::apply_visitor(DescribeWalletAddressVisitor(pwallet), dest); + ret.pushKVs(wallet_detail); if (pwallet && pwallet->mapAddressBook.count(dest)) { ret.pushKV("account", pwallet->mapAddressBook[dest].name); } -- cgit v1.2.3 From 1598f32304cd55b83ecc623ee0f9e30b4e087b7d Mon Sep 17 00:00:00 2001 From: John Newbery Date: Mon, 4 Dec 2017 12:49:20 -0500 Subject: [rpc] Move DescribeAddressVisitor to rpc/util --- src/Makefile.am | 1 + src/rpc/misc.cpp | 66 +++++++++++--------------------------------------------- src/rpc/util.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/rpc/util.h | 9 ++++++++ 4 files changed, 83 insertions(+), 54 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 4fbd605d9e..aa1647a63a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -215,6 +215,7 @@ libbitcoin_server_a_SOURCES = \ rpc/rawtransaction.cpp \ rpc/safemode.cpp \ rpc/server.cpp \ + rpc/util.cpp \ script/sigcache.cpp \ script/ismine.cpp \ timedata.cpp \ diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index a1e39be64e..f7d62a6326 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -33,57 +33,6 @@ #include -class DescribeAddressVisitor : public boost::static_visitor -{ -public: - explicit DescribeAddressVisitor() {} - - UniValue operator()(const CNoDestination &dest) const { return UniValue(UniValue::VOBJ); } - - UniValue operator()(const CKeyID &keyID) const { - UniValue obj(UniValue::VOBJ); - obj.pushKV("isscript", false); - obj.pushKV("iswitness", false); - return obj; - } - - UniValue operator()(const CScriptID &scriptID) const { - UniValue obj(UniValue::VOBJ); - obj.pushKV("isscript", true); - obj.pushKV("iswitness", false); - return obj; - } - - UniValue operator()(const WitnessV0KeyHash& id) const - { - UniValue obj(UniValue::VOBJ); - obj.pushKV("isscript", false); - obj.pushKV("iswitness", true); - obj.pushKV("witness_version", 0); - obj.pushKV("witness_program", HexStr(id.begin(), id.end())); - return obj; - } - - UniValue operator()(const WitnessV0ScriptHash& id) const - { - UniValue obj(UniValue::VOBJ); - obj.pushKV("isscript", true); - obj.pushKV("iswitness", true); - obj.pushKV("witness_version", 0); - obj.pushKV("witness_program", HexStr(id.begin(), id.end())); - return obj; - } - - UniValue operator()(const WitnessUnknown& id) const - { - UniValue obj(UniValue::VOBJ); - obj.pushKV("iswitness", true); - obj.pushKV("witness_version", (int)id.version); - obj.pushKV("witness_program", HexStr(id.program, id.program + id.length)); - return obj; - } -}; - #ifdef ENABLE_WALLET class DescribeWalletAddressVisitor : public boost::static_visitor { @@ -182,6 +131,15 @@ public: UniValue operator()(const WitnessUnknown& id) const { return UniValue(UniValue::VOBJ); } }; + +UniValue DescribeWalletAddress(CWallet* pwallet, const CTxDestination& dest) +{ + UniValue ret(UniValue::VOBJ); + UniValue detail = DescribeAddress(dest); + ret.pushKVs(detail); + ret.pushKVs(boost::apply_visitor(DescribeWalletAddressVisitor(pwallet), dest)); + return ret; +} #endif UniValue validateaddress(const JSONRPCRequest& request) @@ -254,10 +212,8 @@ UniValue validateaddress(const JSONRPCRequest& request) isminetype mine = pwallet ? IsMine(*pwallet, dest) : ISMINE_NO; ret.pushKV("ismine", bool(mine & ISMINE_SPENDABLE)); ret.pushKV("iswatchonly", bool(mine & ISMINE_WATCH_ONLY)); - UniValue detail = boost::apply_visitor(DescribeAddressVisitor(), dest); + UniValue detail = DescribeWalletAddress(pwallet, dest); ret.pushKVs(detail); - UniValue wallet_detail = boost::apply_visitor(DescribeWalletAddressVisitor(pwallet), dest); - ret.pushKVs(wallet_detail); if (pwallet && pwallet->mapAddressBook.count(dest)) { ret.pushKV("account", pwallet->mapAddressBook[dest].name); } @@ -284,6 +240,8 @@ UniValue validateaddress(const JSONRPCRequest& request) } } } +#else + ret.pushKvs = DescribeAddress(dest); #endif } return ret; diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp index 09ded4e46e..cdcb68d15f 100644 --- a/src/rpc/util.cpp +++ b/src/rpc/util.cpp @@ -66,3 +66,64 @@ CScript CreateMultisigRedeemscript(const int required, const std::vector +{ +public: + explicit DescribeAddressVisitor() {} + + UniValue operator()(const CNoDestination& dest) const + { + return UniValue(UniValue::VOBJ); + } + + UniValue operator()(const CKeyID& keyID) const + { + UniValue obj(UniValue::VOBJ); + obj.pushKV("isscript", false); + obj.pushKV("iswitness", false); + return obj; + } + + UniValue operator()(const CScriptID& scriptID) const + { + UniValue obj(UniValue::VOBJ); + obj.pushKV("isscript", true); + obj.pushKV("iswitness", false); + return obj; + } + + UniValue operator()(const WitnessV0KeyHash& id) const + { + UniValue obj(UniValue::VOBJ); + obj.pushKV("isscript", false); + obj.pushKV("iswitness", true); + obj.pushKV("witness_version", 0); + obj.pushKV("witness_program", HexStr(id.begin(), id.end())); + return obj; + } + + UniValue operator()(const WitnessV0ScriptHash& id) const + { + UniValue obj(UniValue::VOBJ); + obj.pushKV("isscript", true); + obj.pushKV("iswitness", true); + obj.pushKV("witness_version", 0); + obj.pushKV("witness_program", HexStr(id.begin(), id.end())); + return obj; + } + + UniValue operator()(const WitnessUnknown& id) const + { + UniValue obj(UniValue::VOBJ); + obj.pushKV("iswitness", true); + obj.pushKV("witness_version", (int)id.version); + obj.pushKV("witness_program", HexStr(id.program, id.program + id.length)); + return obj; + } +}; + +UniValue DescribeAddress(const CTxDestination& dest) +{ + return boost::apply_visitor(DescribeAddressVisitor(), dest); +} diff --git a/src/rpc/util.h b/src/rpc/util.h index 568a4260ba..5380d45a83 100644 --- a/src/rpc/util.h +++ b/src/rpc/util.h @@ -5,6 +5,13 @@ #ifndef BITCOIN_RPC_UTIL_H #define BITCOIN_RPC_UTIL_H +#include +#include