From 316cc83c46aaa79f8a474e9a741a4993cb6d7ed5 Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Fri, 9 Oct 2020 19:03:14 +0300 Subject: [PATCH] Add API to dump all private keys in JSON, add API to get address from private key --- src/rpcdump.cpp | 78 +++++++++++++++++++++++++++++++++++++++++++++++ src/rpcserver.cpp | 2 ++ src/rpcserver.h | 2 ++ 3 files changed, 82 insertions(+) diff --git a/src/rpcdump.cpp b/src/rpcdump.cpp index 56a2bc39..54078c4b 100644 --- a/src/rpcdump.cpp +++ b/src/rpcdump.cpp @@ -399,3 +399,81 @@ Value dumpwallet(const Array& params, bool fHelp) file.close(); return Value::null; } + +Value dumpwalletjson(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "dumpwallet \n" + "Dumps all wallet keys in a JSON format."); + + EnsureWalletIsUnlocked(); + + ofstream file; + file.open(params[0].get_str().c_str()); + if (!file.is_open()) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Cannot open wallet dump file"); + + std::map mapKeyBirth; + + std::set setKeyPool; + + pwalletMain->GetKeyBirthTimes(mapKeyBirth); + + pwalletMain->GetAllReserveKeys(setKeyPool); + + // sort time/key pairs + std::vector > vKeyBirth; + for (std::map::const_iterator it = mapKeyBirth.begin(); it != mapKeyBirth.end(); it++) { + vKeyBirth.push_back(std::make_pair(it->second, it->first)); + } + mapKeyBirth.clear(); + std::sort(vKeyBirth.begin(), vKeyBirth.end()); + + Object payload; + Array privateKeys; + for (std::vector >::const_iterator it = vKeyBirth.begin(); it != vKeyBirth.end(); it++) { + const CKeyID &keyid = it->second; + std::string strAddr = CDigitalNoteAddress(keyid).ToString(); + + CKey key; + if (pwalletMain->GetKey(keyid, key)) { + Object privateKeyAndAddress; + privateKeyAndAddress.push_back(Pair("privateKey", CDigitalNoteSecret(key).ToString())); + privateKeyAndAddress.push_back(Pair("address", strAddr)); + privateKeys.push_back(privateKeyAndAddress); + } + } + payload.push_back(Pair("privateKeys", privateKeys)); + file << write_string(Value(payload), true); + file.close(); + return Value::null; +} + +Value getaddressfromprivkey(const Array& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 3) + throw runtime_error( + "getaddressfromprivkey \n" + "Returns DigitalNote address from private key."); + + string strSecret = params[0].get_str(); + string strLabel = ""; + if (params.size() > 1) + strLabel = params[1].get_str(); + + CDigitalNoteSecret vchSecret; + bool fGood = vchSecret.SetString(strSecret); + + if (!fGood) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key"); + + CKey key = vchSecret.GetKey(); + CPubKey pubkey = key.GetPubKey(); + assert(key.VerifyPubKey(pubkey)); + CKeyID vchAddress = pubkey.GetID(); + + Object payload; + payload.push_back(Pair("address", CDigitalNoteAddress(vchAddress).ToString())); + return Value(payload); +} + diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 4a0aea37..e8d182c4 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -307,6 +307,8 @@ static const CRPCCommand vRPCCommands[] = { "listsinceblock", &listsinceblock, false, false, true }, { "dumpprivkey", &dumpprivkey, false, false, true }, { "dumpwallet", &dumpwallet, true, false, true }, + { "dumpwalletjson", &dumpwalletjson, true, false, true }, + { "getaddressfromprivkey", &getaddressfromprivkey, true, false, true }, { "importprivkey", &importprivkey, false, false, true }, { "importwallet", &importwallet, false, false, true }, { "importaddress", &importaddress, false, false, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index c2002c78..cba61bdd 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -114,6 +114,8 @@ extern json_spirit::Value importwallet(const json_spirit::Array& params, bool fH extern json_spirit::Value importaddress(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value dumpprivkey(const json_spirit::Array& params, bool fHelp); // in rpcdump.cpp extern json_spirit::Value importprivkey(const json_spirit::Array& params, bool fHelp); +extern json_spirit::Value dumpwalletjson(const json_spirit::Array& params, bool fHelp); +extern json_spirit::Value getaddressfromprivkey(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value sendalert(const json_spirit::Array& params, bool fHelp);