Closes #1746. Add rpc call z_validateaddress to validate zaddrs.
This commit is contained in:
parent
1feaefac51
commit
4e16a7249c
|
@ -29,7 +29,7 @@ Optional parameters are denoted in [square brackets].
|
||||||
RPC calls by category:
|
RPC calls by category:
|
||||||
|
|
||||||
* Accounting: z_getbalance, z_gettotalbalance
|
* Accounting: z_getbalance, z_gettotalbalance
|
||||||
* Addresses : z_getnewaddress, z_listaddresses
|
* Addresses : z_getnewaddress, z_listaddresses, z_validateaddress
|
||||||
* Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet
|
* Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet
|
||||||
* Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids
|
* Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids
|
||||||
* Payment : z_listreceivedbyaddress, z_sendmany
|
* Payment : z_listreceivedbyaddress, z_sendmany
|
||||||
|
@ -55,6 +55,7 @@ Command | Parameters | Description
|
||||||
--- | --- | ---
|
--- | --- | ---
|
||||||
z_getnewaddress | | Return a new zaddr for sending and receiving payments. The spending key for this zaddr will be added to the node’s wallet.<br><br>Output:<br>zN68D8hSs3...
|
z_getnewaddress | | Return a new zaddr for sending and receiving payments. The spending key for this zaddr will be added to the node’s wallet.<br><br>Output:<br>zN68D8hSs3...
|
||||||
z_listaddresses | | Returns a list of all the zaddrs in this node’s wallet for which you have a spending key.<br><br>Output:<br>{ [“z123…”, “z456...”, “z789...”] }
|
z_listaddresses | | Returns a list of all the zaddrs in this node’s wallet for which you have a spending key.<br><br>Output:<br>{ [“z123…”, “z456...”, “z789...”] }
|
||||||
|
z_validateaddress | | Return information about a given zaddr.<br><br>Output:<br>{"isvalid" : true,<br>"address" : "zcWsmq...",<br>"payingkey" : "f5bb3c...",<br>"transmissionkey" : "7a58c7...",<br>"ismine" : true}
|
||||||
|
|
||||||
### Key Management
|
### Key Management
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#include "json/json_spirit_utils.h"
|
#include "json/json_spirit_utils.h"
|
||||||
#include "json/json_spirit_value.h"
|
#include "json/json_spirit_value.h"
|
||||||
|
|
||||||
|
#include "zcash/Address.hpp"
|
||||||
|
|
||||||
using namespace json_spirit;
|
using namespace json_spirit;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -213,6 +215,69 @@ Value validateaddress(const Array& params, bool fHelp)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Value z_validateaddress(const Array& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 1)
|
||||||
|
throw runtime_error(
|
||||||
|
"z_validateaddress \"zaddr\"\n"
|
||||||
|
"\nReturn information about the given z address.\n"
|
||||||
|
"\nArguments:\n"
|
||||||
|
"1. \"zaddr\" (string, required) The z address to validate\n"
|
||||||
|
"\nResult:\n"
|
||||||
|
"{\n"
|
||||||
|
" \"isvalid\" : true|false, (boolean) If the address is valid or not. If not, this is the only property returned.\n"
|
||||||
|
" \"address\" : \"zaddr\", (string) The z address validated\n"
|
||||||
|
" \"ismine\" : true|false, (boolean) If the address is yours or not\n"
|
||||||
|
" \"payingkey\" : \"hex\", (string) The hex value of the paying key, a_pk\n"
|
||||||
|
" \"transmissionkey\" : \"hex\", (string) The hex value of the transmission key, pk_enc\n"
|
||||||
|
|
||||||
|
"}\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
+ HelpExampleCli("validateaddress", "\"zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL\"")
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ENABLE_WALLET
|
||||||
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
|
#else
|
||||||
|
LOCK(cs_main);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool isValid = false;
|
||||||
|
bool isMine = false;
|
||||||
|
std::string payingKey, transmissionKey;
|
||||||
|
|
||||||
|
string strAddress = params[0].get_str();
|
||||||
|
try {
|
||||||
|
CZCPaymentAddress address(strAddress);
|
||||||
|
libzcash::PaymentAddress addr = address.Get();
|
||||||
|
|
||||||
|
#ifdef ENABLE_WALLET
|
||||||
|
isMine = pwalletMain->HaveSpendingKey(addr);
|
||||||
|
#endif
|
||||||
|
payingKey = addr.a_pk.GetHex();
|
||||||
|
transmissionKey = addr.pk_enc.GetHex();
|
||||||
|
isValid = true;
|
||||||
|
} catch (std::runtime_error e) {
|
||||||
|
// address is invalid, nop here as isValid is false.
|
||||||
|
}
|
||||||
|
|
||||||
|
Object ret;
|
||||||
|
ret.push_back(Pair("isvalid", isValid));
|
||||||
|
if (isValid)
|
||||||
|
{
|
||||||
|
ret.push_back(Pair("address", strAddress));
|
||||||
|
ret.push_back(Pair("payingkey", payingKey));
|
||||||
|
ret.push_back(Pair("transmissionkey", transmissionKey));
|
||||||
|
#ifdef ENABLE_WALLET
|
||||||
|
ret.push_back(Pair("ismine", isMine));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used by addmultisigaddress / createmultisig:
|
* Used by addmultisigaddress / createmultisig:
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -330,6 +330,7 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "util", "verifymessage", &verifymessage, true },
|
{ "util", "verifymessage", &verifymessage, true },
|
||||||
{ "util", "estimatefee", &estimatefee, true },
|
{ "util", "estimatefee", &estimatefee, true },
|
||||||
{ "util", "estimatepriority", &estimatepriority, true },
|
{ "util", "estimatepriority", &estimatepriority, true },
|
||||||
|
{ "util", "z_validateaddress", &z_validateaddress, true }, /* uses wallet if enabled */
|
||||||
|
|
||||||
/* Not shown in help */
|
/* Not shown in help */
|
||||||
{ "hidden", "invalidateblock", &invalidateblock, true },
|
{ "hidden", "invalidateblock", &invalidateblock, true },
|
||||||
|
|
|
@ -263,6 +263,7 @@ extern json_spirit::Value z_sendmany(const json_spirit::Array& params, bool fHel
|
||||||
extern json_spirit::Value z_getoperationstatus(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
|
extern json_spirit::Value z_getoperationstatus(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
|
||||||
extern json_spirit::Value z_getoperationresult(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
|
extern json_spirit::Value z_getoperationresult(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
|
||||||
extern json_spirit::Value z_listoperationids(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
|
extern json_spirit::Value z_listoperationids(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
|
||||||
|
extern json_spirit::Value z_validateaddress(const json_spirit::Array& params, bool fHelp); // in rpcmisc.cpp
|
||||||
|
|
||||||
|
|
||||||
// in rest.cpp
|
// in rest.cpp
|
||||||
|
|
|
@ -295,13 +295,59 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_getbalance)
|
||||||
BOOST_CHECK_THROW(CallRPC("z_listreceivedbyaddress tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), runtime_error);
|
BOOST_CHECK_THROW(CallRPC("z_listreceivedbyaddress tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), runtime_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test covers RPC command z_validateaddress
|
||||||
|
*/
|
||||||
|
BOOST_AUTO_TEST_CASE(rpc_wallet_z_validateaddress)
|
||||||
|
{
|
||||||
|
SelectParams(CBaseChainParams::MAIN);
|
||||||
|
|
||||||
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
|
|
||||||
|
Value retValue;
|
||||||
|
|
||||||
|
// Check number of args
|
||||||
|
BOOST_CHECK_THROW(CallRPC("z_validateaddress"), runtime_error);
|
||||||
|
BOOST_CHECK_THROW(CallRPC("z_validateaddress toomany args"), runtime_error);
|
||||||
|
|
||||||
|
// Wallet should be empty
|
||||||
|
std::set<libzcash::PaymentAddress> addrs;
|
||||||
|
pwalletMain->GetPaymentAddresses(addrs);
|
||||||
|
BOOST_CHECK(addrs.size()==0);
|
||||||
|
|
||||||
|
// This address is not valid, it belongs to another network
|
||||||
|
BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress ztaaga95QAPyp1kSQ1hD2kguCpzyMHjxWZqaYDEkzbvo7uYQYAw2S8X4Kx98AvhhofMtQL8PAXKHuZsmhRcanavKRKmdCzk"));
|
||||||
|
Object resultObj = retValue.get_obj();
|
||||||
|
bool b = find_value(resultObj, "isvalid").get_bool();
|
||||||
|
BOOST_CHECK_EQUAL(b, false);
|
||||||
|
|
||||||
|
// This address is valid, but the spending key is not in this wallet
|
||||||
|
BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress zcfA19SDAKRYHLoRDoShcoz4nPohqWxuHcqg8WAxsiB2jFrrs6k7oSvst3UZvMYqpMNSRBkxBsnyjjngX5L55FxMzLKach8"));
|
||||||
|
resultObj = retValue.get_obj();
|
||||||
|
b = find_value(resultObj, "isvalid").get_bool();
|
||||||
|
BOOST_CHECK_EQUAL(b, true);
|
||||||
|
b = find_value(resultObj, "ismine").get_bool();
|
||||||
|
BOOST_CHECK_EQUAL(b, false);
|
||||||
|
|
||||||
|
// Let's import a spending key to the wallet and validate its payment address
|
||||||
|
BOOST_CHECK_NO_THROW(CallRPC("z_importkey SKxoWv77WGwFnUJitQKNEcD636bL4X5Gd6wWmgaA4Q9x8jZBPJXT"));
|
||||||
|
BOOST_CHECK_NO_THROW(retValue = CallRPC("z_validateaddress zcWsmqT4X2V4jgxbgiCzyrAfRT1vi1F4sn7M5Pkh66izzw8Uk7LBGAH3DtcSMJeUb2pi3W4SQF8LMKkU2cUuVP68yAGcomL"));
|
||||||
|
resultObj = retValue.get_obj();
|
||||||
|
b = find_value(resultObj, "isvalid").get_bool();
|
||||||
|
BOOST_CHECK_EQUAL(b, true);
|
||||||
|
b = find_value(resultObj, "ismine").get_bool();
|
||||||
|
BOOST_CHECK_EQUAL(b, true);
|
||||||
|
BOOST_CHECK_EQUAL(find_value(resultObj, "payingkey").get_str(), "f5bb3c888ccc9831e3f6ba06e7528e26a312eec3acc1823be8918b6a3a5e20ad");
|
||||||
|
BOOST_CHECK_EQUAL(find_value(resultObj, "transmissionkey").get_str(), "7a58c7132446564e6b810cf895c20537b3528357dc00150a8e201f491efa9c1a");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This test covers RPC command z_exportwallet
|
* This test covers RPC command z_exportwallet
|
||||||
*/
|
*/
|
||||||
BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet)
|
BOOST_AUTO_TEST_CASE(rpc_wallet_z_exportwallet)
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
|
|
||||||
// wallet should be empty
|
// wallet should be empty
|
||||||
std::set<libzcash::PaymentAddress> addrs;
|
std::set<libzcash::PaymentAddress> addrs;
|
||||||
pwalletMain->GetPaymentAddresses(addrs);
|
pwalletMain->GetPaymentAddresses(addrs);
|
||||||
|
|
Loading…
Reference in New Issue