aboutsummaryrefslogtreecommitdiff
path: root/src/rpcdump.cpp
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2011-07-13 11:56:38 +0200
committerPieter Wuille <sipa@ulyssis.org>2011-12-17 21:49:48 +0100
commit95d888a6d1f659a5cb81124e0d97966b9de1f139 (patch)
treedb17f76d0517ddbf12fd9144948816e930439eef /src/rpcdump.cpp
parent30ab2c9c46ce38197017ce6a6e13869617e692c7 (diff)
downloadbitcoin-95d888a6d1f659a5cb81124e0d97966b9de1f139.tar.xz
Key import and export
Introduces two new RPC calls: * dumpprivkey: retrieve the private key corresponding to an address * importprivkey: add a private key to your wallet The private key format is analoguous to the address format. It is a 51-character base58-encoded string, that includes a version number and a checksum. Includes patch by mhanne: * add optional account parameter for importprivkey, if omitted use default
Diffstat (limited to 'src/rpcdump.cpp')
-rw-r--r--src/rpcdump.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/rpcdump.cpp b/src/rpcdump.cpp
new file mode 100644
index 0000000000..f3978fbce8
--- /dev/null
+++ b/src/rpcdump.cpp
@@ -0,0 +1,101 @@
+// Copyright (c) 2011 Bitcoin Developers
+// Distributed under the MIT/X11 software license, see the accompanying
+// file license.txt or http://www.opensource.org/licenses/mit-license.php.
+
+#include "headers.h"
+#include "init.h" // for pwalletMain
+#include "bitcoinrpc.h"
+
+// #include <boost/asio.hpp>
+// #include <boost/iostreams/concepts.hpp>
+// #include <boost/iostreams/stream.hpp>
+#include <boost/lexical_cast.hpp>
+// #ifdef USE_SSL
+// #include <boost/asio/ssl.hpp>
+// typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SSLStream;
+// #endif
+// #include <boost/xpressive/xpressive_dynamic.hpp>
+#include "json/json_spirit_reader_template.h"
+#include "json/json_spirit_writer_template.h"
+#include "json/json_spirit_utils.h"
+
+#define printf OutputDebugStringF
+
+// using namespace boost::asio;
+using namespace json_spirit;
+using namespace std;
+
+extern Object JSONRPCError(int code, const string& message);
+
+class CTxDump
+{
+public:
+ CBlockIndex *pindex;
+ int64 nValue;
+ bool fSpent;
+ CWalletTx* ptx;
+ int nOut;
+ CTxDump(CWalletTx* ptx = NULL, int nOut = -1)
+ {
+ pindex = NULL;
+ nValue = 0;
+ fSpent = false;
+ this->ptx = ptx;
+ this->nOut = nOut;
+ }
+};
+
+Value importprivkey(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() < 1 || params.size() > 2)
+ throw runtime_error(
+ "importprivkey <bitcoinprivkey> [label]\n"
+ "Adds a private key (as returned by dumpprivkey) to your wallet.");
+
+ string strSecret = params[0].get_str();
+ string strLabel = "";
+ if (params.size() > 1)
+ strLabel = params[1].get_str();
+ CBitcoinSecret vchSecret;
+ bool fGood = vchSecret.SetString(strSecret);
+
+ if (!fGood) throw JSONRPCError(-5,"Invalid private key");
+
+ CKey key;
+ key.SetSecret(vchSecret.GetSecret());
+ CBitcoinAddress vchAddress = CBitcoinAddress(key.GetPubKey());
+
+ CRITICAL_BLOCK(cs_main)
+ CRITICAL_BLOCK(pwalletMain->cs_wallet)
+ {
+ pwalletMain->MarkDirty();
+ pwalletMain->SetAddressBookName(vchAddress, strLabel);
+
+ if (!pwalletMain->AddKey(key))
+ throw JSONRPCError(-4,"Error adding key to wallet");
+
+ pwalletMain->ScanForWalletTransactions(pindexGenesisBlock, true);
+ pwalletMain->ReacceptWalletTransactions();
+ }
+
+ MainFrameRepaint();
+
+ return Value::null;
+}
+
+Value dumpprivkey(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() != 1)
+ throw runtime_error(
+ "dumpprivkey <bitcoinaddress>\n"
+ "Reveals the private key corresponding to <bitcoinaddress>.");
+
+ string strAddress = params[0].get_str();
+ CBitcoinAddress address;
+ if (!address.SetString(strAddress))
+ throw JSONRPCError(-5, "Invalid bitcoin address");
+ CSecret vchSecret;
+ if (!pwalletMain->GetSecret(address, vchSecret))
+ throw JSONRPCError(-4,"Private key for address " + strAddress + " is not known");
+ return CBitcoinSecret(vchSecret).ToString();
+}