diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 08cb6b374..3d20e92f6 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -15,7 +15,9 @@ EXTRA_DIST += \ test/data/tx394b54bb.hex \ test/data/txcreate1.hex \ test/data/txcreate2.hex \ - test/data/txcreatesign.hex + test/data/txcreatesign.hex \ + test/wallet-utility.py \ + test/data/wallet.dat JSON_TEST_FILES = \ test/data/script_valid.json \ @@ -107,8 +109,7 @@ if ENABLE_WALLET BITCOIN_TESTS += \ test/accounting_tests.cpp \ wallet/test/wallet_tests.cpp \ - test/rpc_wallet_tests.cpp \ - test/walletutil_tests.cpp + test/rpc_wallet_tests.cpp endif test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES) @@ -151,8 +152,10 @@ bitcoin_test_clean : FORCE check-local: @echo "Running test/bitcoin-util-test.py..." $(AM_V_at)srcdir=$(srcdir) PYTHONPATH=$(builddir)/test $(srcdir)/test/bitcoin-util-test.py +if ENABLE_WALLET @echo "Running test/wallet-utility.py..." $(AM_V_at)srcdir=$(srcdir) PYTHONPATH=$(builddir)/test $(srcdir)/test/wallet-utility.py +endif $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C secp256k1 check $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C univalue check diff --git a/src/test/test_bitcoin.h b/src/test/test_bitcoin.h index 941f99769..9f8085853 100644 --- a/src/test/test_bitcoin.h +++ b/src/test/test_bitcoin.h @@ -38,17 +38,6 @@ struct TestingSetup: public JoinSplitTestingSetup { ~TestingSetup(); }; -/** Wallet setup that configures a complete environment. - * Included are data directory, coins database, script check threads - * and wallet with 5 unused keys. - */ -struct WalletSetup: public BasicTestingSetup { - boost::filesystem::path pathTemp; - - WalletSetup(CBaseChainParams::Network network = CBaseChainParams::MAIN); - ~WalletSetup(); -}; - class CTxMemPoolEntry; class CTxMemPool; diff --git a/src/test/wallet-utility.py b/src/test/wallet-utility.py index f583ace74..b853a227e 100755 --- a/src/test/wallet-utility.py +++ b/src/test/wallet-utility.py @@ -3,10 +3,12 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -from subprocess import check_output -import json - +import subprocess import os +import json +import sys +import buildenv +import shutil def assert_equal(thing1, thing2): if thing1 != thing2: @@ -14,13 +16,46 @@ def assert_equal(thing1, thing2): if __name__ == '__main__': datadir = os.environ["srcdir"] + "/test/data" - command = os.environ["srcdir"] + "/wallet-utility" + execprog = './wallet-utility' + buildenv.exeext + execargs = '-datadir=' + datadir + execrun = execprog + ' ' + execargs - output = json.loads(check_output([command, "-datadir=" + datadir])) + proc = subprocess.Popen(execrun, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, shell=True) + try: + outs = proc.communicate() + except OSError: + print("OSError, Failed to execute " + execprog) + sys.exit(1) - assert_equal(output[0], "13EngsxkRi7SJPPqCyJsKf34U8FoX9E9Av"); - assert_equal(output[1], "1FKCLGTpPeYBUqfNxktck8k5nqxB8sjim8"); - assert_equal(output[2], "13cdtE9tnNeXCZJ8KQ5WELgEmLSBLnr48F"); + output = json.loads(outs[0]) + assert_equal(output[0], "13EngsxkRi7SJPPqCyJsKf34U8FoX9E9Av") + assert_equal(output[1], "1FKCLGTpPeYBUqfNxktck8k5nqxB8sjim8") + assert_equal(output[2], "13cdtE9tnNeXCZJ8KQ5WELgEmLSBLnr48F") + execargs = '-datadir=' + datadir + ' -dumppass' + execrun = execprog + ' ' + execargs + proc = subprocess.Popen(execrun, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, shell=True) + try: + outs = proc.communicate() + except OSError: + print("OSError, Failed to execute " + execprog) + sys.exit(1) + + output = json.loads(outs[0]) + + assert_equal(output[0]['addr'], "13EngsxkRi7SJPPqCyJsKf34U8FoX9E9Av") + assert_equal(output[0]['pkey'], "5Jz5BWE2WQxp1hGqDZeisQFV1mRFR2AVBAgiXCbNcZyXNjD9aUd") + assert_equal(output[1]['addr'], "1FKCLGTpPeYBUqfNxktck8k5nqxB8sjim8") + assert_equal(output[1]['pkey'], "5HsX2b3v2GjngYQ5ZM4mLp2b2apw6aMNVaPELV1YmpiYR1S4jzc") + assert_equal(output[2]['addr'], "13cdtE9tnNeXCZJ8KQ5WELgEmLSBLnr48F") + assert_equal(output[2]['pkey'], "5KCWAs1wX2ESiL4PfDR8XYVSSETHFd2jaRGxt1QdanBFTit4XcH") + + if os.path.exists(datadir + '/database'): + if os.path.isdir(datadir + '/database'): + shutil.rmtree(datadir + '/database') + + if os.path.exists(datadir + '/db.log'): + os.remove(datadir + '/db.log') + sys.exit(0) diff --git a/src/test/walletutil_tests.cpp b/src/test/walletutil_tests.cpp deleted file mode 100644 index f0d14cafb..000000000 --- a/src/test/walletutil_tests.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "main.h" -#include "test/test_bitcoin.h" -#include -#include - -#ifdef ENABLE_WALLET -#include "wallet/db.h" -#include "wallet/wallet.h" -#endif - -using namespace std; - -BOOST_FIXTURE_TEST_SUITE(walletutil_tests, BasicTestingSetup) - -BOOST_AUTO_TEST_CASE(walletutil_test) -{ - /* - * addresses and private keys in test/data/wallet.dat - */ - string expected_addr = "[ \"13EngsxkRi7SJPPqCyJsKf34U8FoX9E9Av\", \"1FKCLGTpPeYBUqfNxktck8k5nqxB8sjim8\", \"13cdtE9tnNeXCZJ8KQ5WELgEmLSBLnr48F\" ]\n"; - string expected_addr_pkeys = "[ {\"addr\" : \"13EngsxkRi7SJPPqCyJsKf34U8FoX9E9Av\", \"pkey\" : \"5Jz5BWE2WQxp1hGqDZeisQFV1mRFR2AVBAgiXCbNcZyXNjD9aUd\"}, {\"addr\" : \"1FKCLGTpPeYBUqfNxktck8k5nqxB8sjim8\", \"pkey\" : \"5HsX2b3v2GjngYQ5ZM4mLp2b2apw6aMNVaPELV1YmpiYR1S4jzc\"}, {\"addr\" : \"13cdtE9tnNeXCZJ8KQ5WELgEmLSBLnr48F\", \"pkey\" : \"5KCWAs1wX2ESiL4PfDR8XYVSSETHFd2jaRGxt1QdanBFTit4XcH\"} ]\n"; - -#ifdef WIN32 - string strCmd = "wallet-utility -datadir=test/data/ > test/data/op.txt"; -#else - string strCmd = "./wallet-utility -datadir=test/data/ > test/data/op.txt"; -#endif - int ret = system(strCmd.c_str()); - BOOST_CHECK(ret == 0); - - boost::filesystem::path opPath = "test/data/op.txt"; - boost::filesystem::ifstream fIn; - fIn.open(opPath, std::ios::in); - - if (!fIn) - { - std::cerr << "Could not open the output file" << std::endl; - } - - stringstream ss_addr; - ss_addr << fIn.rdbuf(); - fIn.close(); - boost::filesystem::remove(opPath); - - string obtained = ss_addr.str(); - BOOST_CHECK_EQUAL(obtained, expected_addr); - -#ifdef WIN32 - strCmd = "wallet-utility -datadir=test/data/ -dumppass > test/data/op.txt"; -#else - strCmd = "./wallet-utility -datadir=test/data/ -dumppass > test/data/op.txt"; -#endif - - ret = system(strCmd.c_str()); - BOOST_CHECK(ret == 0); - - fIn.open(opPath, std::ios::in); - - if (!fIn) - { - std::cerr << "Could not open the output file" << std::endl; - } - - stringstream ss_addr_pkeys; - ss_addr_pkeys << fIn.rdbuf(); - fIn.close(); - boost::filesystem::remove(opPath); - - obtained = ss_addr_pkeys.str(); - BOOST_CHECK_EQUAL(obtained, expected_addr_pkeys); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/src/wallet-utility.cpp b/src/wallet-utility.cpp index 79875cab4..87335f4e3 100644 --- a/src/wallet-utility.cpp +++ b/src/wallet-utility.cpp @@ -11,49 +11,49 @@ void show_help() { - std::cout << - "This program outputs Bitcoin addresses and private keys from a wallet.dat file" << std::endl - << std::endl - << "Usage and options: " - << std::endl - << " -datadir= to tell the program where your wallet is" - << std::endl - << " -wallet= (Optional) if your wallet is not named wallet.dat" - << std::endl - << " -regtest or -testnet (Optional) dumps addresses from regtest/testnet" - << std::endl - << " -dumppass (Optional)if you want to extract private keys associated with addresses" - << std::endl - << " -pass= if you have encrypted private keys stored in your wallet" - << std::endl; + std::cout << + "This program outputs Bitcoin addresses and private keys from a wallet.dat file" << std::endl + << std::endl + << "Usage and options: " + << std::endl + << " -datadir= to tell the program where your wallet is" + << std::endl + << " -wallet= (Optional) if your wallet is not named wallet.dat" + << std::endl + << " -regtest or -testnet (Optional) dumps addresses from regtest/testnet" + << std::endl + << " -dumppass (Optional)if you want to extract private keys associated with addresses" + << std::endl + << " -pass= if you have encrypted private keys stored in your wallet" + << std::endl; } class WalletUtilityDB : public CDB { - private: - typedef std::map MasterKeyMap; - MasterKeyMap mapMasterKeys; - unsigned int nMasterKeyMaxID; - SecureString mPass; - std::vector vMKeys; + private: + typedef std::map MasterKeyMap; + MasterKeyMap mapMasterKeys; + unsigned int nMasterKeyMaxID; + SecureString mPass; + std::vector vMKeys; - public: - WalletUtilityDB(const std::string& strFilename, const char* pszMode = "r+", bool fFlushOnClose = true) : CDB(strFilename, pszMode, fFlushOnClose) - { - nMasterKeyMaxID = 0; - mPass.reserve(100); - } + public: + WalletUtilityDB(const std::string& strFilename, const char* pszMode = "r+", bool fFlushOnClose = true) : CDB(strFilename, pszMode, fFlushOnClose) + { + nMasterKeyMaxID = 0; + mPass.reserve(100); + } - std::string getAddress(CDataStream ssKey); - std::string getKey(CDataStream ssKey, CDataStream ssValue); - std::string getCryptedKey(CDataStream ssKey, CDataStream ssValue, std::string masterPass); - bool updateMasterKeys(CDataStream ssKey, CDataStream ssValue); - bool parseKeys(bool dumppriv, std::string masterPass); + std::string getAddress(CDataStream ssKey); + std::string getKey(CDataStream ssKey, CDataStream ssValue); + std::string getCryptedKey(CDataStream ssKey, CDataStream ssValue, std::string masterPass); + bool updateMasterKeys(CDataStream ssKey, CDataStream ssValue); + bool parseKeys(bool dumppriv, std::string masterPass); - bool DecryptSecret(const std::vector& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext); - bool Unlock(); - bool DecryptKey(const std::vector& vchCryptedSecret, const CPubKey& vchPubKey, CKey& key); + bool DecryptSecret(const std::vector& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext); + bool Unlock(); + bool DecryptKey(const std::vector& vchCryptedSecret, const CPubKey& vchPubKey, CKey& key); }; @@ -62,12 +62,12 @@ class WalletUtilityDB : public CDB */ std::string WalletUtilityDB::getAddress(CDataStream ssKey) { - CPubKey vchPubKey; - ssKey >> vchPubKey; - CKeyID id = vchPubKey.GetID(); - std::string strAddr = CBitcoinAddress(id).ToString(); + CPubKey vchPubKey; + ssKey >> vchPubKey; + CKeyID id = vchPubKey.GetID(); + std::string strAddr = CBitcoinAddress(id).ToString(); - return strAddr; + return strAddr; } @@ -76,65 +76,65 @@ std::string WalletUtilityDB::getAddress(CDataStream ssKey) */ std::string WalletUtilityDB::getKey(CDataStream ssKey, CDataStream ssValue) { - std::string strKey; - CPubKey vchPubKey; - ssKey >> vchPubKey; - CPrivKey pkey; - CKey key; + std::string strKey; + CPubKey vchPubKey; + ssKey >> vchPubKey; + CPrivKey pkey; + CKey key; - ssValue >> pkey; - if (key.Load(pkey, vchPubKey, true)) - strKey = CBitcoinSecret(key).ToString(); + ssValue >> pkey; + if (key.Load(pkey, vchPubKey, true)) + strKey = CBitcoinSecret(key).ToString(); - return strKey; + return strKey; } bool WalletUtilityDB::DecryptSecret(const std::vector& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext) { - CCrypter cKeyCrypter; - std::vector chIV(WALLET_CRYPTO_KEY_SIZE); - memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE); + CCrypter cKeyCrypter; + std::vector chIV(WALLET_CRYPTO_KEY_SIZE); + memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE); - BOOST_FOREACH(const CKeyingMaterial vMKey, vMKeys) - { - if(!cKeyCrypter.SetKey(vMKey, chIV)) - continue; - if (cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext))) - return true; - } - return false; + BOOST_FOREACH(const CKeyingMaterial vMKey, vMKeys) + { + if(!cKeyCrypter.SetKey(vMKey, chIV)) + continue; + if (cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext))) + return true; + } + return false; } bool WalletUtilityDB::Unlock() { - CCrypter crypter; - CKeyingMaterial vMasterKey; + CCrypter crypter; + CKeyingMaterial vMasterKey; - BOOST_FOREACH(const MasterKeyMap::value_type& pMasterKey, mapMasterKeys) - { - if(!crypter.SetKeyFromPassphrase(mPass, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod)) - return false; - if (!crypter.Decrypt(pMasterKey.second.vchCryptedKey, vMasterKey)) - continue; // try another master key - vMKeys.push_back(vMasterKey); - } - return true; + BOOST_FOREACH(const MasterKeyMap::value_type& pMasterKey, mapMasterKeys) + { + if(!crypter.SetKeyFromPassphrase(mPass, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod)) + return false; + if (!crypter.Decrypt(pMasterKey.second.vchCryptedKey, vMasterKey)) + continue; // try another master key + vMKeys.push_back(vMasterKey); + } + return true; } bool WalletUtilityDB::DecryptKey(const std::vector& vchCryptedSecret, const CPubKey& vchPubKey, CKey& key) { - CKeyingMaterial vchSecret; - if(!DecryptSecret(vchCryptedSecret, vchPubKey.GetHash(), vchSecret)) - return false; + CKeyingMaterial vchSecret; + if(!DecryptSecret(vchCryptedSecret, vchPubKey.GetHash(), vchSecret)) + return false; - if (vchSecret.size() != 32) - return false; + if (vchSecret.size() != 32) + return false; - key.Set(vchSecret.begin(), vchSecret.end(), vchPubKey.IsCompressed()); - return true; + key.Set(vchSecret.begin(), vchSecret.end(), vchPubKey.IsCompressed()); + return true; } @@ -143,22 +143,22 @@ bool WalletUtilityDB::DecryptKey(const std::vector& vchCryptedSec */ std::string WalletUtilityDB::getCryptedKey(CDataStream ssKey, CDataStream ssValue, std::string masterPass) { - mPass = masterPass.c_str(); - CPubKey vchPubKey; - ssKey >> vchPubKey; - CKey key; + mPass = masterPass.c_str(); + CPubKey vchPubKey; + ssKey >> vchPubKey; + CKey key; - std::vector vKey; - ssValue >> vKey; + std::vector vKey; + ssValue >> vKey; - if (!Unlock()) - return ""; + if (!Unlock()) + return ""; - if(!DecryptKey(vKey, vchPubKey, key)) - return ""; + if(!DecryptKey(vKey, vchPubKey, key)) + return ""; - std::string strKey = CBitcoinSecret(key).ToString(); - return strKey; + std::string strKey = CBitcoinSecret(key).ToString(); + return strKey; } @@ -167,21 +167,21 @@ std::string WalletUtilityDB::getCryptedKey(CDataStream ssKey, CDataStream ssValu */ bool WalletUtilityDB::updateMasterKeys(CDataStream ssKey, CDataStream ssValue) { - unsigned int nID; - ssKey >> nID; - CMasterKey kMasterKey; - ssValue >> kMasterKey; - if (mapMasterKeys.count(nID) != 0) - { - std::cout << "Error reading wallet database: duplicate CMasterKey id " << nID << std::endl; - return false; - } - mapMasterKeys[nID] = kMasterKey; + unsigned int nID; + ssKey >> nID; + CMasterKey kMasterKey; + ssValue >> kMasterKey; + if (mapMasterKeys.count(nID) != 0) + { + std::cout << "Error reading wallet database: duplicate CMasterKey id " << nID << std::endl; + return false; + } + mapMasterKeys[nID] = kMasterKey; - if (nMasterKeyMaxID < nID) - nMasterKeyMaxID = nID; + if (nMasterKeyMaxID < nID) + nMasterKeyMaxID = nID; - return true; + return true; } @@ -190,150 +190,150 @@ bool WalletUtilityDB::updateMasterKeys(CDataStream ssKey, CDataStream ssValue) */ bool WalletUtilityDB::parseKeys(bool dumppriv, std::string masterPass) { - DBErrors result = DB_LOAD_OK; - std::string strType; - bool first = true; + DBErrors result = DB_LOAD_OK; + std::string strType; + bool first = true; - try { - Dbc* pcursor = GetCursor(); - if (!pcursor) - { - LogPrintf("Error getting wallet database cursor\n"); - result = DB_CORRUPT; - } + try { + Dbc* pcursor = GetCursor(); + if (!pcursor) + { + LogPrintf("Error getting wallet database cursor\n"); + result = DB_CORRUPT; + } - if (dumppriv) - { - while (result == DB_LOAD_OK && true) - { - CDataStream ssKey(SER_DISK, CLIENT_VERSION); - CDataStream ssValue(SER_DISK, CLIENT_VERSION); - int result = ReadAtCursor(pcursor, ssKey, ssValue); + if (dumppriv) + { + while (result == DB_LOAD_OK && true) + { + CDataStream ssKey(SER_DISK, CLIENT_VERSION); + CDataStream ssValue(SER_DISK, CLIENT_VERSION); + int result = ReadAtCursor(pcursor, ssKey, ssValue); - if (result == DB_NOTFOUND) { - break; - } - else if (result != 0) - { - LogPrintf("Error reading next record from wallet database\n"); - result = DB_CORRUPT; - break; - } + if (result == DB_NOTFOUND) { + break; + } + else if (result != 0) + { + LogPrintf("Error reading next record from wallet database\n"); + result = DB_CORRUPT; + break; + } - ssKey >> strType; - if (strType == "mkey") - { - updateMasterKeys(ssKey, ssValue); - } - } - pcursor->close(); - pcursor = GetCursor(); - } + ssKey >> strType; + if (strType == "mkey") + { + updateMasterKeys(ssKey, ssValue); + } + } + pcursor->close(); + pcursor = GetCursor(); + } - while (result == DB_LOAD_OK && true) - { - CDataStream ssKey(SER_DISK, CLIENT_VERSION); - CDataStream ssValue(SER_DISK, CLIENT_VERSION); - int ret = ReadAtCursor(pcursor, ssKey, ssValue); + while (result == DB_LOAD_OK && true) + { + CDataStream ssKey(SER_DISK, CLIENT_VERSION); + CDataStream ssValue(SER_DISK, CLIENT_VERSION); + int ret = ReadAtCursor(pcursor, ssKey, ssValue); - if (ret == DB_NOTFOUND) - { - std::cout << " ]" << std::endl; - first = true; - break; - } - else if (ret != DB_LOAD_OK) - { - LogPrintf("Error reading next record from wallet database\n"); - result = DB_CORRUPT; - break; - } + if (ret == DB_NOTFOUND) + { + std::cout << " ]" << std::endl; + first = true; + break; + } + else if (ret != DB_LOAD_OK) + { + LogPrintf("Error reading next record from wallet database\n"); + result = DB_CORRUPT; + break; + } - ssKey >> strType; + ssKey >> strType; - if (strType == "key" || strType == "ckey") - { - std::string strAddr = getAddress(ssKey); - std::string strKey = ""; + if (strType == "key" || strType == "ckey") + { + std::string strAddr = getAddress(ssKey); + std::string strKey = ""; - if (dumppriv && strType == "key") - strKey = getKey(ssKey, ssValue); - if (dumppriv && strType == "ckey") - { - if (masterPass == "") - { - std::cout << "Encrypted wallet, please provide a password. See help below" << std::endl; - show_help(); - result = DB_LOAD_FAIL; - break; - } - strKey = getCryptedKey(ssKey, ssValue, masterPass); - } + if (dumppriv && strType == "key") + strKey = getKey(ssKey, ssValue); + if (dumppriv && strType == "ckey") + { + if (masterPass == "") + { + std::cout << "Encrypted wallet, please provide a password. See help below" << std::endl; + show_help(); + result = DB_LOAD_FAIL; + break; + } + strKey = getCryptedKey(ssKey, ssValue, masterPass); + } - if (strAddr != "") - { - if (first) - std::cout << "[ "; - else - std::cout << ", "; - } + if (strAddr != "") + { + if (first) + std::cout << "[ "; + else + std::cout << ", "; + } - if (dumppriv) - { - std::cout << "{\"addr\" : \"" + strAddr + "\", " - << "\"pkey\" : \"" + strKey + "\"}" - << std::flush; - } - else - { - std::cout << "\"" + strAddr + "\""; - } + if (dumppriv) + { + std::cout << "{\"addr\" : \"" + strAddr + "\", " + << "\"pkey\" : \"" + strKey + "\"}" + << std::flush; + } + else + { + std::cout << "\"" + strAddr + "\""; + } - first = false; - } - } + first = false; + } + } - pcursor->close(); - } catch (DbException &e) { - std::cout << "DBException caught " << e.get_errno() << std::endl; - } catch (std::exception &e) { - std::cout << "Exception caught " << std::endl; - } + pcursor->close(); + } catch (DbException &e) { + std::cout << "DBException caught " << e.get_errno() << std::endl; + } catch (std::exception &e) { + std::cout << "Exception caught " << std::endl; + } - if (result == DB_LOAD_OK) - return true; - else - return false; + if (result == DB_LOAD_OK) + return true; + else + return false; } int main(int argc, char* argv[]) { - ParseParameters(argc, argv); - std::string walletFile = GetArg("-wallet", "wallet.dat"); - std::string masterPass = GetArg("-pass", ""); - bool fDumpPass = GetBoolArg("-dumppass", false); - bool help = GetBoolArg("-h", false); - bool result = false; + ParseParameters(argc, argv); + std::string walletFile = GetArg("-wallet", "wallet.dat"); + std::string masterPass = GetArg("-pass", ""); + bool fDumpPass = GetBoolArg("-dumppass", false); + bool help = GetBoolArg("-h", false); + bool result = false; - if (help) - { - show_help(); - return 0; - } + if (help) + { + show_help(); + return 0; + } - try { - SelectParamsFromCommandLine(); - result = WalletUtilityDB(walletFile, "r").parseKeys(fDumpPass, masterPass); - } - catch (const std::exception& e) { - std::cout << "Error opening wallet file " << walletFile << std::endl; - std::cout << e.what() << std::endl; - } + try { + SelectParamsFromCommandLine(); + result = WalletUtilityDB(walletFile, "r").parseKeys(fDumpPass, masterPass); + } + catch (const std::exception& e) { + std::cout << "Error opening wallet file " << walletFile << std::endl; + std::cout << e.what() << std::endl; + } - if (result) - return 0; - else - return -1; + if (result) + return 0; + else + return -1; }