diff --git a/src/db.cpp b/src/db.cpp
index 6692db239f..9c8c9c4f73 100644
--- a/src/db.cpp
+++ b/src/db.cpp
@@ -528,7 +528,7 @@ bool CAddrDB::LoadAddresses()
char psz[1000];
while (fgets(psz, sizeof(psz), filein))
{
- CAddress addr(psz, NODE_NETWORK);
+ CAddress addr(psz, false, NODE_NETWORK);
addr.nTime = 0; // so it won't relay unless successfully connected
if (addr.IsValid())
AddAddress(addr);
diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp
index 7f4bebb3fb..625b8e3f5e 100644
--- a/src/qt/transactiondesc.cpp
+++ b/src/qt/transactiondesc.cpp
@@ -211,7 +211,7 @@ string TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx)
{
// Offline transaction
CBitcoinAddress address;
- if (ExtractAddress(txout.scriptPubKey, wallet, address))
+ if (ExtractAddress(txout.scriptPubKey, 0, address))
{
strHTML += _("To: ");
if (wallet->mapAddressBook.count(address) && !wallet->mapAddressBook[address].empty())
diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp
index 50767d30fe..77c5a01260 100644
--- a/src/qt/transactionrecord.cpp
+++ b/src/qt/transactionrecord.cpp
@@ -138,7 +138,7 @@ QList TransactionRecord::decomposeTransaction(const CWallet *
// Sent to Bitcoin Address
sub.type = TransactionRecord::SendToAddress;
CBitcoinAddress address;
- if (ExtractAddress(txout.scriptPubKey, wallet, address))
+ if (ExtractAddress(txout.scriptPubKey, 0, address))
{
sub.address = address.ToString();
}
diff --git a/src/script.cpp b/src/script.cpp
index d1e747251b..f5ca87ced8 100644
--- a/src/script.cpp
+++ b/src/script.cpp
@@ -1122,31 +1122,38 @@ bool IsMine(const CKeyStore &keystore, const CScript& scriptPubKey)
return true;
}
-
-bool ExtractAddress(const CScript& scriptPubKey, const CKeyStore* keystore, CBitcoinAddress& addressRet)
+// requires either keystore==0, or a lock on keystore->cs_KeyStore
+bool static ExtractAddressInner(const CScript& scriptPubKey, const CKeyStore* keystore, CBitcoinAddress& addressRet)
{
vector > vSolution;
if (!Solver(scriptPubKey, vSolution))
return false;
- CRITICAL_BLOCK(keystore->cs_KeyStore)
+ BOOST_FOREACH(PAIRTYPE(opcodetype, valtype)& item, vSolution)
{
- BOOST_FOREACH(PAIRTYPE(opcodetype, valtype)& item, vSolution)
- {
- uint160 hash160;
- if (item.first == OP_PUBKEY)
- addressRet.SetPubKey(item.second);
- else if (item.first == OP_PUBKEYHASH)
- addressRet.SetHash160((uint160)item.second);
- //if (keystore == NULL || keystore->HaveKey(addressRet))
- return true;
- }
+ if (item.first == OP_PUBKEY)
+ addressRet.SetPubKey(item.second);
+ else if (item.first == OP_PUBKEYHASH)
+ addressRet.SetHash160((uint160)item.second);
+ if (keystore == NULL || keystore->HaveKey(addressRet))
+ return true;
}
return false;
}
+bool ExtractAddress(const CScript& scriptPubKey, const CKeyStore* keystore, CBitcoinAddress& addressRet)
+{
+ if (keystore)
+ CRITICAL_BLOCK(keystore->cs_KeyStore)
+ return ExtractAddressInner(scriptPubKey, keystore, addressRet);
+ else
+ return ExtractAddressInner(scriptPubKey, NULL, addressRet);
+ return false;
+}
+
+
bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, int nHashType)
{
vector > stack;
diff --git a/src/ui.cpp b/src/ui.cpp
index 7d06caaec4..c3c234439c 100644
--- a/src/ui.cpp
+++ b/src/ui.cpp
@@ -776,6 +776,7 @@ bool CMainFrame::InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex)
if (pwalletMain->IsMine(txout))
continue;
+ CBitcoinAddress address;
string strAddress;
if (!mapValue["to"].empty())
{
@@ -785,15 +786,14 @@ bool CMainFrame::InsertTransaction(const CWalletTx& wtx, bool fNew, int nIndex)
else
{
// Sent to Bitcoin Address
- CBitcoinAddress address;
- if (ExtractAddress(txout.scriptPubKey, pwalletMain, address))
+ if (ExtractAddress(txout.scriptPubKey, NULL, address))
strAddress = address.ToString();
}
string strDescription = _("To: ");
CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
- if (pwalletMain->mapAddressBook.count(strAddress) && !pwalletMain->mapAddressBook[strAddress].empty())
- strDescription += pwalletMain->mapAddressBook[strAddress] + " ";
+ if (pwalletMain->mapAddressBook.count(address) && !pwalletMain->mapAddressBook[address].empty())
+ strDescription += pwalletMain->mapAddressBook[address] + " ";
strDescription += strAddress;
if (!mapValue["message"].empty())
{
diff --git a/src/wallet.cpp b/src/wallet.cpp
index 1baf575a59..fcd49e66b9 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -437,7 +437,7 @@ void CWalletTx::GetAmounts(int64& nGeneratedImmature, int64& nGeneratedMature, l
{
CBitcoinAddress address;
vector vchPubKey;
- if (!ExtractAddress(txout.scriptPubKey, pwallet, address))
+ if (!ExtractAddress(txout.scriptPubKey, NULL, address))
{
printf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n",
this->GetHash().ToString().c_str());